library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
--+ including vhdl 2008 libraries
|
|
--+ These lines can be commented out when using
|
|
--+ a simulator with built-in VHDL 2008 support
|
|
--library ieee_proposed;
|
|
-- use ieee_proposed.standard_additions.all;
|
|
-- use ieee_proposed.std_logic_1164_additions.all;
|
|
-- use ieee_proposed.numeric_std_additions.all;
|
|
|
|
library osvvm;
|
|
use osvvm.RandomPkg.all;
|
|
|
|
library libvhdl;
|
|
use libvhdl.DictP.all;
|
|
|
|
|
|
|
|
entity DictT is
|
|
end entity DictT;
|
|
|
|
|
|
|
|
architecture sim of DictT is
|
|
|
|
|
|
type t_scoreboard is array (natural range <>) of std_logic_vector(7 downto 0);
|
|
|
|
shared variable sv_dict : t_dict;
|
|
shared variable sv_dact : t_dict;
|
|
shared variable sv_duct : t_dict;
|
|
|
|
|
|
begin
|
|
|
|
|
|
DictInitP : process is
|
|
begin
|
|
sv_dict.init(false);
|
|
sv_dact.init(false);
|
|
sv_duct.init(false);
|
|
wait;
|
|
end process DictInitP;
|
|
|
|
|
|
DictTestP : process is
|
|
variable v_key : t_dict_key_ptr;
|
|
variable v_random : RandomPType;
|
|
variable v_input : std_logic_vector(7 downto 0);
|
|
variable v_output : std_logic_vector(7 downto 0);
|
|
variable v_scoreboard : t_scoreboard(0 to 511);
|
|
variable v_error : t_dict_error;
|
|
begin
|
|
v_random.InitSeed(v_random'instance_name);
|
|
|
|
-- check initial emptiness
|
|
assert sv_dict.size = 0
|
|
report "ERROR: Dict should be empty"
|
|
severity failure;
|
|
|
|
-- The dict shouldn_t accept an empty key string
|
|
report "INFO: Test 0: Try to set an entry with empty key string";
|
|
sv_dict.set("", x"0123456789", v_error);
|
|
assert v_error = KEY_INVALID
|
|
report "ERROR: Key '' should raise a KEY_INVALID error"
|
|
severity failure;
|
|
report "INFO: Test successful";
|
|
|
|
-- fill dictionary and check count
|
|
report "INFO: Test 1: Fill dictionary";
|
|
for i in 0 to 255 loop
|
|
v_input := v_random.RandSlv(8);
|
|
sv_dict.set(integer'image(i), v_input, v_error);
|
|
v_scoreboard(i) := v_input;
|
|
assert sv_dict.size = i+1
|
|
report "ERROR: Dict should have " & to_string(i+1) & " entries"
|
|
severity failure;
|
|
end loop;
|
|
report "INFO: Test successful";
|
|
|
|
-- read all entries and check for correct data
|
|
report "INFO: Test 2: Read dictionary";
|
|
for i in 0 to 255 loop
|
|
sv_dict.get(integer'image(i), v_output, v_error);
|
|
assert v_output = v_scoreboard(i)
|
|
report "ERROR: Got 0x" & to_hstring(v_output) & ", expected 0x" & to_hstring(v_scoreboard(i))
|
|
severity failure;
|
|
end loop;
|
|
report "INFO: Test successful";
|
|
|
|
-- overwrite a key/value pair
|
|
report "INFO: Test 3: Overwrite a entry";
|
|
v_input := v_random.RandSlv(8);
|
|
sv_dict.set("128", v_input, v_error);
|
|
v_scoreboard(128) := v_input;
|
|
sv_dict.get("128", v_output, v_error);
|
|
assert v_output = v_scoreboard(128)
|
|
report "ERROR: Got 0x" & to_hstring(v_output) & ", expected 0x" & to_hstring(v_scoreboard(128))
|
|
severity failure;
|
|
report "INFO: Test successful";
|
|
|
|
-- check for existing keys
|
|
report "INFO: Test 4: Check hasKey() method";
|
|
for i in 0 to 255 loop
|
|
assert sv_dict.hasKey(integer'image(i))
|
|
report "ERROR: Key" & integer'image(i) & " should exist in dictionary"
|
|
severity failure;
|
|
end loop;
|
|
assert not(sv_dict.hasKey("AFFE"))
|
|
report "ERROR: Key AFFE shouldn't exist in dictionary"
|
|
severity failure;
|
|
report "INFO: Test successful";
|
|
|
|
-- iterate up over all entries
|
|
report "INFO: Test 5: Iterate up over all entries";
|
|
sv_dict.setFirst;
|
|
for i in 0 to 255 loop
|
|
v_key := new string'(sv_dict.iter(UP));
|
|
assert v_key.all = integer'image(i)
|
|
report "ERROR: Got key " & v_key.all & ", expected " & integer'image(i)
|
|
severity failure;
|
|
sv_dict.get(v_key.all, v_output, v_error);
|
|
assert v_key.all = integer'image(i) and v_output = v_scoreboard(i)
|
|
report "ERROR: Got 0x" & to_hstring(v_output) & ", expected 0x" & to_hstring(v_scoreboard(i))
|
|
severity failure;
|
|
end loop;
|
|
v_key := new string'(sv_dict.iter(UP));
|
|
assert v_key.all = ""
|
|
report "ERROR: Got key " & v_key.all & ", expected empty key"
|
|
severity failure;
|
|
report "INFO: Test successful";
|
|
|
|
-- iterate down over all entries
|
|
report "INFO: Test 6: Iterate down over all entries";
|
|
sv_dict.setLast;
|
|
for i in 255 downto 0 loop
|
|
v_key := new string'(sv_dict.iter(DOWN));
|
|
assert v_key.all = integer'image(i)
|
|
report "ERROR: Got key " & v_key.all & ", expected " & integer'image(i)
|
|
severity failure;
|
|
sv_dict.get(v_key.all, v_output, v_error);
|
|
assert v_key.all = integer'image(i) and v_output = v_scoreboard(i)
|
|
report "ERROR: Got 0x" & to_hstring(v_output) & ", expected 0x" & to_hstring(v_scoreboard(i))
|
|
severity failure;
|
|
end loop;
|
|
v_key := new string'(sv_dict.iter(DOWN));
|
|
assert v_key.all = ""
|
|
report "ERROR: Got key " & v_key.all & ", expected empty key"
|
|
severity failure;
|
|
deallocate(v_key);
|
|
report "INFO: Test successful";
|
|
|
|
-- merge 2 dictionaries
|
|
-- fill dictionary and check count
|
|
report "INFO: Test 7: Merge dictionaries";
|
|
for i in 256 to 511 loop
|
|
v_input := v_random.RandSlv(8);
|
|
sv_dact.set(integer'image(i), v_input, v_error);
|
|
v_scoreboard(i) := v_input;
|
|
assert sv_dact.size = i-255
|
|
report "ERROR: Dict should have " & to_string(i-255) & " entries"
|
|
severity failure;
|
|
end loop;
|
|
-- merge dictionaries
|
|
merge(sv_dict, sv_dact, sv_duct);
|
|
-- read all entries and check for correct data
|
|
for i in 0 to 511 loop
|
|
sv_duct.get(integer'image(i), v_output, v_error);
|
|
assert v_output = v_scoreboard(i)
|
|
report "ERROR: Got 0x" & to_hstring(v_output) & ", expected 0x" & to_hstring(v_scoreboard(i))
|
|
severity failure;
|
|
end loop;
|
|
report "INFO: Test successful";
|
|
|
|
-- Remove key/value pair from head of dictionary
|
|
report "INFO: Test 8: Removing entry from head of dictionary";
|
|
sv_dict.del("255", v_error);
|
|
assert not(sv_dict.hasKey("255"))
|
|
report "ERROR: Key 255 shouldn't exist in dictionary"
|
|
severity failure;
|
|
report "INFO: Test successful";
|
|
|
|
-- Remove key/value pair from head of dictionary
|
|
report "INFO: Test 9: Removing entry from middle of dictionary";
|
|
sv_dict.del("127", v_error);
|
|
assert not(sv_dict.hasKey("127"))
|
|
report "ERROR: Key 127 shouldn't exist in dictionary"
|
|
severity failure;
|
|
report "INFO: Test successful";
|
|
|
|
-- Remove key/value pair from head of dictionary
|
|
report "INFO: Test 10: Removing entry from beginning of dictionary";
|
|
sv_dict.del("0", v_error);
|
|
assert not(sv_dict.hasKey("0"))
|
|
report "ERROR: Key 0 shouldn't exist in dictionary"
|
|
severity failure;
|
|
report "INFO: Test successful";
|
|
|
|
-- Remove key/value pair from head of dictionary
|
|
report "INFO: Test 11: Clear all entries from dictionary";
|
|
sv_dict.clear(v_error);
|
|
assert sv_dict.size = 0
|
|
report "ERROR: Dict should be empty"
|
|
severity failure;
|
|
report "INFO: Test successful";
|
|
|
|
report "INFO: t_dict test finished successfully";
|
|
wait;
|
|
end process DictTestP;
|
|
|
|
|
|
end architecture sim;
|