Skip to content

Commit 0c7dfc1

Browse files
committed
WIP: Made AXI read slave VC compliant
1 parent b03acd1 commit 0c7dfc1

File tree

4 files changed

+136
-6
lines changed

4 files changed

+136
-6
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
-- Read the TODOs to complete this template.
2+
3+
library ieee;
4+
library vunit_lib;
5+
context vunit_lib.com_context;
6+
context vunit_lib.vc_context;
7+
context vunit_lib.vunit_context;
8+
use ieee.numeric_std.all;
9+
use ieee.std_logic_1164.all;
10+
use vunit_lib.axi_pkg.all;
11+
use vunit_lib.axi_slave_pkg.all;
12+
use vunit_lib.axi_slave_private_pkg.all;
13+
use vunit_lib.queue_pkg.all;
14+
use vunit_lib.sync_pkg.all;
15+
16+
entity tb_axi_read_slave_compliance is
17+
generic(
18+
runner_cfg : string);
19+
end entity;
20+
21+
architecture tb of tb_axi_read_slave_compliance is
22+
23+
-- TODO: Specify a value for all listed parameters. Keep all parameters on separate lines
24+
constant memory : memory_t := new_memory;
25+
constant axi_slave : axi_slave_t := new_axi_slave(
26+
memory => memory
27+
);
28+
29+
-- TODO: Constrain any unconstrained signal connecting to the DUT.
30+
constant log_data_size : integer := 4;
31+
constant data_size : integer := 2**log_data_size;
32+
33+
signal aclk : std_logic;
34+
signal arvalid : std_logic;
35+
signal arready : std_logic;
36+
signal arid : std_logic_vector(3 downto 0);
37+
signal araddr : std_logic_vector(31 downto 0);
38+
signal arlen : axi4_len_t;
39+
signal arsize : axi4_size_t;
40+
signal arburst : axi_burst_type_t;
41+
signal rvalid : std_logic;
42+
signal rready : std_logic;
43+
signal rid : std_logic_vector(arid'range);
44+
signal rdata : std_logic_vector(8*data_size-1 downto 0);
45+
signal rresp : axi_resp_t;
46+
signal rlast : std_logic;
47+
48+
begin
49+
-- DO NOT modify the test runner process.
50+
test_runner : process
51+
begin
52+
test_runner_setup(runner, runner_cfg);
53+
test_runner_cleanup(runner);
54+
end process test_runner;
55+
56+
-- DO NOT modify the VC instantiation.
57+
vc_inst: entity vunit_lib.axi_read_slave
58+
generic map(axi_slave)
59+
60+
port map(
61+
aclk => aclk,
62+
arvalid => arvalid,
63+
arready => arready,
64+
arid => arid,
65+
araddr => araddr,
66+
arlen => arlen,
67+
arsize => arsize,
68+
arburst => arburst,
69+
rvalid => rvalid,
70+
rready => rready,
71+
rid => rid,
72+
rdata => rdata,
73+
rresp => rresp,
74+
rlast => rlast
75+
);
76+
77+
end architecture;

vunit/vhdl/verification_components/run.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ def gen_avalon_master_tests(obj, *args):
136136
ComplianceTest(lib, "axi_lite_master", "bus_master_pkg").add_vhdl_testbench(
137137
test_lib, join(root, "compliance_test")
138138
)
139+
ComplianceTest(lib, "axi_read_slave", "axi_slave_pkg").add_vhdl_testbench(
140+
test_lib,
141+
join(root, "compliance_test"),
142+
join(root, ".vc", "tb_axi_read_slave_compliance_template.vhd"),
143+
)
139144

140145
ui.set_compile_option("rivierapro.vcom_flags", ["-dbg"])
141146

vunit/vhdl/verification_components/src/axi_slave_pkg.vhd

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ use ieee.std_logic_1164.all;
99

1010
use work.queue_pkg.all;
1111
use work.logger_pkg.all;
12+
use work.checker_pkg.all;
1213
use work.memory_pkg.all;
14+
use work.sync_pkg.all;
1315
context work.com_context;
1416
use work.axi_statistics_pkg.all;
1517

@@ -29,9 +31,12 @@ package axi_slave_pkg is
2931
p_actor : actor_t;
3032
p_memory : memory_t;
3133
p_logger : logger_t;
34+
p_checker : checker_t;
35+
p_fail_on_unexpected_msg_type : boolean;
3236
end record;
3337

3438
constant axi_slave_logger : logger_t := get_logger("vunit_lib:axi_slave_pkg");
39+
constant axi_slave_checker : checker_t := new_checker(axi_slave_logger);
3540
impure function new_axi_slave(memory : memory_t;
3641
address_fifo_depth : positive := 1;
3742
write_response_fifo_depth : positive := 1;
@@ -41,7 +46,12 @@ package axi_slave_pkg is
4146
write_response_stall_probability : probability_t := 0.0;
4247
min_response_latency : delay_length := 0 ns;
4348
max_response_latency : delay_length := 0 ns;
44-
logger : logger_t := axi_slave_logger) return axi_slave_t;
49+
logger : logger_t := axi_slave_logger;
50+
actor : actor_t := null_actor;
51+
checker : checker_t := null_checker;
52+
fail_on_unexpected_msg_type : boolean := true) return axi_slave_t;
53+
54+
impure function as_sync(axi_slave : axi_slave_t) return sync_handle_t;
4555

