library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; library osvvm; use osvvm.RandomPkg.all; library libvhdl; use libvhdl.AssertP.all; entity StackT is end entity StackT; architecture sim of StackT is constant C_STACK_DEPTH : natural := 64; package SlvStack is new libvhdl.StackP generic map ( STACK_TYPE => std_logic_vector(63 downto 0), MAX_LEN => C_STACK_DEPTH, to_string => to_hstring ); shared variable sv_stack : SlvStack.t_stack; begin StackInitP : process is begin sv_stack.init(false); wait; end process StackInitP; StackTestP : process is variable v_data : std_logic_vector(63 downto 0); variable v_random : RandomPType; type t_scoreboard is array (natural range <>) of std_logic_vector(63 downto 0); variable v_scoreboard : t_scoreboard(0 to C_STACK_DEPTH-1); begin -- Check initial emptiness assert_true(sv_stack.is_empty, "Stack should be empty!"); -- Fill stack v_random.InitSeed(v_random'instance_name); for i in 0 to C_STACK_DEPTH-1 loop v_data := v_random.RandSlv(64); v_scoreboard(i) := v_data; sv_stack.push(v_data); end loop; -- Check that it's full assert_true(sv_stack.is_full, "Stack should be full!"); -- Check number of entries assert_equal(sv_stack.fillstate, C_STACK_DEPTH, "Stack should have" & integer'image(C_STACK_DEPTH) & "entries"); -- Empty the stack for i in C_STACK_DEPTH-1 downto 0 loop sv_stack.pop(v_data); assert_equal(v_data, v_scoreboard(i)); end loop; -- Check emptiness assert_true(sv_stack.is_empty, "Stack should be empty!"); report "INFO: t_stack test finished successfully"; wait; end process StackTestP; end architecture sim;