Skip to content

Commit 4ee2d36

Browse files
Merge remote-tracking branch 'upstream/master'
2 parents be358bc + 51365a5 commit 4ee2d36

File tree

11 files changed

+139
-46
lines changed

11 files changed

+139
-46
lines changed

vunit/vhdl/check/src/checker_pkg-body.vhd

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,4 +312,14 @@ package body checker_pkg is
312312
")");
313313
end function;
314314

315+
impure function to_integer(checker : checker_t) return integer is
316+
begin
317+
return to_integer(checker.p_data);
318+
end;
319+
320+
impure function to_checker(value : integer) return checker_t is
321+
begin
322+
return (p_data => to_integer_vector_ptr(value));
323+
end;
324+
315325
end package body;

vunit/vhdl/check/src/checker_pkg.vhd

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ package checker_pkg is
106106
procedure get_checker_stat(checker : checker_t;
107107
variable stat : out checker_stat_t);
108108

109+
impure function to_integer(checker : checker_t) return integer;
110+
impure function to_checker(value : integer) return checker_t;
111+
109112
-- Private
110113
impure function p_has_unhandled_checks return boolean;
111114
impure function p_register_unhandled_check(checker : checker_t) return unhandled_check_id_t;

vunit/vhdl/check/test/tb_checker.vhd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ begin
9494
assert_true(stat1 + stat2 = (31, 16, 15), "Expected sum = (31, 16, 15)");
9595
passed := to_string(stat1) = "checker_stat'(n_checks => 20, n_failed => 13, n_passed => 7)";
9696
assert_true(passed, "Format error of checker_stat_t. Got:" & to_string(stat1));
97+
98+
elsif run("Test checker to/from integer conversion") then
99+
assert_true(to_checker(to_integer(my_checker)) = my_checker);
100+
assert_true(to_checker(to_integer(null_checker)) = null_checker);
101+
97102
end if;
98103
end loop;
99104

vunit/vhdl/com/src/com_types.vhd

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,12 @@ package com_types_pkg is
400400
alias push_dict_t_ref is push_ref[msg_t, dict_t];
401401
alias pop_dict_t_ref is pop_ref[msg_t return dict_t];
402402

403+
-- Misc
404+
impure function to_integer(actor : actor_t) return integer;
405+
impure function to_actor(value : integer) return actor_t;
406+
407+
-- Private
408+
impure function is_valid(code : integer) return boolean;
403409
end package;
404410

405411
package body com_types_pkg is
@@ -870,5 +876,17 @@ package body com_types_pkg is
870876
return pop_ref(msg.data);
871877
end;
872878

879+
-----------------------------------------------------------------------------
880+
-- Misc
881+
-----------------------------------------------------------------------------
882+
impure function to_integer(actor : actor_t) return integer is
883+
begin
884+
return actor.p_id_number;
885+
end;
886+
887+
impure function to_actor(value : integer) return actor_t is
888+
begin
889+
return (p_id_number => value);
890+
end;
873891

874892
end package body com_types_pkg;

vunit/vhdl/com/test/tb_com.vhd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,6 +1384,11 @@ begin
13841384

13851385
unmock(com_logger);
13861386

1387+
elsif run("Test actor to/from integer conversion") then
1388+
actor := new_actor;
1389+
check(to_actor(to_integer(actor)) = actor);
1390+
check(to_actor(to_integer(null_actor)) = null_actor);
1391+
13871392
-- Deprecated APIs
13881393
elsif run("Test that use of deprecated API leads to an error") then
13891394
mock(com_logger);

vunit/vhdl/logging/src/logger_pkg-body.vhd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ package body logger_pkg is
3636
return to_integer(logger.p_data);
3737
end;
3838

39+
impure function to_logger(value : integer) return logger_t is
40+
begin
41+
return (p_data => to_integer_vector_ptr(value));
42+
end;
43+
3944
procedure add_child(logger : logger_t; child : logger_t) is
4045
constant children : integer_vector_ptr_t := to_integer_vector_ptr(get(logger.p_data, children_idx));
4146
begin

vunit/vhdl/logging/src/logger_pkg.vhd

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,4 +427,11 @@ package logger_pkg is
427427
-- Return the number of unchecked messages in the mock queue
428428
impure function mock_queue_length return natural;
429429