4656
-- Get the logger used by the axi_slave
4757
function get_logger(axi_slave : axi_slave_t) return logger_t;
@@ -145,9 +155,26 @@ package body axi_slave_pkg is
145155
write_response_stall_probability : probability_t := 0.0;
146156
min_response_latency : delay_length := 0 ns;
147157
max_response_latency : delay_length := 0 ns;
148-
logger : logger_t := axi_slave_logger) return axi_slave_t is
158+
logger : logger_t := axi_slave_logger;
159+
actor : actor_t := null_actor;
160+
checker : checker_t := null_checker;
161+
fail_on_unexpected_msg_type : boolean := true) return axi_slave_t is
162+
variable p_actor : actor_t;
163+
variable p_checker : checker_t;
149164
begin
150-
return (p_actor => new_actor,
165+
p_actor := actor when actor /= null_actor else new_actor;
166+
167+
if checker = null_checker then
168+
if logger = axi_slave_logger then
169+
p_checker := axi_slave_checker;
170+
else
171+
p_checker := new_checker(logger);
172+
end if;
173+
else
174+
p_checker := checker;
175+
end if;
176+
177+
return (p_actor => p_actor,
151178
p_initial_address_fifo_depth => address_fifo_depth,
152179
p_initial_write_response_fifo_depth => write_response_fifo_depth,
153180
p_initial_check_4kbyte_boundary => check_4kbyte_boundary,
@@ -157,7 +184,14 @@ package body axi_slave_pkg is
157184
p_initial_min_response_latency => min_response_latency,
158185
p_initial_max_response_latency => max_response_latency,
159186
p_memory => to_vc_interface(memory, logger),
160-
p_logger => logger);
187+
p_logger => logger,
188+
p_checker => p_checker,
189+
p_fail_on_unexpected_msg_type => fail_on_unexpected_msg_type);
190+
end;
191+
192+
impure function as_sync(axi_slave : axi_slave_t) return sync_handle_t is
193+
begin
194+
return axi_slave.p_actor;
161195
end;
162196

163197
function get_logger(axi_slave : axi_slave_t) return logger_t is

vunit/vhdl/verification_components/src/axi_slave_private_pkg.vhd

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ package axi_slave_private_pkg is
4747
max_id : natural;
4848
data : std_logic_vector);
4949
impure function get_actor return actor_t;
50+
impure function get_logger return logger_t;
51+
impure function fail_on_unexpected_msg_type return boolean;
5052

5153
procedure set_address_fifo_depth(depth : positive);
5254
procedure set_write_response_fifo_depth(depth : positive);
@@ -165,6 +167,16 @@ package body axi_slave_private_pkg is
165167
return p_axi_slave.p_actor;
166168
end;
167169

170+
impure function get_logger return logger_t is
171+
begin
172+
return p_axi_slave.p_logger;
173+
end;
174+
175+
impure function fail_on_unexpected_msg_type return boolean is
176+
begin
177+
return p_axi_slave.p_fail_on_unexpected_msg_type;
178+
end;
179+
168180
procedure set_address_fifo_depth(depth : positive) is
169181
begin
170182
if burst_queue_length > depth then
@@ -503,6 +515,8 @@ package body axi_slave_private_pkg is
503515
receive(net, self.get_actor, request_msg);
504516
msg_type := message_type(request_msg);
505517

518+
handle_sync_message(net, msg_type, request_msg);
519+
506520
if msg_type = axi_slave_set_address_fifo_depth_msg then
507521
self.set_address_fifo_depth(pop(request_msg));
508522
acknowledge(net, request_msg, true);
@@ -548,8 +562,8 @@ package body axi_slave_private_pkg is
548562
elsif msg_type = axi_slave_enable_well_behaved_check_msg then
549563
self.enable_well_behaved_check;
550564
acknowledge(net, request_msg, true);
551-
else
552-
unexpected_msg_type(msg_type);
565+
elsif self.fail_on_unexpected_msg_type then
566+
unexpected_msg_type(msg_type, self.get_logger);
553567
end if;
554568

555569
delete(request_msg);

0 commit comments

Comments
 (0)