Skip to content

Commit df225c8

Browse files
committed
Fix: AXI4 misrouted read completion if ALEN>0 was interleaved because
round robin was always active Change: Align and clean rd and wr slave switch codes
1 parent 361a4a0 commit df225c8

File tree

3 files changed

+138
-358
lines changed

3 files changed

+138
-358
lines changed

rtl/axicb_slv_switch_rd.sv

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,12 @@ module axicb_slv_switch_rd
8383
logic [8 -1:0] a_len;
8484

8585
logic rch_en;
86-
logic rch_en_r;
8786
logic rfirst;
8887
logic rch_mr;
8988
logic [AXI_ID_W -1:0] rch_id;
9089
logic [8 -1:0] rch_len;
9190
logic [SLV_NB -1:0] rch_grant;
9291
logic [8 -1:0] rlen;
93-
logic rch_running;
9492
logic rch_full;
9593
logic c_end;
9694

@@ -144,15 +142,15 @@ module axicb_slv_switch_rd
144142

145143
endgenerate
146144

147-
assign o_arvalid[0] = (slv_ar_targeted[0]) ? i_arvalid : 1'b0;
148-
assign o_arvalid[1] = (slv_ar_targeted[1]) ? i_arvalid : 1'b0;
149-
assign o_arvalid[2] = (slv_ar_targeted[2]) ? i_arvalid : 1'b0;
150-
assign o_arvalid[3] = (slv_ar_targeted[3]) ? i_arvalid : 1'b0;
145+
assign o_arvalid[0] = (slv_ar_targeted[0]) ? i_arvalid & !rch_full : 1'b0;
146+
assign o_arvalid[1] = (slv_ar_targeted[1]) ? i_arvalid & !rch_full : 1'b0;
147+
assign o_arvalid[2] = (slv_ar_targeted[2]) ? i_arvalid & !rch_full : 1'b0;
148+
assign o_arvalid[3] = (slv_ar_targeted[3]) ? i_arvalid & !rch_full : 1'b0;
151149

152-
assign i_arready = (slv_ar_targeted[0]) ? o_arready[0]:
153-
(slv_ar_targeted[1]) ? o_arready[1]:
154-
(slv_ar_targeted[2]) ? o_arready[2]:
155-
(slv_ar_targeted[3]) ? o_arready[3]:
150+
assign i_arready = (slv_ar_targeted[0]) ? o_arready[0] & !rch_full:
151+
(slv_ar_targeted[1]) ? o_arready[1] & !rch_full:
152+
(slv_ar_targeted[2]) ? o_arready[2] & !rch_full:
153+
(slv_ar_targeted[3]) ? o_arready[3] & !rch_full:
156154
ar_misrouting;
157155

158156
assign o_arch = i_arch;
@@ -188,7 +186,7 @@ module axicb_slv_switch_rd
188186
endgenerate
189187

190188
// OoO ID Management
191-
axicb_slv_ooo
189+
axicb_slv_ooo
192190
#(
193191
.RD_PATH (1),
194192
.AXI_ID_W (AXI_ID_W),
@@ -197,7 +195,7 @@ module axicb_slv_switch_rd
197195
.MST_ID_MASK (MST_ID_MASK),
198196
.CCH_W (RCH_W)
199197
)
200-
rresp_ooo
198+
rresp_ooo
201199
(
202200
.aclk (aclk),
203201
.aresetn (aresetn),
@@ -223,7 +221,7 @@ module axicb_slv_switch_rd
223221

224222
assign c_end = i_rvalid & i_rready & i_rlast;
225223

226-
// Follow-up rcompletion len for mis-routed traffic
224+
// Follow-up rcompletion len for mis-routed traffic
227225
// which need to be recreated
228226
always @ (posedge aclk or negedge aresetn) begin
229227
if (!aresetn) begin
@@ -256,20 +254,10 @@ module axicb_slv_switch_rd
256254
end
257255
end
258256

259-
260-
always @ (posedge aclk or negedge aresetn) begin
261-
if (!aresetn) begin
262-
rch_en_r <= '0;
263-
end else if (srst) begin
264-
rch_en_r <= '0;
265-
end else begin
266-
if (rch_grant=='0) rch_en_r <= 1'b1;
267-
else rch_en_r <= 1'b0;
268-
end
269-
end
270-
257+
// Activates the arbiter in OoO module on first read completion dataphase
258+
assign rch_en = rfirst;
271259

272-
assign rch_en = rfirst | rch_en_r;
260+
// Switching logic for RRESP channel
273261

274262
assign i_rvalid = (rch_mr) ? 1'b1 :
275263
(rch_grant[0]) ? o_rvalid[0] :

rtl/axicb_slv_switch_wr.sv

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ module axicb_slv_switch_wr
283283
end
284284
end
285285

286+
// TODO: is it really usefull ? round-robin should pass anyway a
287+
// grant value if unmasked value > 0
286288
assign bch_en = bch_en_c | bch_en_r;
287289

288290
// Switching logic for BRESP channel
@@ -294,10 +296,10 @@ module axicb_slv_switch_wr
294296
(bch_grant[3]) ? o_bvalid[3] :
295297
1'b0;
296298

297-
assign o_bready[0] = bch_grant[0] & i_bready;
298-
assign o_bready[1] = bch_grant[1] & i_bready;
299-
assign o_bready[2] = bch_grant[2] & i_bready;
300-
assign o_bready[3] = bch_grant[3] & i_bready;
299+
assign o_bready[0] = bch_grant[0] & i_bready & !bch_mr;
300+
assign o_bready[1] = bch_grant[1] & i_bready & !bch_mr;
301+
assign o_bready[2] = bch_grant[2] & i_bready & !bch_mr;
302+
assign o_bready[3] = bch_grant[3] & i_bready & !bch_mr;
301303

302304
assign i_bch = (bch_mr) ? {2'h3, bch_id}:
303305
(bch_grant[0]) ? o_bch[0*BCH_W+:BCH_W] :

0 commit comments

Comments
 (0)