177 lines
5.9 KiB
VHDL
177 lines
5.9 KiB
VHDL
|
|
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
use std.env.stop;
|
|
|
|
entity SpriteChannel_RegisterFile_tb is
|
|
end;
|
|
|
|
architecture bench of SpriteChannel_RegisterFile_tb is
|
|
-- Clock period
|
|
constant K_CLKPeriod : time := 10 ns;
|
|
|
|
-- Generics
|
|
constant G_SpriteIDWidth : integer := 10;
|
|
constant G_SpriteLineWidth : integer := 16;
|
|
constant G_XWidth : integer := 10;
|
|
constant G_YWidth : integer := 10;
|
|
|
|
-- Ports
|
|
signal I_CLK : std_logic;
|
|
signal I_CE : std_logic;
|
|
signal I_RST : std_logic;
|
|
signal I_SpriteID_WE : std_logic;
|
|
signal I_SpriteID : std_logic_vector(G_SpriteIDWidth - 1 downto 0);
|
|
signal I_X_WE : std_logic;
|
|
signal I_X : std_logic_vector(G_XWidth - 1 downto 0);
|
|
signal I_Y_WE : std_logic;
|
|
signal I_Y : std_logic_vector(G_YWidth - 1 downto 0);
|
|
signal I_SpriteLine_WE : std_logic;
|
|
signal I_SpriteLine : std_logic_vector(G_SpriteLineWidth - 1 downto 0);
|
|
signal I_SpriteLineValid_WE : std_logic;
|
|
signal I_SpriteLineValid : std_logic;
|
|
signal O_SpriteID : std_logic_vector(G_SpriteIDWidth - 1 downto 0);
|
|
signal O_X : std_logic_vector(G_XWidth - 1 downto 0);
|
|
signal O_Y : std_logic_vector(G_YWidth - 1 downto 0);
|
|
signal O_SpriteLine : std_logic_vector(G_SpriteLineWidth - 1 downto 0);
|
|
signal O_SpriteLineValid : std_logic;
|
|
|
|
-- Test control signals
|
|
signal TestDone : boolean := false;
|
|
|
|
type T_TestCase is record
|
|
SpriteID : integer;
|
|
X : integer;
|
|
Y : integer;
|
|
SpriteLine : integer;
|
|
SpriteLineValid : std_logic;
|
|
end record;
|
|
|
|
type T_TestArray is array (natural range <>) of T_TestCase;
|
|
|
|
constant TestValues : T_TestArray := (
|
|
(SpriteID => 5, X => 100, Y => 200, SpriteLine => 1234, SpriteLineValid => '1'),
|
|
(SpriteID => 42, X => 10, Y => 20, SpriteLine => 65535, SpriteLineValid => '0'),
|
|
(SpriteID => 0, X => 0, Y => 0, SpriteLine => 0, SpriteLineValid => '1'),
|
|
(SpriteID => 1023, X => 1023, Y => 1023, SpriteLine => 1, SpriteLineValid => '1')
|
|
);
|
|
begin
|
|
|
|
ClockProc : process
|
|
begin
|
|
while TestDone = false loop
|
|
I_CLK <= '0';
|
|
wait for K_CLKPeriod / 2;
|
|
I_CLK <= '1';
|
|
wait for K_CLKPeriod / 2;
|
|
end loop;
|
|
|
|
I_CLK <= '0';
|
|
stop(0);
|
|
wait;
|
|
end process;
|
|
|
|
SpriteChannel_RegisterFile_inst : entity work.RegisterFile
|
|
generic map(
|
|
G_SpriteAddrWidth => G_SpriteIDWidth,
|
|
G_LineData_Width => G_SpriteLineWidth,
|
|
G_X_Width => G_XWidth,
|
|
G_Y_Width => G_YWidth
|
|
)
|
|
port map(
|
|
I_CLK => I_CLK,
|
|
I_CE => I_CE,
|
|
I_RST => I_RST,
|
|
I_SpriteAddr_WE => I_SpriteID_WE,
|
|
I_SpriteAddr => I_SpriteID,
|
|
I_X_We => I_X_WE,
|
|
I_X => I_X,
|
|
I_Y_WE => I_Y_WE,
|
|
I_Y => I_Y,
|
|
I_CachedLineData_WE => I_SpriteLine_WE,
|
|
I_CachedLineData => I_SpriteLine,
|
|
I_CacheValid_WE => I_SpriteLineValid_WE,
|
|
I_CacheValid => I_SpriteLineValid,
|
|
O_SpriteAddr => O_SpriteID,
|
|
O_X => O_X,
|
|
O_Y => O_Y,
|
|
O_CachedRowData => O_SpriteLine,
|
|
O_CacheValid => O_SpriteLineValid
|
|
);
|
|
|
|
StimulusProc : process
|
|
variable i : integer;
|
|
begin
|
|
-- Init
|
|
i := 0;
|
|
I_CE <= '1';
|
|
I_RST <= '1';
|
|
I_SpriteID_WE <= '0';
|
|
I_SpriteID <= (others => '0');
|
|
I_X_WE <= '0';
|
|
I_X <= (others => '0');
|
|
I_Y_WE <= '0';
|
|
I_Y <= (others => '0');
|
|
I_SpriteLine_WE <= '0';
|
|
I_SpriteLine <= (others => '0');
|
|
I_SpriteLineValid_WE <= '0';
|
|
I_SpriteLineValid <= '0';
|
|
wait for K_CLKPeriod * 2;
|
|
I_RST <= '0';
|
|
wait for K_CLKPeriod * 2;
|
|
|
|
for i in TestValues'range loop
|
|
-- WRITE phase
|
|
I_SpriteID <= std_logic_vector(to_unsigned(TestValues(i).SpriteID, G_SpriteIDWidth));
|
|
I_SpriteID_WE <= '1';
|
|
I_X <= std_logic_vector(to_unsigned(TestValues(i).X, G_XWidth));
|
|
I_X_WE <= '1';
|
|
I_Y <= std_logic_vector(to_unsigned(TestValues(i).Y, G_YWidth));
|
|
I_Y_WE <= '1';
|
|
I_SpriteLine <= std_logic_vector(to_unsigned(TestValues(i).SpriteLine, G_SpriteLineWidth));
|
|
I_SpriteLine_WE <= '1';
|
|
I_SpriteLineValid <= TestValues(i).SpriteLineValid;
|
|
I_SpriteLineValid_WE <= '1';
|
|
|
|
wait until rising_edge(I_CLK);
|
|
-- deactivate write signals
|
|
I_SpriteID_WE <= '0';
|
|
I_X_WE <= '0';
|
|
I_Y_WE <= '0';
|
|
I_SpriteLine_WE <= '0';
|
|
I_SpriteLineValid_WE <= '0';
|
|
|
|
wait for K_CLKPeriod;
|
|
|
|
-- READ and CHECK
|
|
assert O_SpriteID = std_logic_vector(to_unsigned(TestValues(i).SpriteID, G_SpriteIDWidth))
|
|
report "Fehler: SpriteID falsch bei Test " & integer'image(i)
|
|
severity error;
|
|
|
|
assert O_X = std_logic_vector(to_unsigned(TestValues(i).X, G_XWidth))
|
|
report "Fehler: X falsch bei Test " & integer'image(i)
|
|
severity error;
|
|
|
|
assert O_Y = std_logic_vector(to_unsigned(TestValues(i).Y, G_YWidth))
|
|
report "Fehler: Y falsch bei Test " & integer'image(i)
|
|
severity error;
|
|
|
|
assert O_SpriteLine = std_logic_vector(to_unsigned(TestValues(i).SpriteLine, G_SpriteLineWidth))
|
|
report "Fehler: SpriteLine falsch bei Test " & integer'image(i)
|
|
severity error;
|
|
|
|
assert O_SpriteLineValid = TestValues(i).SpriteLineValid
|
|
report "Fehler: SpriteLineValid falsch bei Test " & integer'image(i)
|
|
severity error;
|
|
|
|
report "Test " & integer'image(i) & " erfolgreich." severity note;
|
|
wait for K_CLKPeriod;
|
|
end loop;
|
|
|
|
report "Alle Tests abgeschlossen." severity note;
|
|
TestDone <= true;
|
|
wait;
|
|
end process;
|
|
end;
|