Skip to content

Commit e853c6a

Browse files
committed
WIP: Made AXI read slave VC compliant
1 parent e04c2b6 commit e853c6a

File tree

3 files changed

+63
-7
lines changed

3 files changed

+63
-7
lines changed

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+
"D:/github/vunit/vunit/vhdl/verification_components/src/.compliance_test_templates/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: 42 additions & 5 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,29 @@ 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_memory : memory_t;
163+
variable p_actor : actor_t;
164+
variable p_checker : checker_t;
149165
begin
150-
return (p_actor => new_actor,
166+
p_memory := memory when memory /= null_memory else to_vc_interface(new_memory, logger);
167+
168+
p_actor := actor when actor /= null_actor else new_actor;
169+
170+
if checker = null_checker then
171+
if logger = axi_slave_logger then
172+
p_checker := axi_slave_checker;
173+
else
174+
p_checker := new_checker(logger);
175+
end if;
176+
else
177+
p_checker := checker;
178+
end if;
179+
180+
return (p_actor => p_actor,
151181
p_initial_address_fifo_depth => address_fifo_depth,
152182
p_initial_write_response_fifo_depth => write_response_fifo_depth,
153183
p_initial_check_4kbyte_boundary => check_4kbyte_boundary,
@@ -156,8 +186,15 @@ package body axi_slave_pkg is
156186
p_initial_write_response_stall_probability => write_response_stall_probability,
157187
p_initial_min_response_latency => min_response_latency,
158188
p_initial_max_response_latency => max_response_latency,
159-
p_memory => to_vc_interface(memory, logger),
160-
p_logger => logger);
189+
p_memory => p_memory,
190+
p_logger => logger,
191+
p_checker => p_checker,
192+
p_fail_on_unexpected_msg_type => fail_on_unexpected_msg_type);
193+
end;
194+
195+
impure function as_sync(axi_slave : axi_slave_t) return sync_handle_t is
196+
begin
197+
return axi_slave.p_actor;
161198
end;
162199

163200
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)