430+
-----------------------------------------------------------------------------
431+
-- Misc
432+
-----------------------------------------------------------------------------
433+
impure function to_integer(logger : logger_t) return integer;
434+
impure function to_logger(value : integer) return logger_t;
435+
436+
430437
end package;

vunit/vhdl/logging/test/tb_log.vhd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,10 @@ begin
944944
check_log_file(file_handlers(i), log_file_name & integer'image(i), entries);
945945
end loop;
946946

947+
elsif run("Test logger to/from integer conversion") then
948+
assert_true(to_logger(to_integer(logger)) = logger);
949+
assert_true(to_logger(to_integer(null_logger)) = null_logger);
950+
947951
end if;
948952

949953
test_runner_cleanup(runner);

vunit/vhdl/verification_components/src/vc_context.vhd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ context vc_context is
1919
use vunit_lib.stream_slave_pkg.all;
2020
use vunit_lib.sync_pkg.all;
2121
use vunit_lib.uart_pkg.all;
22+
use vunit_lib.vc_pkg.all;
2223
use vunit_lib.wishbone_pkg.all;
2324
context vunit_lib.com_context;
2425
end context;

vunit/vhdl/verification_components/src/vc_pkg.vhd

Lines changed: 63 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,11 @@ package vc_pkg is
1313
type unexpected_msg_type_policy_t is (fail, ignore);
1414

1515
type std_cfg_t is record
16-
p_id : id_t;
17-
p_actor : actor_t;
18-
p_logger : logger_t;
19-
p_checker : checker_t;
20-
p_unexpected_msg_type_policy : unexpected_msg_type_policy_t;
16+
p_data : integer_vector_ptr_t;
2117
end record;
2218

2319
constant null_std_cfg : std_cfg_t := (
24-
p_id => null_id,
25-
p_actor => null_actor,
26-
p_logger => null_logger,
27-
p_checker => null_checker,
28-
p_unexpected_msg_type_policy => ignore
20+
p_data => null_integer_vector_ptr
2921
);
3022

3123
-- Creates a standard VC configuration with an id, an actor, a logger, a
@@ -46,6 +38,10 @@ package vc_pkg is
4638
unexpected_msg_type_policy : unexpected_msg_type_policy_t := fail
4739
) return std_cfg_t;
4840

41+
-- Used to create enumerated ids from a parent id. The first created
42+
-- id will be <parent name>:1, the second <parent name>:2 and so on
43+
impure function enumerate(parent : id_t) return id_t;
44+
4945
-- These functions extracts information from the standard VC configuration
5046
impure function get_id(std_cfg : std_cfg_t) return id_t;
5147
impure function get_actor(std_cfg : std_cfg_t) return actor_t;
@@ -62,18 +58,35 @@ package body vc_pkg is
6258
constant vc_pkg_logger : logger_t := get_logger("vunit_lib:vc_pkg");
6359
constant vc_pkg_checker : checker_t := new_checker(vc_pkg_logger);
6460

61+
constant id_idx : natural := 0;
62+
constant actor_idx : natural := 1;
63+
constant logger_idx : natural := 2;
64+
constant checker_idx : natural := 3;
65+
constant unexpected_msg_type_policy_idx : natural := 4;
66+
constant std_cfg_length : natural := unexpected_msg_type_policy_idx + 1;
67+
68+
impure function enumerate(parent : id_t) return id_t is
69+
begin
70+
return get_id(to_string(num_children(parent) + 1), parent => parent);
71+
end;
72+
6573
impure function create_std_cfg(
6674
id : id_t := null_id;
6775
provider : string := "";
6876
vc_name : string := "";
6977
unexpected_msg_type_policy : unexpected_msg_type_policy_t := fail
7078
) return std_cfg_t is
71-
variable result : std_cfg_t;
79+
variable std_cfg : std_cfg_t;
7280
variable provider_id : id_t;
7381
variable vc_id : id_t;
82+
variable instance_id : id_t;
83+
variable actor : actor_t;
84+
variable logger : logger_t;
7485
begin
86+
std_cfg.p_data := new_integer_vector_ptr(std_cfg_length);
87+
7588
if id /= null_id then
76-
result.p_id := id;
89+
instance_id := id;
7790
else
7891
if provider = "" then
7992
check_failed(vc_pkg_checker, "A provider must be provided.");
@@ -91,53 +104,75 @@ package body vc_pkg is
91104

