Skip to content

Commit 7a48d5b

Browse files
micprogthommythomaso
authored andcommitted
fix tb_axi_sim_mem for 4kib boundary checking
1 parent f4319c3 commit 7a48d5b

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

test/tb_axi_sim_mem.sv

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,27 @@ module tb_axi_sim_mem #(
8585
drv.reset_master();
8686
wait (rst_n);
8787
// AW
88+
forever begin
8889
`ifdef XSIM
89-
// std::randomize(aw_beat) may behave differently to aw_beat.randomize() wrt. limited ranges
90-
// Keeping alternate implementation for XSIM only
91-
rand_success = std::randomize(aw_beat); assert (rand_success);
90+
// std::randomize(aw_beat) may behave differently to aw_beat.randomize() wrt. limited ranges
91+
// Keeping alternate implementation for XSIM only
92+
rand_success = std::randomize(aw_beat); assert (rand_success);
9293
`else
93-
rand_success = aw_beat.randomize(); assert (rand_success);
94+
rand_success = aw_beat.randomize(); assert (rand_success);
9495
`endif
95-
aw_beat.ax_addr >>= $clog2(StrbWidth); // align address with data width
96-
aw_beat.ax_addr <<= $clog2(StrbWidth);
97-
aw_beat.ax_len = $urandom();
98-
aw_beat.ax_size = $clog2(StrbWidth);
99-
aw_beat.ax_burst = axi_pkg::BURST_INCR;
96+
aw_beat.ax_addr >>= $clog2(StrbWidth); // align address with data width
97+
aw_beat.ax_addr <<= $clog2(StrbWidth);
98+
aw_beat.ax_len = $urandom();
99+
aw_beat.ax_size = $clog2(StrbWidth);
100+
aw_beat.ax_burst = axi_pkg::BURST_INCR;
101+
// Make sure that the burst does not cross a 4KiB boundary.
102+
if (axi_pkg::beat_addr(aw_beat.ax_addr, aw_beat.ax_size, aw_beat.ax_len, aw_beat.ax_burst, 0) >> 12 == (
103+
axi_pkg::beat_addr(aw_beat.ax_addr, aw_beat.ax_size, aw_beat.ax_len, aw_beat.ax_burst, aw_beat.ax_len)
104+
+ axi_pkg::beat_upper_byte(aw_beat.ax_addr, aw_beat.ax_size, aw_beat.ax_len, aw_beat.ax_burst, StrbWidth, aw_beat.ax_len)
105+
) >> 12) begin
106+
break;
107+
end
108+
end
100109
drv.send_aw(aw_beat);
101110
// W beats
102111
for (int unsigned i = 0; i <= aw_beat.ax_len; i++) begin
@@ -118,10 +127,19 @@ module tb_axi_sim_mem #(
118127
drv.recv_b(b_beat);
119128
assert(b_beat.b_resp == axi_pkg::RESP_OKAY);
120129
// AR
121-
ar_beat.ax_addr = aw_beat.ax_addr;
122-
ar_beat.ax_len = aw_beat.ax_len;
123-
ar_beat.ax_size = aw_beat.ax_size;
124-
ar_beat.ax_burst = aw_beat.ax_burst;
130+
forever begin
131+
ar_beat.ax_addr = aw_beat.ax_addr;
132+
ar_beat.ax_len = aw_beat.ax_len;
133+
ar_beat.ax_size = aw_beat.ax_size;
134+
ar_beat.ax_burst = aw_beat.ax_burst;
135+
// Make sure that the burst does not cross a 4KiB boundary.
136+
if (axi_pkg::beat_addr(ar_beat.ax_addr, ar_beat.ax_size, ar_beat.ax_len, ar_beat.ax_burst, 0) >> 12 == (
137+
axi_pkg::beat_addr(ar_beat.ax_addr, ar_beat.ax_size, ar_beat.ax_len, ar_beat.ax_burst, ar_beat.ax_len)
138+
+ axi_pkg::beat_upper_byte(ar_beat.ax_addr, ar_beat.ax_size, ar_beat.ax_len, ar_beat.ax_burst, StrbWidth, ar_beat.ax_len)
139+
) >> 12) begin
140+
break;
141+
end
142+
end
125143
drv.send_ar(ar_beat);
126144
// R beats
127145
for (int unsigned i = 0; i <= ar_beat.ax_len; i++) begin

0 commit comments

Comments
 (0)