Skip to content

Commit 5eb236f

Browse files
committed
Made AXI lite master VC compliant
1 parent 2a0ae6e commit 5eb236f

File tree

4 files changed

+48
-12
lines changed

4 files changed

+48
-12
lines changed

vunit/vhdl/verification_components/run.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# Copyright (c) 2014-2019, Lars Asplund lars.anders.asplund@gmail.com
66

77
from os.path import join, dirname
8-
from vunit import VUnit
8+
from vunit import VUnit, ComplianceTest
99
from itertools import product
1010

1111
root = dirname(__file__)
@@ -132,5 +132,11 @@ def gen_avalon_master_tests(obj, *args):
132132
name="max_waits=%d" % max_waits, generics=dict(max_waits=max_waits)
133133
)
134134

135+
test_lib = ui.add_library("test_lib")
136+
ComplianceTest(lib, "axi_lite_master", "bus_master_pkg").add_vhdl_testbench(
137+
test_lib, join(root, "compliance_test")
138+
)
139+
140+
ui.set_compile_option("rivierapro.vcom_flags", ["-dbg"])
135141

136142
ui.main()

vunit/vhdl/verification_components/src/axi_lite_master.vhd

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ entity axi_lite_master is
4949
end entity;
5050

5151
architecture a of axi_lite_master is
52-
constant reply_queue, message_queue : queue_t := new_queue;
52+
constant reply_queue, message_queue, transaction_token_queue : queue_t := new_queue;
5353
begin
5454
main : process
5555
variable request_msg : msg_t;
@@ -58,13 +58,18 @@ begin
5858
receive(net, bus_handle.p_actor, request_msg);
5959
msg_type := message_type(request_msg);
6060

61+
handle_wait_for_time(net, msg_type, request_msg);
62+
6163
if is_read(msg_type) or is_write(msg_type) then
6264
push(message_queue, request_msg);
65+
push(transaction_token_queue, true);
6366
elsif msg_type = wait_until_idle_msg then
64-
wait until ((bvalid and bready) = '1' or (rvalid and rready) = '1') and is_empty(message_queue) and rising_edge(aclk);
67+
if not is_empty(transaction_token_queue) then
68+
wait until rising_edge(aclk) and is_empty(transaction_token_queue);
69+
end if;
6570
handle_wait_until_idle(net, msg_type, request_msg);
66-
else
67-
unexpected_msg_type(msg_type);
71+
elsif bus_handle.p_fail_on_unexpected_msg_type then
72+
unexpected_msg_type(msg_type, bus_handle.p_logger);
6873
end if;
6974
end process;
7075

@@ -74,6 +79,7 @@ begin
7479
variable msg_type : msg_type_t;
7580
variable w_done, aw_done : boolean;
7681
variable expected_resp : axi_resp_t;
82+
variable transaction_token : boolean;
7783
begin
7884
wait until rising_edge(aclk) and not is_empty(message_queue);
7985

@@ -93,6 +99,7 @@ begin
9399
wait until (rvalid and rready) = '1' and rising_edge(aclk);
94100
rready <= '0';
95101
check_axi_resp(bus_handle, rresp, expected_resp, "rresp");
102+
transaction_token := pop(transaction_token_queue);
96103

97104
if is_visible(bus_handle.p_logger, debug) then
98105
debug(bus_handle.p_logger,
@@ -130,6 +137,7 @@ begin
130137
wait until (bvalid and bready) = '1' and rising_edge(aclk);
131138
bready <= '0';
132139
check_axi_resp(bus_handle, bresp, expected_resp, "bresp");
140+
transaction_token := pop(transaction_token_queue);
133141

134142
if is_visible(bus_handle.p_logger, debug) then
135143
debug(bus_handle.p_logger,

vunit/vhdl/verification_components/src/bus_master_pkg-body.vhd

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,36 @@ use work.check_pkg.all;
1515

1616
package body bus_master_pkg is
1717

18-
impure function new_bus(data_length : natural;
19-
address_length : natural;
18+
impure function new_bus(data_length : natural := 32;
19+
address_length : natural := 32;
2020
byte_length : natural := 8;
2121
logger : logger_t := bus_logger;
22-
actor : actor_t := null_actor) return bus_master_t is
22+
actor : actor_t := null_actor;
23+
checker : checker_t := null_checker;
24+
fail_on_unexpected_msg_type : boolean := true) return bus_master_t is
2325
variable p_actor : actor_t;
26+
variable p_checker : checker_t;
2427
begin
2528
p_actor := actor when actor /= null_actor else new_actor;
2629

30+
if checker = null_checker then
31+
if logger = bus_logger then
32+
p_checker := bus_checker;
33+
else
34+
p_checker := new_checker(logger);
35+
end if;
36+
else
37+
p_checker := checker;
38+
end if;
39+
2740
return (p_actor => p_actor,
2841
p_data_length => data_length,
2942
p_address_length => address_length,
3043
p_byte_length => byte_length,
31-
p_logger => logger);
44+
p_logger => logger,
45+
p_checker => p_checker,
46+
p_fail_on_unexpected_msg_type => fail_on_unexpected_msg_type);
47+
3248
end;
3349

3450
function get_logger(bus_handle : bus_master_t) return logger_t is

vunit/vhdl/verification_components/src/bus_master_pkg.vhd

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ library ieee;
1010
use ieee.std_logic_1164.all;
1111

1212
use work.logger_pkg.all;
13+
use work.checker_pkg.all;
1314
context work.com_context;
1415
use work.sync_pkg.all;
1516
use work.queue_pkg.all;
@@ -24,20 +25,25 @@ package bus_master_pkg is
2425
p_address_length : natural;
2526
p_byte_length : natural;
2627
p_logger : logger_t;
28+
p_checker : checker_t;
29+
p_fail_on_unexpected_msg_type : boolean;
2730
end record;
2831

2932
-- Reference to non-blocking bus command
3033
alias bus_reference_t is msg_t;
3134

3235
-- Default logger object for bus master instances
3336
constant bus_logger : logger_t := get_logger("vunit_lib:bus_master_pkg");
37+
constant bus_checker : checker_t := new_checker(bus_logger);
3438

3539
-- Create new handle for bus master VC
36-
impure function new_bus(data_length : natural;
37-
address_length : natural;
40+
impure function new_bus(data_length : natural := 32;
41+
address_length : natural := 32;
3842
byte_length : natural := 8;
3943
logger : logger_t := bus_logger;
40-
actor : actor_t := null_actor) return bus_master_t;
44+
actor : actor_t := null_actor;
45+
checker : checker_t := null_checker;
46+
fail_on_unexpected_msg_type : boolean := true) return bus_master_t;
4147

4248
-- Return the logger used by the bus master
4349
function get_logger(bus_handle : bus_master_t) return logger_t;

0 commit comments

Comments
 (0)