Skip to content

Commit b375b73

Browse files
committed
Added getters.
1 parent 4413f78 commit b375b73

6 files changed

Lines changed: 118 additions & 16 deletions

File tree

vunit/vhdl/verification_components/src/axi_stream_master.vhd

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use work.axi_stream_pkg.all;
1414
use work.axi_stream_private_pkg.all;
1515
use work.com_pkg.net;
1616
use work.com_pkg.receive;
17+
use work.com_pkg.reply;
1718
use work.com_types_pkg.all;
1819
use work.id_pkg.all;
1920
use work.integer_vector_ptr_pkg.all;
@@ -72,7 +73,9 @@ begin
7273
msg_type = push_axi_stream_msg or
7374
msg_type = wait_for_time_msg or
7475
msg_type = set_inactive_axi_stream_policy_msg or
75-
msg_type = set_stall_config_msg then
76+
msg_type = get_inactive_axi_stream_policy_msg or
77+
msg_type = set_stall_config_msg or
78+
msg_type = get_stall_config_msg then
7679

7780
push(message_queue, request_msg);
7881

@@ -88,11 +91,13 @@ begin
8891

8992
bus_process : process
9093
variable msg : msg_t;
94+
variable reply_msg : msg_t;
9195
variable msg_type : msg_type_t;
9296
variable rnd : RandomPType;
9397
variable inactive_axi_stream_policy : inactive_axi_stream_policy_t := get_inactive_axi_stream_policy(master);
9498
variable inactive_bus_policy : inactive_bus_policy_t;
9599
variable axi_stream_signal : axi_stream_signal_t;
100+
variable stall_config : integer_vector_ptr_t;
96101

