@@ -22,10 +22,13 @@ module burst_manager
2222 // determines the width of the byte offset in a memory word. normally this can be left at the default vaule,
2323 // but sometimes it needs to be overridden (e.g. when meta-data is supplied to the memory via the wdata signal).
2424 parameter int unsigned ByteOffWidth = $clog2 (DataWidth- 1 )- 3 ,
25+ // Group Request Extension Grouping Factor for TCDM
26+ parameter int unsigned ReqGF = 1 ,
2527 // Group Response Extension Grouping Factor for TCDM
2628 parameter int unsigned RspGF = 1 ,
2729 // Dependant parameters. DO NOT CHANGE!
28- parameter int unsigned NumInLog2 = (NumIn == 1 ) ? 1 : $clog2 (NumIn),
30+ parameter int unsigned NumInLog2 = (NumIn > 32'd1 ) ? unsigned '($clog2 (NumIn)) : 32'd1 ,
31+ parameter int unsigned NumOutLog2 = (NumOut > 32'd1 ) ? unsigned '($clog2 (NumOut)) : 32'd1 ,
2932 // Burst response type can be overwritten for DataWidth > 32b
3033 // This can happen when the DataWidth includes transaction metadata
3134 parameter type burst_resp_t = burst_pkg :: burst_gresp_t
@@ -70,11 +73,50 @@ module burst_manager
7073 // Include FF module
7174 `include " common_cells/registers.svh"
7275
73- localparam int unsigned NumOutLog2 = (NumOut > 32'd1 ) ? unsigned '($clog2 (NumOut)) : 32'd1 ;
76+ /* **************
77+ * Burst WRITE *
78+ ***************/
79+
80+ localparam int unsigned NumGroupReq = ReqGF > 0 ? NumOut >> $clog2 (ReqGF) : NumOut;
81+ logic [NumOut- 1 : 0 ][NumInLog2- 1 : 0 ] req_ini_addr;
82+ logic [NumOut- 1 : 0 ][AddrWidth- 1 : 0 ] req_tgt_addr;
83+ logic [NumOut- 1 : 0 ][DataWidth- 1 : 0 ] req_wdata;
84+ logic [NumOut- 1 : 0 ] req_wen;
85+ logic [NumOut- 1 : 0 ][BeWidth- 1 : 0 ] req_be;
86+ burst_t [NumOut- 1 : 0 ] req_burst;
87+ logic [NumOut- 1 : 0 ] req_valid;
88+ logic [NumOut- 1 : 0 ] req_ready;
89+
90+ // Write request ungrouper
91+ always_comb begin
92+ req_ini_addr = req_ini_addr_i;
93+ req_tgt_addr = req_tgt_addr_i;
94+ req_wdata = req_wdata_i;
95+ req_wen = req_wen_i;
96+ req_be = req_be_i;
97+ req_burst = req_burst_i;
98+ req_valid = req_valid_i;
99+ // Redistribute grouped write requests
100+ for (int i = 0 ; i < NumGroupReq; i++ ) begin
101+ for (int j = 0 ; j < ReqGF; j++ ) begin
102+ if (req_burst[i* ReqGF].isburst && req_wen_i[i* ReqGF] && ReqGF > 1 ) begin
103+ req_ini_addr[i* ReqGF+ j] = req_ini_addr_i[i* ReqGF] + j;
104+ req_tgt_addr[i* ReqGF+ j] = req_tgt_addr_i[i* ReqGF] + j;
105+ req_wen[i* ReqGF+ j] = req_wen_i[i* ReqGF];
106+ req_be[i* ReqGF+ j] = req_be_i[i* ReqGF];
107+ req_burst[i* ReqGF+ j] = '0 ;
108+ req_valid[i* ReqGF+ j] = req_valid_i[i* ReqGF];
109+ if (j > 0 ) begin
110+ req_wdata[i* ReqGF+ j] = req_burst_i[i* ReqGF].gdata[j];
111+ end
112+ end
113+ end
114+ end
115+ end
74116
75- /* *****************
76- * Burst Identify *
77- ***************** * /
117+ /* *************
118+ * Burst READ *
119+ **************/
78120
79121 typedef struct packed {
80122 logic [NumInLog2- 1 : 0 ] ini_addr;
@@ -93,21 +135,20 @@ module burst_manager
93135 logic [NumOut- 1 : 0 ] ready_mask;
94136 logic [NumOut- 1 : 0 ] valid_mask;
95137
96-
97138 always_comb begin
98139 prearb_data = '0 ;
99140 prearb_valid = '0 ;
100- valid_mask = req_valid_i ;
141+ valid_mask = req_valid ;
101142 for (int unsigned i = 0 ; i < NumOut; i++ ) begin
102- if (req_valid_i [i] && req_burst_i [i].isburst) begin
103- prearb_data[i].ini_addr = req_ini_addr_i [i];
104- prearb_data[i].tgt_addr = req_tgt_addr_i [i];
105- prearb_data[i].wdata = req_wdata_i [i];
106- prearb_data[i].wen = req_wen_i [i];
107- prearb_data[i].ben = req_be_i [i];
108- prearb_data[i].burst = req_burst_i [i];
109- prearb_valid[i] = 1'b1 ;
110- valid_mask[i] = 1'b0 ;
143+ if (req_valid [i] && req_burst [i].isburst) begin
144+ prearb_data[i].ini_addr = req_ini_addr [i];
145+ prearb_data[i].tgt_addr = req_tgt_addr [i];
146+ prearb_data[i].wdata = req_wdata [i];
147+ prearb_data[i].wen = req_wen [i];
148+ prearb_data[i].ben = req_be [i];
149+ prearb_data[i].burst = req_burst [i];
150+ prearb_valid[i] = 1'b1 ;
151+ valid_mask[i] = 1'b0 ;
111152 end
112153 end
113154 end
@@ -116,11 +157,11 @@ module burst_manager
116157 assign ready_mask = prearb_valid & prearb_ready;
117158
118159 rr_arb_tree # (
119- .NumIn ( NumOut ),
120- .DataType ( arb_data_t ),
121- .ExtPrio ( 1'b0 ),
122- .AxiVldRdy ( 1'b1 ),
123- .LockIn ( 1'b1 )
160+ .NumIn ( NumOut ),
161+ .DataType ( arb_data_t ),
162+ .ExtPrio ( 1'b0 ),
163+ .AxiVldRdy ( 1'b1 ),
164+ .LockIn ( 1'b1 )
124165 ) i_rr_arb_tree (
125166 .clk_i ( clk_i ),
126167 .rst_ni ( rst_ni ),
@@ -217,11 +258,11 @@ module burst_manager
217258 fifo_pop = 1'b0 ;
218259
219260 // Bypass all requests by default
220- req_wdata_o = req_wdata_i ;
221- req_tgt_addr_o = req_tgt_addr_i ;
222- req_ini_addr_o = req_ini_addr_i ;
223- req_wen_o = req_wen_i ;
224- req_be_o = req_be_i ;
261+ req_wdata_o = req_wdata ;
262+ req_ini_addr_o = req_ini_addr ;
263+ req_tgt_addr_o = req_tgt_addr ;
264+ req_wen_o = req_wen ;
265+ req_be_o = req_be ;
225266
226267 case (state_q)
227268
@@ -273,9 +314,9 @@ module burst_manager
273314 endcase
274315 end
275316
276- /* *****************
277- * Rsp Handling *
278- ******************/
317+ /* **********************
318+ * Response Handling *
319+ ********************** * /
279320
280321 if (RspGF == 1 ) begin : gen_grouper_bypass
281322 // Bypass all responses if no grouping
@@ -288,7 +329,7 @@ module burst_manager
288329 end else begin : gen_grouper
289330
290331 // Number of groups we will check for grouping rsp
291- localparam int unsigned NumGroup = RspGF > 0 ? NumOut >> $clog2 (RspGF) : NumOut;
332+ localparam int unsigned NumGroupRsp = RspGF > 0 ? NumOut >> $clog2 (RspGF) : NumOut;
292333
293334 logic [NumOut- 1 : 0 ][NumInLog2- 1 : 0 ] grouped_resp_ini_addr;
294335 logic [NumOut- 1 : 0 ][DataWidth- 1 : 0 ] grouped_resp_rdata;
@@ -298,7 +339,7 @@ module burst_manager
298339
299340 always_comb begin
300341 // Latch the new ports requested in burst
301- for (int i = 0 ; i < NumGroup ; i ++ ) begin
342+ for (int i = 0 ; i < NumGroupRsp ; i ++ ) begin
302343 // If ready cancel the reservation
303344 if (resp_valid_o[i* RspGF] && resp_ready_i[i* RspGF]) begin
304345 group_mask_d[i* RspGF+ : RspGF] = '0 ;
@@ -314,7 +355,7 @@ module burst_manager
314355
315356 // Assign input data to grouped response
316357 always_comb begin
317- for (int i = 0 ; i < NumGroup ; i++ ) begin
358+ for (int i = 0 ; i < NumGroupRsp ; i++ ) begin
318359 grouped_resp_ini_addr[i* RspGF] = resp_ini_addr_i[i* RspGF];
319360 grouped_resp_rdata[i* RspGF] = resp_rdata_i[i* RspGF];
320361 grouped_resp_burst[i* RspGF].isburst = & resp_valid_i[i* RspGF+ : RspGF];
0 commit comments