@@ -90,15 +90,13 @@ module burst_manager
9090 arb_data_t postarb_data;
9191 logic postarb_valid, postarb_ready;
9292 logic [NumOutLog2- 1 : 0 ] postarb_idx;
93- logic [NumOut- 1 : 0 ] ready_mask;
94- logic [NumOut- 1 : 0 ] valid_mask;
93+ logic [NumOut- 1 : 0 ] ready_mask;
94+ logic [NumOut- 1 : 0 ] valid_mask;
9595
9696 always_comb begin
9797 prearb_data = '0 ;
9898 prearb_valid = '0 ;
9999 valid_mask = req_valid_i;
100- ready_mask = '0 ;
101-
102100 for (int unsigned i = 0 ; i < NumOut; i++ ) begin
103101 if (req_valid_i[i] && req_burst_i[i].isburst) begin
104102 prearb_data[i].ini_addr = req_ini_addr_i[i];
@@ -109,10 +107,6 @@ module burst_manager
109107 prearb_data[i].burst = req_burst_i[i];
110108 prearb_valid[i] = 1'b1 ;
111109 valid_mask[i] = 1'b0 ;
112- // Mark retired burst requests
113- if (prearb_ready[i]) begin
114- ready_mask[i] = 1'b1 ;
115- end
116110 end
117111 end
118112 end
@@ -165,7 +159,7 @@ module burst_manager
165159 // Fall though FIFO to store bursts
166160 fifo_v3 # (
167161 .FALL_THROUGH ( 1'b1 ),
168- .DEPTH ( NumOut ),
162+ .DEPTH ( NumOut ),
169163 .dtype ( fifo_data_t )
170164 ) i_fall_though_fifo (
171165 .clk_i ( clk_i ),
@@ -206,9 +200,6 @@ module burst_manager
206200 `FF (burst_mask_q, burst_mask_d, '0 , clk_i, rst_ni);
207201 `FF (group_mask_q, group_mask_d, '0 , clk_i, rst_ni);
208202
209- // Block burstlen ports after the port receiving a burst
210- assign req_ready_o = ready_mask | (req_ready_i & ~ burst_mask_q);
211-
212203 always_comb begin : request_generator
213204
214205 // FSM defaults
@@ -227,16 +218,21 @@ module burst_manager
227218 req_ini_addr_o = req_ini_addr_i;
228219 req_wen_o = req_wen_i;
229220 req_be_o = req_be_i;
221+
230222 // Let valid requests not in burst pass
231- req_valid_o = valid_mask;
223+ req_valid_o = valid_mask & ~ burst_mask_q;
224+ // Send ready for valid request not in burst and for retired bursts
225+ ready_mask = prearb_valid & prearb_ready;
226+ req_ready_o = ((req_ready_i & valid_mask) & ~ burst_mask_q) | ready_mask;
232227
233228 case (state_q)
234229
235230 // Idle state, ready to take in burst request
236231 Idle: begin
237232
238- // Clear mask (unlock banks)
239233 burst_mask_d = '0 ;
234+
235+ // Start pending burst
240236 if (~ fifo_empty) begin
241237 // there is pending burst request
242238 // start to handling the burst, mark as not ready
@@ -257,6 +253,7 @@ module burst_manager
257253
258254 // Check if there is pending responses among the affected banks
259255 pending_rsp = | ((resp_valid_o & ~ resp_ready_i) & burst_mask_q);
256+
260257 // If no pending response and all the affected banks are ready send a new request
261258 if (& (req_ready_i | (~ burst_mask_q)) && ! pending_rsp) begin
262259 for (int unsigned i = 0 ; i < NumOut; i++ ) begin
@@ -271,6 +268,8 @@ module burst_manager
271268 req_valid_o[i] = 1'b1 ;
272269 end
273270 end
271+ // Clear mask (unlock banks)
272+ burst_mask_d = '0 ;
274273 // Switch state
275274 state_d = Idle;
276275 end
0 commit comments