92105
provider_id := get_id(provider);
93106
vc_id := get_id(vc_name, parent => provider_id);
94-
result.p_id := get_id(to_string(num_children(vc_id) + 1), parent => vc_id);
107+
instance_id := enumerate(vc_id);
95108
end if;
109+
set(std_cfg.p_data, id_idx, to_integer(instance_id));
96110

97-
result.p_unexpected_msg_type_policy := unexpected_msg_type_policy;
111+
if find(instance_id, enable_deferred_creation => false) /= null_actor then
112+
check_failed(vc_pkg_checker, "An actor already exists for " & full_name(instance_id) & ".");
98113

99-
if find(result.p_id, enable_deferred_creation => false) /= null_actor then
100-
check_failed(vc_pkg_checker, "An actor already exists for " & full_name(result.p_id) & ".");
114+
-- Simplifies testing when vc_pkg_checker logger is mocked
115+
return null_std_cfg;
101116
else
102-
result.p_actor := new_actor(result.p_id);
117+
actor := new_actor(instance_id);
103118
end if;
119+
set(std_cfg.p_data, actor_idx, to_integer(actor));
120+
121+
logger := get_logger(instance_id);
122+
set(std_cfg.p_data, logger_idx, to_integer(logger));
123+
124+
set(std_cfg.p_data, checker_idx, to_integer(new_checker(logger)));
104125

105-
result.p_logger := get_logger(result.p_id);
106-
result.p_checker := new_checker(result.p_logger);
126+
set(
127+
std_cfg.p_data,
128+
unexpected_msg_type_policy_idx,
129+
unexpected_msg_type_policy_t'pos(unexpected_msg_type_policy)
130+
);
107131

108-
return result;
132+
return std_cfg;
109133
end;
110134

111135
impure function get_id(std_cfg : std_cfg_t) return id_t is
112136
begin
113-
return std_cfg.p_id;
137+
return to_id(get(std_cfg.p_data, id_idx));
114138
end;
115139

116140
impure function get_actor(std_cfg : std_cfg_t) return actor_t is
117141
begin
118-
return std_cfg.p_actor;
142+
return to_actor(get(std_cfg.p_data, actor_idx));
119143
end;
120144

121145
impure function get_logger(std_cfg : std_cfg_t) return logger_t is
122146
begin
123-
return std_cfg.p_logger;
147+
return to_logger(get(std_cfg.p_data, logger_idx));
124148
end;
125149

126150
impure function get_checker(std_cfg : std_cfg_t) return checker_t is
127151
begin
128-
return std_cfg.p_checker;
152+
return to_checker(get(std_cfg.p_data, checker_idx));
129153
end;
130154

131155
impure function unexpected_msg_type_policy(std_cfg : std_cfg_t) return unexpected_msg_type_policy_t is
132156
begin
133-
return std_cfg.p_unexpected_msg_type_policy;
157+
return unexpected_msg_type_policy_t'val(get(std_cfg.p_data, unexpected_msg_type_policy_idx));
134158
end;
135159

136160
procedure unexpected_msg_type(msg_type : msg_type_t;
137161
std_cfg : std_cfg_t) is
162+
constant code : integer := msg_type.p_code;
138163
begin
139-
if unexpected_msg_type_policy(std_cfg) = fail then
140-
unexpected_msg_type(msg_type, get_logger(std_cfg));
164+
if is_already_handled(msg_type) or unexpected_msg_type_policy(std_cfg) = ignore then
165+
null;
166+
elsif is_valid(code) then
167+
check_failed(
168+
get_checker(std_cfg),
169+
"Got unexpected message " & to_string(to_string_ptr(get(p_msg_types.p_name_ptrs, code)))
170+
);
171+
else
172+
check_failed(
173+
get_checker(std_cfg),
174+
"Got invalid message with code " & to_string(code)
175+
);
141176
end if;
142-
end;
177+
end procedure;
143178
end package body;

0 commit comments

Comments
 (0)