Skip to content

Commit 1837b50

Browse files
committed
Fix handshake in burst manager
1 parent f4708a6 commit 1837b50

File tree

1 file changed

+13
-14
lines changed

1 file changed

+13
-14
lines changed

rtl/variable_latency_interconnect/burst_manager.sv

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)