|
|
|
library vunit_lib;
|
|
|
|
context vunit_lib.vunit_context;
|
|
|
|
|
|
|
|
library ieee;
|
|
|
|
use ieee.std_logic_1164.all;
|
|
|
|
use ieee.numeric_std.all;
|
|
|
|
|
|
|
|
library work;
|
|
|
|
use work.common.all;
|
|
|
|
use work.wishbone_types.all;
|
|
|
|
|
|
|
|
entity plru_tb is
|
|
|
|
generic (runner_cfg : string := runner_cfg_default);
|
|
|
|
end plru_tb;
|
|
|
|
|
|
|
|
architecture behave of plru_tb is
|
|
|
|
signal clk : std_ulogic;
|
|
|
|
signal rst : std_ulogic;
|
|
|
|
|
|
|
|
constant clk_period : time := 10 ns;
|
|
|
|
constant plru_bits : integer := 3;
|
|
|
|
|
|
|
|
subtype plru_val_t is std_ulogic_vector(plru_bits - 1 downto 0);
|
|
|
|
subtype plru_tree_t is std_ulogic_vector(2 ** plru_bits - 2 downto 0);
|
|
|
|
signal do_update : std_ulogic := '0';
|
|
|
|
signal acc : plru_val_t;
|
|
|
|
signal lru : plru_val_t;
|
|
|
|
signal state : plru_tree_t;
|
|
|
|
signal state_upd : plru_tree_t;
|
|
|
|
|
|
|
|
begin
|
|
|
|
plrufn0: entity work.plrufn
|
|
|
|
generic map(
|
|
|
|
BITS => plru_bits
|
|
|
|
)
|
|
|
|
port map(
|
|
|
|
acc => acc,
|
|
|
|
tree_in => state,
|
|
|
|
tree_out => state_upd,
|
|
|
|
lru => lru
|
|
|
|
);
|
|
|
|
|
|
|
|
clk_process: process
|
|
|
|
begin
|
|
|
|
clk <= '0';
|
|
|
|
wait for clk_period/2;
|
|
|
|
clk <= '1';
|
|
|
|
wait for clk_period/2;
|
|
|
|
end process;
|
|
|
|
|
|
|
|
rst_process: process
|
|
|
|
begin
|
|
|
|
rst <= '1';
|
|
|
|
wait for 2*clk_period;
|
|
|
|
rst <= '0';
|
|
|
|
wait;
|
|
|
|
end process;
|
|
|
|
|
|
|
|
plru_process: process(clk)
|
|
|
|
begin
|
|
|
|
if rising_edge(clk) then
|
|
|
|
if rst = '1' then
|
|
|
|
state <= (others => '0');
|
|
|
|
elsif do_update = '1' then
|
|
|
|
state <= state_upd;
|
|
|
|
end if;
|
|
|
|
end if;
|
|
|
|
end process;
|
|
|
|
|
|
|
|
stim_process: process
|
|
|
|
procedure test_access(acc_val: integer; expected: integer) is
|
|
|
|
begin
|
|
|
|
acc <= std_ulogic_vector(to_unsigned(acc_val, acc'length));
|
|
|
|
do_update <= '1';
|
|
|
|
wait for clk_period;
|
|
|
|
info("accessed " & integer'image(acc_val) & " LRU=" & to_hstring(lru));
|
|
|
|
check_equal(lru, expected, result("LRU ACC=" & integer'image(acc_val)));
|
|
|
|
end procedure;
|
|
|
|
begin
|
|
|
|
test_runner_setup(runner, runner_cfg);
|
|
|
|
|
|
|
|
wait for 8*clk_period;
|
|
|
|
|
|
|
|
info("reset state:" & to_hstring(lru));
|
|
|
|
check_equal(lru, 0, result("LRU "));
|
|
|
|
|
|
|
|
test_access(1, 4);
|
|
|
|
test_access(2, 4);
|
|
|
|
test_access(7, 0);
|
|
|
|
test_access(4, 0);
|
|
|
|
test_access(3, 6);
|
|
|
|
test_access(5, 0);
|
|
|
|
test_access(3, 6);
|
|
|
|
test_access(5, 0);
|
|
|
|
test_access(6, 0);
|
|
|
|
test_access(0, 4);
|
|
|
|
test_access(1, 4);
|
|
|
|
test_access(2, 4);
|
|
|
|
test_access(3, 4);
|
|
|
|
test_access(4, 0);
|
|
|
|
test_access(5, 0);
|
|
|
|
test_access(6, 0);
|
|
|
|
test_access(7, 0);
|
|
|
|
test_access(6, 0);
|
|
|
|
test_access(5, 0);
|
|
|
|
test_access(4, 0);
|
|
|
|
test_access(3, 7);
|
|
|
|
test_access(2, 7);
|
|
|
|
test_access(1, 7);
|
|
|
|
test_access(0, 7);
|
|
|
|
|
|
|
|
|
|
|
|
wait for clk_period;
|
|
|
|
wait for clk_period;
|
|
|
|
|
|
|
|
test_runner_cleanup(runner);
|
|
|
|
end process;
|
|
|
|
end;
|