97102
procedure probability_stall_axi_stream(
98103
signal aclk : in std_logic;
@@ -210,10 +215,23 @@ begin
210215
set_inactive_axi_stream_policy(master, inactive_bus_policy, axi_stream_signal);
211216
inactive_axi_stream_policy := get_inactive_axi_stream_policy(master);
212217

218+
elsif msg_type = get_inactive_axi_stream_policy_msg then
219+
reply_msg := new_msg(get_inactive_axi_stream_policy_reply_msg);
220+
axi_stream_signal := axi_stream_signal_t'val(pop_integer(msg));
221+
inactive_bus_policy := inactive_axi_stream_policy(axi_stream_signal);
222+
push(reply_msg, inactive_bus_policy_t'pos(inactive_bus_policy));
223+
reply(net, msg, reply_msg);
224+
213225
elsif msg_type = set_stall_config_msg then
214226
deallocate(to_integer_vector_ptr(get(master.p_config, p_stall_config_idx)));
215227
set(master.p_config, p_stall_config_idx, to_integer(pop_integer_vector_ptr_ref(msg)));
216228

229+
elsif msg_type = get_stall_config_msg then
230+
reply_msg := new_msg(get_stall_config_reply_msg);
231+
stall_config := to_integer_vector_ptr(get(master.p_config, p_stall_config_idx));
232+
push(reply_msg, stall_config);
233+
reply(net, msg, reply_msg);
234+
217235
else
218236
unexpected_msg_type(msg_type);
219237
end if;

vunit/vhdl/verification_components/src/axi_stream_pkg.vhd

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,21 @@ package axi_stream_pkg is
246246
master : axi_stream_master_t;
247247
stall_config : stall_config_t
248248
);
249+
procedure get_stall_config(
250+
signal net : inout network_t;
251+
master : axi_stream_master_t;
252+
stall_config : out stall_config_t
253+
);
249254
procedure set_stall_config(
250255
signal net : inout network_t;
251256
slave : axi_stream_slave_t;
252257
stall_config : stall_config_t
253258
);
259+
procedure get_stall_config(
260+
signal net : inout network_t;
261+
slave : axi_stream_slave_t;
262+
stall_config : out stall_config_t
263+
);
254264

255265
procedure set_inactive_axi_stream_policy(
256266
signal net : inout network_t;
@@ -259,12 +269,26 @@ package axi_stream_pkg is
259269
axi_stream_signal : axi_stream_signal_t := all_signals
260270
);
261271

272+
procedure get_inactive_axi_stream_policy(
273+
signal net : inout network_t;
274+
master : axi_stream_master_t;
275+
inactive_policy : out inactive_bus_policy_t;
276+
axi_stream_signal : axi_stream_signal_t range tdata to tuser
277+
);
278+
279+
262280
constant push_axi_stream_msg : msg_type_t := new_msg_type("push axi stream");
263281
constant pop_axi_stream_msg : msg_type_t := new_msg_type("pop axi stream");
264282
constant check_axi_stream_msg : msg_type_t := new_msg_type("check axi stream");
265283
constant axi_stream_transaction_msg : msg_type_t := new_msg_type("axi stream transaction");
266284
constant set_inactive_axi_stream_policy_msg : msg_type_t := new_msg_type("set inactive axi stream policy");
285+
constant get_inactive_axi_stream_policy_msg : msg_type_t := new_msg_type("get inactive axi stream policy");
286+
constant get_inactive_axi_stream_policy_reply_msg : msg_type_t := new_msg_type(
287+
"get inactive axi stream policy reply"
288+
);
267289
constant set_stall_config_msg : msg_type_t := new_msg_type("set stall config");
290+
constant get_stall_config_msg : msg_type_t := new_msg_type("get stall config");
291+
constant get_stall_config_reply_msg : msg_type_t := new_msg_type("get stall config reply");
268292

269293
alias axi_stream_reference_t is msg_t;
270294

@@ -378,6 +402,7 @@ package axi_stream_pkg is
378402
-- Private
379403
constant p_stall_config_idx : natural := 0;
380404
constant p_interactive_policy_idx : natural := 1;
405+
impure function p_to_stall_config(vec : integer_vector_ptr_t) return stall_config_t;
381406

382407
end package;
383408

@@ -944,6 +969,20 @@ package body axi_stream_pkg is
944969
end loop;
945970
end;
946971

972+
procedure get_inactive_axi_stream_policy(
973+
signal net : inout network_t;
974+
master : axi_stream_master_t;
975+
inactive_policy : out inactive_bus_policy_t;
976+
axi_stream_signal : axi_stream_signal_t range tdata to tuser
977+
) is
978+
variable request_msg : msg_t := new_msg(get_inactive_axi_stream_policy_msg);
979+
variable reply_msg : msg_t;
980+
begin
981+
push(request_msg, axi_stream_signal_t'pos(axi_stream_signal));
982+
request(net, master.p_actor, request_msg, reply_msg);
983+
inactive_policy := inactive_bus_policy_t'val(pop_integer(reply_msg));
984+
end;
985+
947986
procedure set_stall_config(
948987
signal net : inout network_t;
949988
master : axi_stream_master_t;
@@ -956,6 +995,28 @@ package body axi_stream_pkg is
956995
send(net, master.p_actor, msg);
957996
end;
958997

998+
impure function p_to_stall_config(vec : integer_vector_ptr_t) return stall_config_t is
999+
variable stall_config : stall_config_t;
1000+
begin
1001+
stall_config.stall_probability := real(get(vec, 0)) * (2.0 ** (-23));
1002+
stall_config.min_stall_cycles := get(vec, 1);
1003+
stall_config.max_stall_cycles := get(vec, 2);
1004+
1005+
return stall_config;
1006+
end;
1007+
1008+
procedure get_stall_config(
1009+
signal net : inout network_t;
1010+
master : axi_stream_master_t;
1011+
stall_config : out stall_config_t
1012+
) is
1013+
variable request_msg : msg_t := new_msg(get_stall_config_msg);
1014+
variable reply_msg : msg_t;
1015+
begin
1016+
request(net, master.p_actor, request_msg, reply_msg);
1017+
stall_config := p_to_stall_config(pop_integer_vector_ptr_ref(reply_msg));
1018+
end;
1019+
9591020
procedure set_stall_config(
9601021
signal net : inout network_t;
9611022
slave : axi_stream_slave_t;
@@ -968,6 +1029,18 @@ package body axi_stream_pkg is
9681029
send(net, slave.p_actor, msg);
9691030
end;
9701031

1032+
procedure get_stall_config(
1033+
signal net : inout network_t;
1034+
slave : axi_stream_slave_t;
1035+
stall_config : out stall_config_t
1036+
) is
1037+
variable request_msg : msg_t := new_msg(get_stall_config_msg);
1038+
variable reply_msg : msg_t;
1039+
begin
1040+
request(net, slave.p_actor, request_msg, reply_msg);
1041+
stall_config := p_to_stall_config(pop_integer_vector_ptr_ref(reply_msg));
1042+
end;
1043+
9711044
procedure push_axi_stream_transaction(msg : msg_t; axi_stream_transaction : axi_stream_transaction_t) is
9721045
begin
9731046
push_std_ulogic_vector(msg, axi_stream_transaction.tdata);

vunit/vhdl/verification_components/src/axi_stream_private_pkg.vhd

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,23 +84,13 @@ package body axi_stream_private_pkg is
8484
return to_inactive_axi_stream_policy(to_integer_vector_ptr(get(master.p_config, p_interactive_policy_idx)));
8585
end;
8686

87-
impure function to_stall_config(vec : integer_vector_ptr_t) return stall_config_t is
88-
variable stall_config : stall_config_t;
89-
begin
90-
stall_config.stall_probability := real(get(vec, 0)) * (2.0 ** (-23));
91-
stall_config.min_stall_cycles := get(vec, 1);
92-
stall_config.max_stall_cycles := get(vec, 2);
93-
94-
return stall_config;
95-
end;
96-
9787
impure function get_stall_config(master : axi_stream_master_t) return stall_config_t is
9888
begin
99-
return to_stall_config(to_integer_vector_ptr(get(master.p_config, p_stall_config_idx)));
89+
return p_to_stall_config(to_integer_vector_ptr(get(master.p_config, p_stall_config_idx)));
10090
end;
10191

10292
impure function get_stall_config(slave : axi_stream_slave_t) return stall_config_t is
10393
begin
104-
return to_stall_config(to_integer_vector_ptr(get(slave.p_config, p_stall_config_idx)));
94+
return p_to_stall_config(to_integer_vector_ptr(get(slave.p_config, p_stall_config_idx)));
10595
end;
10696
end package body;

vunit/vhdl/verification_components/src/axi_stream_slave.vhd

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ begin
6666
msg_type = pop_axi_stream_msg or
6767
msg_type = check_axi_stream_msg or
6868
msg_type = wait_for_time_msg or
69-
msg_type = set_stall_config_msg then
69+
msg_type = set_stall_config_msg or
70+
msg_type = get_stall_config_msg then
7071

7172
push(message_queue, request_msg);
7273

@@ -111,6 +112,7 @@ begin
111112
variable expected_tdata : std_logic_vector(tdata'range);
112113
variable mismatch : boolean;
113114
variable tstrb_resolved : std_logic_vector(tstrb'range);
115+
variable stall_config : integer_vector_ptr_t;
114116
begin
115117
rnd.InitSeed(rnd'instance_name);
116118
loop
@@ -181,6 +183,12 @@ begin
181183
deallocate(to_integer_vector_ptr(get(slave.p_config, p_stall_config_idx)));
182184
set(slave.p_config, p_stall_config_idx, to_integer(pop_integer_vector_ptr_ref(msg)));
183185

186+
elsif msg_type = get_stall_config_msg then
187+
reply_msg := new_msg(get_stall_config_reply_msg);
188+
stall_config := to_integer_vector_ptr(get(slave.p_config, p_stall_config_idx));
189+
push(reply_msg, stall_config);
190+
reply(net, msg, reply_msg);
191+
184192
else
185193
unexpected_msg_type(msg_type);
186194
end if;

vunit/vhdl/verification_components/test/tb_axi_stream.vhd

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,10 @@ begin
128128
variable mock_logger : logger_t;
129129
variable rnd : RandomPtype;
130130
variable stall_config : stall_config_t;
131+
variable stall_config_read_back : stall_config_t;
131132
variable stall_probability_percent : natural;
132133
variable previous_inactive_policy : inactive_bus_policy_t := 'X';
134+
variable inactive_policy_read_back : inactive_bus_policy_t;
133135
variable loop_count : natural := 0;
134136

135137
impure function select_policy(
@@ -686,11 +688,17 @@ begin
686688
wait until rising_edge(aclk);
687689
stall_probability_percent := 30;
688690
stall_config := new_stall_config(real(stall_probability_percent) / 100.0, min_stall_cycles, max_stall_cycles);
691+
689692
if running_test_case = "test random stall on master" then
690693
set_stall_config(net, master_axi_stream, stall_config);
694+
get_stall_config(net, master_axi_stream, stall_config_read_back);
691695
else
692696
set_stall_config(net, slave_axi_stream, stall_config);
697+
get_stall_config(net, slave_axi_stream, stall_config_read_back);
693698
end if;
699+
check_equal(stall_config_read_back.stall_probability, stall_config.stall_probability, max_diff => 0.0001);
700+
check_equal(stall_config_read_back.min_stall_cycles, stall_config.min_stall_cycles);
701+
check_equal(stall_config_read_back.max_stall_cycles, stall_config.max_stall_cycles);
694702
for i in 0 to 100 loop
695703
pop_stream(net, slave_stream, reference);
696704
push(reference_queue, reference);
@@ -772,6 +780,8 @@ begin
772780
for inactive_policy in inactive_bus_policy_t'left to inactive_bus_policy_t'right loop
773781
for axi_stream_signal in work.axi_stream_pkg.tuser downto work.axi_stream_pkg.tdata loop
774782
set_inactive_axi_stream_policy(net, master_axi_stream, inactive_policy, axi_stream_signal);
783+
get_inactive_axi_stream_policy(net, master_axi_stream, inactive_policy_read_back, axi_stream_signal);
784+
check(inactive_policy_read_back = inactive_policy);
775785

776786
axi_stream_transaction := (
777787
tdata => x"99", tlast => true, tkeep => "1", tstrb => "1",
@@ -896,7 +906,9 @@ begin
896906

897907
axi_stream_master_inst : entity work.axi_stream_master
898908
generic map(
899-
master => master_axi_stream)
909+
master => master_axi_stream,
910+
drive_invalid => false
911+
)
900912
port map(
901913
aclk => aclk,
902914
areset_n => areset_n,

vunit/vhdl/verification_components/test/tb_axi_stream_protocol_checker.vhd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,8 @@ begin
255255

256256
elsif run("Test failing check of that tlast remains stable when tvalid is asserted and tready is low") then
257257
fail_stable_test(
258-
d(0) => tlast, rule_name => ":rule 2", signal_name => "tlast", zero_string => "1", one_string => "0", zero_value => '1', one_value => '0'
258+
d(0) => tlast, rule_name => ":rule 2", signal_name => "tlast", zero_string => "1",
259+
one_string => "0", zero_value => '1', one_value => '0'
259260
);
260261

261262
elsif run("Test passing check of that tvalid remains asserted until tready is high") then

0 commit comments

Comments
 (0)