Skip to content

Commit 9c0658f

Browse files
committed
Support for wait until idle command in Avalon Master
1 parent fbcb2bf commit 9c0658f

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

vunit/vhdl/verification_components/src/avalon_master.vhd

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ context work.com_context;
1717
use work.com_types_pkg.all;
1818
use work.logger_pkg.all;
1919
use work.check_pkg.all;
20+
use work.sync_pkg.all;
2021

2122
library osvvm;
2223
use osvvm.RandomPkg.all;
@@ -49,6 +50,7 @@ architecture a of avalon_master is
4950
constant acknowledge_queue : queue_t := new_queue;
5051
constant burst_acknowledge_queue : queue_t := new_queue;
5152
constant burstlen_queue : queue_t := new_queue;
53+
signal burst_read_flag : boolean := false;
5254
begin
5355

5456
main : process
@@ -125,6 +127,10 @@ begin
125127
burstcount(burstcount'range) <= (others => 'U');
126128
end loop;
127129

130+
elsif msg_type = wait_until_idle_msg then
131+
wait until not burst_read_flag and is_empty(burst_acknowledge_queue) and rising_edge(clk);
132+
handle_wait_until_idle(net, msg_type, request_msg);
133+
128134
else
129135
unexpected_msg_type(msg_type);
130136
end if;
@@ -160,6 +166,7 @@ begin
160166
variable burst : positive;
161167
begin
162168
wait until readdatavalid = '1' and not is_empty(burst_acknowledge_queue) and rising_edge(clk);
169+
burst_read_flag <= true;
163170
request_msg := pop(burst_acknowledge_queue);
164171
burst := pop(burstlen_queue);
165172
reply_msg := new_msg(sender => avmm_burst_rd_actor);
@@ -172,6 +179,7 @@ begin
172179
end loop;
173180
reply(net, request_msg, reply_msg);
174181
delete(request_msg);
182+
burst_read_flag <= false;
175183
end process;
176184

177185
end architecture;

vunit/vhdl/verification_components/test/tb_avalon_master.vhd

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ begin
103103
variable tmp : std_logic_vector(writedata'range);
104104
variable value : std_logic_vector(writedata'range) := (others => '1');
105105
variable burst_rd_ref : bus_reference_t;
106+
variable bus_rd_ref1 : bus_reference_t;
107+
variable bus_rd_ref2 : bus_reference_t;
106108
type bus_reference_arr_t is array (0 to tb_cfg.transfers-1) of bus_reference_t;
107109
variable rd_ref : bus_reference_arr_t;
108110
constant data_queue : queue_t := new_queue;
@@ -241,6 +243,41 @@ begin
241243
end loop;
242244
end loop;
243245

246+
elsif run("wait until idle") then
247+
wait_until_idle(net, bus_handle);
248+
write_bus(net, bus_handle, 0, value);
249+
value := std_logic_vector(to_unsigned(456, value'length));
250+
write_bus(net, bus_handle, 0, value);
251+
read_bus(net, bus_handle, 4, bus_rd_ref1);
252+
read_bus(net, bus_handle, 0, bus_rd_ref2);
253+
wait_until_idle(net, bus_handle);
254+
await_read_bus_reply(net, bus_rd_ref1, tmp);
255+
await_read_bus_reply(net, bus_rd_ref2, tmp);
256+
check_equal(tmp, value, "invalid data");
257+
wait_until_idle(net, bus_handle);
258+
write_bus(net, bus_handle, 0, value);
259+
wait_until_idle(net, bus_handle);
260+
261+
-- Wait till idle during bursts
262+
for i in 1 to tb_cfg.transfers loop
263+
push(data_queue, std_logic_vector(to_unsigned(i, writedata'length)));
264+
end loop;
265+
write_bus(net, bus_handle, 0, tb_cfg.transfers, data_queue);
266+
wait_until_idle(net, bus_handle);
267+
wait until rising_edge(clk);
268+
check_equal(write, '0', "unexpected write after wail till idle");
269+
270+
read_bus(net, bus_handle, 0, tb_cfg.transfers, data_queue);
271+
wait_until_idle(net, bus_handle);
272+
wait until rising_edge(clk);
273+
check_equal(readdatavalid, '0', "unexpected readdatavalid after wail till idle");
274+
275+
read_bus(net, bus_handle, 0, tb_cfg.transfers, burst_rd_ref);
276+
wait_until_idle(net, bus_handle);
277+
wait until rising_edge(clk);
278+
check_equal(readdatavalid, '0', "unexpected readdatavalid after wail till idle");
279+
await_read_bus_reply(net, bus_handle, data_queue, burst_rd_ref);
280+
wait_until_idle(net, bus_handle);
244281

245282
end if;
246283

0 commit comments

Comments
 (0)