1 # this file has been generated by sv2nmigen
3 from nmigen
import Signal
, Module
, Const
, Cat
, Elaboratable
6 class axi_rab_cfg(Elaboratable
):
9 self
.Clk_CI
= Signal() # input
10 self
.Rst_RBI
= Signal() # input
11 self
.s_axi_awaddr
= Signal(AXI_ADDR_WIDTH
) # input
12 self
.s_axi_awvalid
= Signal() # input
13 self
.s_axi_awready
= Signal() # output
14 self
.s_axi_wdata
= Signal() # input
15 self
.s_axi_wstrb
= Signal(1+ERROR p_expression_25
) # input
16 self
.s_axi_wvalid
= Signal() # input
17 self
.s_axi_wready
= Signal() # output
18 self
.s_axi_bresp
= Signal(2) # output
19 self
.s_axi_bvalid
= Signal() # output
20 self
.s_axi_bready
= Signal() # input
21 self
.s_axi_araddr
= Signal(AXI_ADDR_WIDTH
) # input
22 self
.s_axi_arvalid
= Signal() # input
23 self
.s_axi_arready
= Signal() # output
24 self
.s_axi_rdata
= Signal(AXI_DATA_WIDTH
) # output
25 self
.s_axi_rresp
= Signal(2) # output
26 self
.s_axi_rvalid
= Signal() # output
27 self
.s_axi_rready
= Signal() # input
28 self
.L1Cfg_DO
= Signal() # output
29 self
.L1AllowMultiHit_SO
= Signal() # output
30 self
.MissAddr_DI
= Signal(ADDR_WIDTH_VIRT
) # input
31 self
.MissMeta_DI
= Signal(MISS_META_WIDTH
) # input
32 self
.Miss_SI
= Signal() # input
33 self
.MhFifoFull_SO
= Signal() # output
34 self
.wdata_l2
= Signal() # output
35 self
.waddr_l2
= Signal() # output
36 self
.wren_l2
= Signal(N_PORTS
) # output
38 def elaborate(self
, platform
=None):
43 # // Copyright 2018 ETH Zurich and University of Bologna.
44 # // Copyright and related rights are licensed under the Solderpad Hardware
45 # // License, Version 0.51 (the "License"); you may not use this file except in
46 # // compliance with the License. You may obtain a copy of the License at
47 # // http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law
48 # // or agreed to in writing, software, hardware and materials distributed under
49 # // this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
50 # // CONDITIONS OF ANY KIND, either express or implied. See the License for the
51 # // specific language governing permissions and limitations under the License.
53 # // --=========================================================================--
55 # // █████╗ ██╗ ██╗██╗ ██████╗ █████╗ ██████╗ ██████╗███████╗ ██████╗
56 # // ██╔══██╗╚██╗██╔╝██║ ██╔══██╗██╔══██╗██╔══██╗ ██╔════╝██╔════╝██╔════╝
57 # // ███████║ ╚███╔╝ ██║ ██████╔╝███████║██████╔╝ ██║ █████╗ ██║ ███╗
58 # // ██╔══██║ ██╔██╗ ██║ ██╔══██╗██╔══██║██╔══██╗ ██║ ██╔══╝ ██║ ██║
59 # // ██║ ██║██╔╝ ██╗██║ ██║ ██║██║ ██║██████╔╝ ╚██████╗██║ ╚██████╔╝
60 # // ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═════╝╚═╝ ╚═════╝
63 # // Author: Pirmin Vogel - vogelpi@iis.ee.ethz.ch
65 # // Purpose : AXI4-Lite configuration and miss handling interface for RAB
67 # // --=========================================================================--
69 # //import CfMath::log2;
73 # parameter N_PORTS = 3,
74 # parameter N_REGS = 196,
75 # parameter N_L2_SETS = 32,
76 # parameter N_L2_SET_ENTRIES= 32,
77 # parameter ADDR_WIDTH_PHYS = 40,
78 # parameter ADDR_WIDTH_VIRT = 32,
79 # parameter N_FLAGS = 4,
80 # parameter AXI_DATA_WIDTH = 64,
81 # parameter AXI_ADDR_WIDTH = 32,
82 # parameter MISS_META_WIDTH = 10, // <= FIFO_WIDTH
83 # parameter MH_FIFO_DEPTH = 16
87 # input logic Rst_RBI,
89 # // AXI Lite interface
90 # input logic [AXI_ADDR_WIDTH-1:0] s_axi_awaddr,
91 # input logic s_axi_awvalid,
92 # output logic s_axi_awready,
93 # input logic [AXI_DATA_WIDTH/8-1:0][7:0] s_axi_wdata,
94 # input logic [AXI_DATA_WIDTH/8-1:0] s_axi_wstrb,
95 # input logic s_axi_wvalid,
96 # output logic s_axi_wready,
97 # output logic [1:0] s_axi_bresp,
98 # output logic s_axi_bvalid,
99 # input logic s_axi_bready,
100 # input logic [AXI_ADDR_WIDTH-1:0] s_axi_araddr,
101 # input logic s_axi_arvalid,
102 # output logic s_axi_arready,
103 # output logic [AXI_DATA_WIDTH-1:0] s_axi_rdata,
104 # output logic [1:0] s_axi_rresp,
105 # output logic s_axi_rvalid,
106 # input logic s_axi_rready,
108 # // Slice configuration
109 # output logic [N_REGS-1:0][63:0] L1Cfg_DO,
110 # output logic L1AllowMultiHit_SO,
113 # input logic [ADDR_WIDTH_VIRT-1:0] MissAddr_DI,
114 # input logic [MISS_META_WIDTH-1:0] MissMeta_DI,
115 # input logic Miss_SI,
116 # output logic MhFifoFull_SO,
119 # output logic [N_PORTS-1:0] [AXI_DATA_WIDTH-1:0] wdata_l2,
120 # output logic [N_PORTS-1:0] [AXI_ADDR_WIDTH-1:0] waddr_l2,
121 # output logic [N_PORTS-1:0] wren_l2
126 localparam ADDR_LSB = log2(64/8); // 64 even if the AXI Lite interface is 32,
127 // because RAB slices are 64 bit wide.
128 localparam ADDR_MSB = log2(N_REGS)+ADDR_LSB-1;
130 localparam L2SINGLE_AMAP_SIZE = 16'h4000; // Maximum 2048 TLB entries in L2
132 localparam integer N_L2_ENTRIES = N_L2_SETS * N_L2_SET_ENTRIES;
134 localparam logic [AXI_ADDR_WIDTH-1:0] L2_VA_MAX_ADDR = (N_L2_ENTRIES-1) << 2;
136 logic [AXI_DATA_WIDTH/8-1:0][7:0] L1Cfg_DP[N_REGS]; // [Byte][Bit]
139 // █████╗ ██╗ ██╗██╗██╗ ██╗ ██╗ ██╗████████╗███████╗
140 // ██╔══██╗╚██╗██╔╝██║██║ ██║ ██║ ██║╚══██╔══╝██╔════╝
141 // ███████║ ╚███╔╝ ██║███████║█████╗██║ ██║ ██║ █████╗
142 // ██╔══██║ ██╔██╗ ██║╚════██║╚════╝██║ ██║ ██║ ██╔══╝
143 // ██║ ██║██╔╝ ██╗██║ ██║ ███████╗██║ ██║ ███████╗
144 // ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚══════╝
146 logic [AXI_ADDR_WIDTH-1:0] awaddr_reg;
147 logic awaddr_done_rise;
148 logic awaddr_done_reg;
149 logic awaddr_done_reg_dly;
151 logic [AXI_DATA_WIDTH/8-1:0][7:0] wdata_reg;
152 logic [AXI_DATA_WIDTH/8-1:0] wstrb_reg;
153 logic wdata_done_rise;
154 logic wdata_done_reg;
155 logic wdata_done_reg_dly;
157 logic wresp_done_reg;
158 logic wresp_running_reg;
160 logic [AXI_ADDR_WIDTH-1:0] araddr_reg;
161 logic araddr_done_reg;
163 logic [AXI_DATA_WIDTH-1:0] rdata_reg;
164 logic rresp_done_reg;
165 logic rresp_running_reg;
177 assign wren = ( wdata_done_rise & awaddr_done_reg ) | ( awaddr_done_rise & wdata_done_reg );
178 assign wdata_done_rise = wdata_done_reg & ~wdata_done_reg_dly;
179 assign awaddr_done_rise = awaddr_done_reg & ~awaddr_done_reg_dly;
182 always @(posedge Clk_CI or negedge Rst_RBI)
186 wdata_done_reg_dly <= 1'b0;
187 awaddr_done_reg_dly <= 1'b0;
191 wdata_done_reg_dly <= wdata_done_reg;
192 awaddr_done_reg_dly <= awaddr_done_reg;
197 always @(posedge Clk_CI or negedge Rst_RBI)
201 awaddr_done_reg <= 1'b0;
207 if (awready && s_axi_awvalid)
210 awaddr_done_reg <= 1'b1;
211 awaddr_reg <= s_axi_awaddr;
213 else if (awaddr_done_reg && wresp_done_reg)
216 awaddr_done_reg <= 1'b0;
222 always @(posedge Clk_CI or negedge Rst_RBI)
226 wdata_done_reg <= 1'b0;
233 if (wready && s_axi_wvalid)
236 wdata_done_reg <= 1'b1;
237 wdata_reg <= s_axi_wdata;
238 wstrb_reg <= s_axi_wstrb;
240 else if (wdata_done_reg && wresp_done_reg)
243 wdata_done_reg <= 1'b0;
249 always @(posedge Clk_CI or negedge Rst_RBI)
254 wresp_done_reg <= 1'b0;
255 wresp_running_reg <= 1'b0;
259 if (awaddr_done_reg && wdata_done_reg && !wresp_done_reg)
261 if (!wresp_running_reg)
264 wresp_running_reg <= 1'b1;
266 else if (s_axi_bready)
269 wresp_done_reg <= 1'b1;
270 wresp_running_reg <= 1'b0;
276 wresp_done_reg <= 1'b0;
277 wresp_running_reg <= 1'b0;
283 always @(posedge Clk_CI or negedge Rst_RBI)
287 araddr_done_reg <= 1'b0;
293 if (arready && s_axi_arvalid)
296 araddr_done_reg <= 1'b1;
297 araddr_reg <= s_axi_araddr;
299 else if (araddr_done_reg && rresp_done_reg)
302 araddr_done_reg <= 1'b0;
308 always @(posedge Clk_CI or negedge Rst_RBI)
312 rresp_done_reg <= 1'b0;
314 rresp_running_reg <= 1'b0;
318 if (araddr_done_reg && !rresp_done_reg)
320 if (!rresp_running_reg)
323 rresp_running_reg <= 1'b1;
325 else if (s_axi_rready)
328 rresp_done_reg <= 1'b1;
329 rresp_running_reg <= 1'b0;
335 rresp_done_reg <= 1'b0;
336 rresp_running_reg <= 1'b0;
341 // ██╗ ██╗ ██████╗███████╗ ██████╗ ██████╗ ███████╗ ██████╗
342 // ██║ ███║ ██╔════╝██╔════╝██╔════╝ ██╔══██╗██╔════╝██╔════╝
343 // ██║ ╚██║ ██║ █████╗ ██║ ███╗ ██████╔╝█████╗ ██║ ███╗
344 // ██║ ██║ ██║ ██╔══╝ ██║ ██║ ██╔══██╗██╔══╝ ██║ ██║
345 // ███████╗██║ ╚██████╗██║ ╚██████╔╝ ██║ ██║███████╗╚██████╔╝
346 // ╚══════╝╚═╝ ╚═════╝╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝
348 assign wren_l1 = wren && (awaddr_reg < L2SINGLE_AMAP_SIZE);
350 always @( posedge Clk_CI or negedge Rst_RBI )
352 var integer idx_reg, idx_byte;
353 if ( Rst_RBI == 1'b0 )
355 for ( idx_reg = 0; idx_reg < N_REGS; idx_reg++ )
356 L1Cfg_DP[idx_reg] <= '0;
360 if ( awaddr_reg[ADDR_LSB+1] == 1'b0 ) begin // VIRT_ADDR
361 for ( idx_byte = 0; idx_byte < AXI_DATA_WIDTH/8; idx_byte++ ) begin
362 if ( (idx_byte < ADDR_WIDTH_VIRT/8) ) begin
363 if ( wstrb_reg[idx_byte] ) begin
364 L1Cfg_DP[awaddr_reg[ADDR_MSB:ADDR_LSB]][idx_byte] <= wdata_reg[idx_byte];
367 else begin // Let synthesizer optimize away unused registers.
368 L1Cfg_DP[awaddr_reg[ADDR_MSB:ADDR_LSB]][idx_byte] <= '0;
372 else if ( awaddr_reg[ADDR_LSB+1:ADDR_LSB] == 2'b10 ) begin // PHYS_ADDR
373 for ( idx_byte = 0; idx_byte < AXI_DATA_WIDTH/8; idx_byte++ ) begin
374 if ( (idx_byte < ADDR_WIDTH_PHYS/8) ) begin
375 if ( wstrb_reg[idx_byte] ) begin
376 L1Cfg_DP[awaddr_reg[ADDR_MSB:ADDR_LSB]][idx_byte] <= wdata_reg[idx_byte];
379 else begin // Let synthesizer optimize away unused registers.
380 L1Cfg_DP[awaddr_reg[ADDR_MSB:ADDR_LSB]][idx_byte] <= '0;
384 else begin // ( awaddr_reg[ADDR_LSB+1:ADDR_LSB] == 2'b11 ) // FLAGS
385 for ( idx_byte = 0; idx_byte < AXI_DATA_WIDTH/8; idx_byte++ ) begin
386 if ( (idx_byte < 1) ) begin
387 if ( wstrb_reg[idx_byte] ) begin
388 L1Cfg_DP[awaddr_reg[ADDR_MSB:ADDR_LSB]][idx_byte] <= wdata_reg[idx_byte] & { {{8-N_FLAGS}{1'b0}}, {{N_FLAGS}{1'b1}} };
391 else begin // Let synthesizer optimize away unused registers.
392 L1Cfg_DP[awaddr_reg[ADDR_MSB:ADDR_LSB]][idx_byte] <= '0;
397 end // always @ ( posedge Clk_CI or negedge Rst_RBI )
400 // Mask unused bits -> Synthesizer should optimize away unused registers
401 for( j=0; j<N_REGS; j++ ) begin
402 if ( j[1] == 1'b0 ) // VIRT_ADDR
403 assign L1Cfg_DO[j] = { {{64-ADDR_WIDTH_VIRT}{1'b0}},{ADDR_WIDTH_VIRT{1'b1}} } & L1Cfg_DP[j];
404 else if ( j[1:0] == 2'b10 ) // PHYS_ADDR
405 assign L1Cfg_DO[j] = { {{64-ADDR_WIDTH_PHYS}{1'b0}},{ADDR_WIDTH_PHYS{1'b1}} } & L1Cfg_DP[j];
406 else // if ( j[1:0] == 2'b11 ) // FLAGS
407 assign L1Cfg_DO[j] = { {{64-N_FLAGS}{1'b0}},{N_FLAGS{1'b1}} } & L1Cfg_DP[j];
413 if ( araddr_reg[ADDR_LSB-1] == 1'b1 ) // read upper 32 bit, for debugging over 32-bit interface
414 rdata_reg = { {32'h00000000},{L1Cfg_DO[araddr_reg[ADDR_MSB:ADDR_LSB]][63:32]} };
416 rdata_reg = L1Cfg_DO[araddr_reg[ADDR_MSB:ADDR_LSB]];
419 assign s_axi_awready = awready;
420 assign s_axi_wready = wready;
422 assign s_axi_bresp = 2'b00;
423 assign s_axi_bvalid = bvalid;
425 assign s_axi_arready = arready;
426 assign s_axi_rresp = 2'b00;
427 assign s_axi_rvalid = rvalid;
429 // ██╗ ██████╗ ██████╗███████╗ ██████╗
430 // ██║ ╚════██╗ ██╔════╝██╔════╝██╔════╝
431 // ██║ █████╔╝ ██║ █████╗ ██║ ███╗
432 // ██║ ██╔═══╝ ██║ ██╔══╝ ██║ ██║
433 // ███████╗███████╗ ╚██████╗██║ ╚██████╔╝
434 // ╚══════╝╚══════╝ ╚═════╝╚═╝ ╚═════╝
436 logic [N_PORTS-1:0] l2_addr_is_in_va_rams;
437 logic [N_PORTS-1:0] upper_word_is_written;
438 logic [N_PORTS-1:0] lower_word_is_written;
440 for( j=0; j< N_PORTS; j++)
442 if (AXI_DATA_WIDTH == 64) begin
443 assign l2_addr_is_in_va_rams[j] = (awaddr_reg >= (j+1)*L2SINGLE_AMAP_SIZE) && (awaddr_reg[log2(L2SINGLE_AMAP_SIZE)-1:0] <= L2_VA_MAX_ADDR);
444 assign upper_word_is_written[j] = (wstrb_reg[7:4] != 4'b0000);
445 assign lower_word_is_written[j] = (wstrb_reg[3:0] != 4'b0000);
447 assign l2_addr_is_in_va_rams[j] = 1'b0;
448 assign upper_word_is_written[j] = 1'b0;
449 assign lower_word_is_written[j] = 1'b0;
452 always @( posedge Clk_CI or negedge Rst_RBI ) begin
453 var integer idx_byte, off_byte;
454 if ( Rst_RBI == 1'b0 )
461 if ( (awaddr_reg >= (j+1)*L2SINGLE_AMAP_SIZE) && (awaddr_reg < (j+2)*L2SINGLE_AMAP_SIZE) && (|wstrb_reg) )
463 if (AXI_DATA_WIDTH == 32) begin
464 for ( idx_byte = 0; idx_byte < AXI_DATA_WIDTH/8; idx_byte++ )
465 wdata_l2[j][idx_byte*8 +: 8] <= wdata_reg[idx_byte] & {8{wstrb_reg[idx_byte]}};
467 else if (AXI_DATA_WIDTH == 64) begin
468 if (lower_word_is_written[j] == 1'b1)
472 // always put the payload in the lower word and set upper word to 0
473 for ( idx_byte = 0; idx_byte < AXI_DATA_WIDTH/8/2; idx_byte++ )
474 wdata_l2[j][idx_byte*8 +: 8] <= wdata_reg[idx_byte+off_byte] & {8{wstrb_reg[idx_byte+off_byte]}};
475 wdata_l2[j][AXI_DATA_WIDTH-1:AXI_DATA_WIDTH/2] <= 'b0;
477 // pragma translate_off
479 $fatal(1, "Unsupported AXI_DATA_WIDTH!");
480 // pragma translate_on
484 end // always @ ( posedge Clk_CI or negedge Rst_RBI )
486 // Properly align the 32-bit word address when writing from 64-bit interface:
487 // Depending on the system, the incoming address is (non-)aligned to the 64-bit
488 // word when writing the upper 32-bit word.
490 waddr_l2[j] = (awaddr_reg -(j+1)*L2SINGLE_AMAP_SIZE)/4;
491 if (wren_l2[j]) begin
492 if (AXI_DATA_WIDTH == 64) begin
493 if (upper_word_is_written[j] == 1'b1) begin
494 // address must be non-aligned
495 waddr_l2[j][0] = 1'b1;
498 // pragma translate_off
499 else if (AXI_DATA_WIDTH != 32) begin
500 $fatal(1, "Unsupported AXI_DATA_WIDTH!");
502 // pragma translate_on
506 // Assert that only one 32-bit word is ever written at a time to VA RAMs on 64-bit data
508 // pragma translate_off
509 always_ff @ (posedge Clk_CI) begin
510 if (AXI_DATA_WIDTH == 64) begin
511 if (l2_addr_is_in_va_rams[j]) begin
512 if (upper_word_is_written[j]) begin
513 assert (!lower_word_is_written[j])
514 else $error("Unsupported write across two 32-bit words to VA RAMs!");
516 else if (lower_word_is_written[j]) begin
517 assert (!upper_word_is_written[j])
518 else $error("Unsupported write across two 32-bit words to VA RAMs!");
523 // pragma translate_on
525 end // for (j=0; j< N_PORTS; j++)
528 // ███╗ ███╗██╗ ██╗ ███████╗██╗███████╗ ██████╗ ███████╗
529 // ████╗ ████║██║ ██║ ██╔════╝██║██╔════╝██╔═══██╗██╔════╝
530 // ██╔████╔██║███████║ █████╗ ██║█████╗ ██║ ██║███████╗
531 // ██║╚██╔╝██║██╔══██║ ██╔══╝ ██║██╔══╝ ██║ ██║╚════██║
532 // ██║ ╚═╝ ██║██║ ██║ ██║ ██║██║ ╚██████╔╝███████║
533 // ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═════╝ ╚══════╝
535 logic [ADDR_WIDTH_VIRT-1:0] AddrFifoDin_D;
538 logic [ADDR_WIDTH_VIRT-1:0] AddrFifoDout_D;
539 logic AddrFifoFull_S;
540 logic AddrFifoEmpty_S;
541 logic AddrFifoEmpty_SB;
542 logic AddrFifoFull_SB;
544 logic [MISS_META_WIDTH-1:0] MetaFifoDin_D;
547 logic [MISS_META_WIDTH-1:0] MetaFifoDout_D;
548 logic MetaFifoFull_S;
549 logic MetaFifoEmpty_S;
550 logic MetaFifoEmpty_SB;
551 logic MetaFifoFull_SB;
553 logic FifosDisabled_S;
555 logic [1:0] ConfReg_DN;
556 logic [1:0] ConfReg_DP;
558 logic [AXI_DATA_WIDTH-1:0] wdata_reg_vec;
560 assign FifosDisabled_S = ConfReg_DP[0];
561 assign L1AllowMultiHit_SO = ConfReg_DP[1];
563 assign AddrFifoEmpty_S = ~AddrFifoEmpty_SB;
564 assign MetaFifoEmpty_S = ~MetaFifoEmpty_SB;
566 assign AddrFifoFull_S = ~AddrFifoFull_SB;
567 assign MetaFifoFull_S = ~MetaFifoFull_SB;
569 assign MhFifoFull_SO = (AddrFifoWen_S & AddrFifoFull_S) | (MetaFifoWen_S & MetaFifoFull_S);
572 for ( j=0; j<AXI_DATA_WIDTH/8; j++ )
573 assign wdata_reg_vec[(j+1)*8-1:j*8] = wdata_reg[j];
576 // write address FIFO
579 AddrFifoWen_S = 1'b0;
581 if ( (Miss_SI == 1'b1) && (FifosDisabled_S == 1'b0) ) // register a new miss
583 AddrFifoWen_S = 1'b1;
584 AddrFifoDin_D = MissAddr_DI;
586 else if ( (wren_l1 == 1'b1) && (awaddr_reg[ADDR_MSB:0] == 'b0) && (FifosDisabled_S == 1'b0)) // write request from AXI interface
588 AddrFifoWen_S = 1'b1;
589 AddrFifoDin_D = wdata_reg_vec[ADDR_WIDTH_VIRT-1:0];
596 MetaFifoWen_S = 1'b0;
598 if ( (Miss_SI == 1'b1) && (FifosDisabled_S == 1'b0) ) // register a new miss
600 MetaFifoWen_S = 1'b1;
601 MetaFifoDin_D[MISS_META_WIDTH-1:0] = MissMeta_DI;
603 else if ( (wren_l1 == 1'b1) && (awaddr_reg[ADDR_MSB:0] == 4'h8) && (FifosDisabled_S == 1'b0) ) // write request from AXI interface
605 MetaFifoWen_S = 1'b1;
606 MetaFifoDin_D = wdata_reg_vec[MISS_META_WIDTH-1:0];
610 // write configuration register
615 if ( (wren_l1 == 1'b1) && (awaddr_reg[ADDR_MSB:0] == 8'h10) ) // write request from AXI interface
618 ConfReg_DN = wdata_reg_vec[$high(ConfReg_DN):0];
625 s_axi_rdata = rdata_reg; // read L1 config
626 AddrFifoRen_S = 1'b0;
627 MetaFifoRen_S = 1'b0;
628 if ( rvalid == 1'b1 )
631 if ( araddr_reg[ADDR_MSB:0] == 'b0 )
633 s_axi_rdata = {AXI_DATA_WIDTH{1'b0}};
634 s_axi_rdata[ADDR_WIDTH_VIRT-1:0] = AddrFifoDout_D;
635 if ( AddrFifoEmpty_S == 1'b0 )
636 AddrFifoRen_S = 1'b1;
639 else if ( araddr_reg[ADDR_MSB:0] == 4'h8 )
641 s_axi_rdata = {AXI_DATA_WIDTH{1'b0}};
642 s_axi_rdata[31] = MetaFifoEmpty_S;
643 s_axi_rdata[MISS_META_WIDTH-1:0] = MetaFifoDout_D;
644 if ( MetaFifoEmpty_S == 1'b0 )
645 MetaFifoRen_S = 1'b1;
647 // read configuration register
648 else if ( araddr_reg[ADDR_MSB:0] == 8'h10 )
650 s_axi_rdata = {AXI_DATA_WIDTH{1'b0}};
651 s_axi_rdata[$high(ConfReg_DP):0] = ConfReg_DP;
653 end // if ( rvalid == 1'b1 )
654 end // always_comb begin
656 // configuration register
657 always_ff @(posedge Clk_CI or negedge Rst_RBI) begin
662 else if (ConfRegWen_S == 1'b1)
664 ConfReg_DP <= ConfReg_DN;
670 .DATA_WIDTH ( ADDR_WIDTH_VIRT ),
671 .DATA_DEPTH ( MH_FIFO_DEPTH )
677 .data_i ( AddrFifoDin_D ),
678 .valid_i ( AddrFifoWen_S & AddrFifoFull_SB ),
679 .grant_o ( AddrFifoFull_SB ),
680 .data_o ( AddrFifoDout_D ),
681 .valid_o ( AddrFifoEmpty_SB ),
682 .grant_i ( AddrFifoRen_S ),
683 .test_mode_i ( 1'b0 )
688 .DATA_WIDTH ( MISS_META_WIDTH ),
689 .DATA_DEPTH ( MH_FIFO_DEPTH )
695 .data_i ( MetaFifoDin_D ),
696 .valid_i ( MetaFifoWen_S & MetaFifoFull_SB ),
697 .grant_o ( MetaFifoFull_SB ),
698 .data_o ( MetaFifoDout_D ),
699 .valid_o ( MetaFifoEmpty_SB ),
700 .grant_i ( MetaFifoRen_S ),
701 .test_mode_i ( 1'b0 )