@@ -85,18 +85,27 @@ module tb_axi_sim_mem #(
85
85
drv.reset_master ();
86
86
wait (rst_n);
87
87
// AW
88
+ forever begin
88
89
`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);
92
93
`else
93
- rand_success = aw_beat.randomize (); assert (rand_success);
94
+ rand_success = aw_beat.randomize (); assert (rand_success);
94
95
`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
100
109
drv.send_aw (aw_beat);
101
110
// W beats
102
111
for (int unsigned i = 0 ; i <= aw_beat.ax_len; i++ ) begin
@@ -118,10 +127,19 @@ module tb_axi_sim_mem #(
118
127
drv.recv_b (b_beat);
119
128
assert (b_beat.b_resp == axi_pkg :: RESP_OKAY );
120
129
// 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
125
143
drv.send_ar (ar_beat);
126
144
// R beats
127
145
for (int unsigned i = 0 ; i <= ar_beat.ax_len; i++ ) begin
0 commit comments