Add testbench and configuration files for SpriteChannel and YHitCheck modules

Not functional yet
This commit is contained in:
2025-04-21 15:37:01 +00:00
parent ad32ff0374
commit 49be0b81a0
9 changed files with 1431 additions and 345 deletions

View File

@@ -1,345 +0,0 @@
library ieee;
use ieee.std_logic_1164.all;
--@ Priority Encoder (2 to 1 bits)
--@ This is a combinatorial priority encoder that encodes the highest priority
--@ bit in the input vector to a 1-bit output code.
entity PriorityEncoder_2 is
port (
--@ Input vector to be encoded.
--@ The least significant bit has the highest priority.
I_Select : in std_logic_vector(1 downto 0) := (others => '0');
--@ Output code.
--@ The output code is the index of the highest priority bit in the input vector.
O_Code : out std_logic_vector(0 downto 0) := (others => '0')
);
end entity PriorityEncoder_2;
architecture Combinatoric of PriorityEncoder_2 is
--@ Internal signal to hold the encoded output.
signal C_Code : std_logic_vector(0 downto 0);
--@ Attribute to force the synthesis tool (XST, old Parser) to treat this as a combinatorial signal.
attribute PRIORITY_EXTRACT : string;
attribute PRIORITY_EXTRACT of C_Code : signal is "force";
begin
C_Code <= "0" when I_Select(1) = '1' else
"1" when I_Select(0) = '1' else
"-";
O_Code <= C_Code;
end architecture;
library ieee;
use ieee.std_logic_1164.all;
--@ Priority Encoder (4 to 2 bits)
--@ This is a combinatorial priority encoder that encodes the highest priority
--@ bit in the input vector to a 2-bit output code.
entity PriorityEncoder_4 is
port (
--@ Input vector to be encoded.
--@ The least significant bit has the highest priority.
I_Select : in std_logic_vector(3 downto 0) := (others => '0');
--@ Output code.
--@ The output code is the index of the highest priority bit in the input vector.
O_Code : out std_logic_vector(1 downto 0) := (others => '0')
);
end entity PriorityEncoder_4;
architecture Combinatoric of PriorityEncoder_4 is
--@ Internal signal to hold the encoded output.
signal C_Code : std_logic_vector(1 downto 0);
--@ Attribute to force the synthesis tool (XST, old Parser) to treat this as a combinatorial signal.
attribute PRIORITY_EXTRACT : string;
attribute PRIORITY_EXTRACT of C_Code : signal is "force";
begin
C_Code <= "00" when I_Select(3) = '1' else
"01" when I_Select(2) = '1' else
"10" when I_Select(1) = '1' else
"11" when I_Select(0) = '1' else
"--";
O_Code <= C_Code;
end architecture;
library ieee;
use ieee.std_logic_1164.all;
--@ Priority Encoder (8 to 3 bits)
--@ This is a combinatorial priority encoder that encodes the highest priority
--@ bit in the input vector to a 3-bit output code.
entity PriorityEncoder_8 is
port (
--@ Input vector to be encoded.
--@ The least significant bit has the highest priority.
I_Select : in std_logic_vector(7 downto 0) := (others => '0');
--@ Output code.
--@ The output code is the index of the highest priority bit in the input vector.
O_Code : out std_logic_vector(2 downto 0) := (others => '0')
);
end entity PriorityEncoder_8;
architecture Combinatoric of PriorityEncoder_8 is
--@ Internal signal to hold the encoded output.
signal C_Code : std_logic_vector(2 downto 0);
--@ Attribute to force the synthesis tool (XST, old Parser) to treat this as a combinatorial signal.
attribute PRIORITY_EXTRACT : string;
attribute PRIORITY_EXTRACT of C_Code : signal is "force";
begin
C_Code <= "000" when I_Select(7) = '1' else
"001" when I_Select(6) = '1' else
"010" when I_Select(5) = '1' else
"011" when I_Select(4) = '1' else
"100" when I_Select(3) = '1' else
"101" when I_Select(2) = '1' else
"110" when I_Select(1) = '1' else
"111" when I_Select(0) = '1' else
"---";
O_Code <= C_Code;
end architecture;
library ieee;
use ieee.std_logic_1164.all;
--@ Priority Encoder (16 to 4 bits)
--@ This is a combinatorial priority encoder that encodes the highest priority
--@ bit in the input vector to a 4-bit output code.
entity PriorityEncoder_16 is
port (
--@ Input vector to be encoded.
--@ The least significant bit has the highest priority.
I_Select : in std_logic_vector(15 downto 0) := (others => '0');
--@ Output code.
--@ The output code is the index of the highest priority bit in the input vector.
O_Code : out std_logic_vector(3 downto 0) := (others => '0')
);
end entity PriorityEncoder_16;
architecture Combinatoric of PriorityEncoder_16 is
--@ Internal signal to hold the encoded output.
signal C_Code : std_logic_vector(3 downto 0);
--@ Attribute to force the synthesis tool (XST, old Parser) to treat this as a combinatorial signal.
attribute PRIORITY_EXTRACT : string;
attribute PRIORITY_EXTRACT of C_Code : signal is "force";
begin
C_Code <= "0000" when I_Select(15) = '1' else
"0001" when I_Select(14) = '1' else
"0010" when I_Select(13) = '1' else
"0011" when I_Select(12) = '1' else
"0100" when I_Select(11) = '1' else
"0101" when I_Select(10) = '1' else
"0110" when I_Select(9) = '1' else
"0111" when I_Select(8) = '1' else
"1000" when I_Select(7) = '1' else
"1001" when I_Select(6) = '1' else
"1010" when I_Select(5) = '1' else
"1011" when I_Select(4) = '1' else
"1100" when I_Select(3) = '1' else
"1101" when I_Select(2) = '1' else
"1110" when I_Select(1) = '1' else
"1111" when I_Select(0) = '1' else
"----";
O_Code <= C_Code;
end architecture;
library ieee;
use ieee.std_logic_1164.all;
--@ Priority Encoder (32 to 5 bits)
--@ This is a combinatorial priority encoder that encodes the highest priority
--@ bit in the input vector to a 5-bit output code.
entity PriorityEncoder_32 is
port (
--@ Input vector to be encoded.
--@ The least significant bit has the highest priority.
I_Select : in std_logic_vector(31 downto 0) := (others => '0');
--@ Output code.
--@ The output code is the index of the highest priority bit in the input vector.
O_Code : out std_logic_vector(4 downto 0) := (others => '0')
);
end entity PriorityEncoder_32;
architecture Combinatoric of PriorityEncoder_32 is
--@ Internal signal to hold the encoded output.
signal C_Code : std_logic_vector(4 downto 0);
--@ Attribute to force the synthesis tool (XST, old Parser) to treat this as a combinatorial signal.
attribute PRIORITY_EXTRACT : string;
attribute PRIORITY_EXTRACT of C_Code : signal is "force";
begin
C_Code <= "00000" when I_Select(31) = '1' else
"00001" when I_Select(30) = '1' else
"00010" when I_Select(29) = '1' else
"00011" when I_Select(28) = '1' else
"00100" when I_Select(27) = '1' else
"00101" when I_Select(26) = '1' else
"00110" when I_Select(25) = '1' else
"00111" when I_Select(24) = '1' else
"01000" when I_Select(23) = '1' else
"01001" when I_Select(22) = '1' else
"01010" when I_Select(21) = '1' else
"01011" when I_Select(20) = '1' else
"01100" when I_Select(19) = '1' else
"01101" when I_Select(18) = '1' else
"01110" when I_Select(17) = '1' else
"01111" when I_Select(16) = '1' else
"10000" when I_Select(15) = '1' else
"10001" when I_Select(14) = '1' else
"10010" when I_Select(13) = '1' else
"10011" when I_Select(12) = '1' else
"10100" when I_Select(11) = '1' else
"10101" when I_Select(10) = '1' else
"10110" when I_Select(9) = '1' else
"10111" when I_Select(8) = '1' else
"11000" when I_Select(7) = '1' else
"11001" when I_Select(6) = '1' else
"11010" when I_Select(5) = '1' else
"11011" when I_Select(4) = '1' else
"11100" when I_Select(3) = '1' else
"11101" when I_Select(2) = '1' else
"11110" when I_Select(1) = '1' else
"11111" when I_Select(0) = '1' else
"-----";
O_Code <= C_Code;
end architecture;
library ieee;
use ieee.std_logic_1164.all;
--@ Priority Encoder (64 to 6 bits)
--@ This is a combinatorial priority encoder that encodes the highest priority
--@ bit in the input vector to a 6-bit output code.
entity PriorityEncoder_64 is
port (
--@ Input vector to be encoded.
--@ The least significant bit has the highest priority.
I_Select : in std_logic_vector(63 downto 0) := (others => '0');
--@ Output code.
--@ The output code is the index of the highest priority bit in the input vector.
O_Code : out std_logic_vector(5 downto 0) := (others => '0')
);
end entity PriorityEncoder_64;
architecture Combinatoric of PriorityEncoder_64 is
--@ Internal signal to hold the encoded output.
signal C_Code : std_logic_vector(5 downto 0);
--@ Attribute to force the synthesis tool (XST, old Parser) to treat this as a combinatorial signal.
attribute PRIORITY_EXTRACT : string;
attribute PRIORITY_EXTRACT of C_Code : signal is "force";
begin
C_Code <= "000000" when I_Select(63) = '1' else
"000001" when I_Select(62) = '1' else
"000010" when I_Select(61) = '1' else
"000011" when I_Select(60) = '1' else
"000100" when I_Select(59) = '1' else
"000101" when I_Select(58) = '1' else
"000110" when I_Select(57) = '1' else
"000111" when I_Select(56) = '1' else
"001000" when I_Select(55) = '1' else
"001001" when I_Select(54) = '1' else
"001010" when I_Select(53) = '1' else
"001011" when I_Select(52) = '1' else
"001100" when I_Select(51) = '1' else
"001101" when I_Select(50) = '1' else
"001110" when I_Select(49) = '1' else
"001111" when I_Select(48) = '1' else
"010000" when I_Select(47) = '1' else
"010001" when I_Select(46) = '1' else
"010010" when I_Select(45) = '1' else
"010011" when I_Select(44) = '1' else
"010100" when I_Select(43) = '1' else
"010101" when I_Select(42) = '1' else
"010110" when I_Select(41) = '1' else
"010111" when I_Select(40) = '1' else
"011000" when I_Select(39) = '1' else
"011001" when I_Select(38) = '1' else
"011010" when I_Select(37) = '1' else
"011011" when I_Select(36) = '1' else
"011100" when I_Select(35) = '1' else
"011101" when I_Select(34) = '1' else
"011110" when I_Select(33) = '1' else
"011111" when I_Select(32) = '1' else
"100000" when I_Select(31) = '1' else
"100001" when I_Select(30) = '1' else
"100010" when I_Select(29) = '1' else
"100011" when I_Select(28) = '1' else
"100100" when I_Select(27) = '1' else
"100101" when I_Select(26) = '1' else
"100110" when I_Select(25) = '1' else
"100111" when I_Select(24) = '1' else
"101000" when I_Select(23) = '1' else
"101001" when I_Select(22) = '1' else
"101010" when I_Select(21) = '1' else
"101011" when I_Select(20) = '1' else
"101100" when I_Select(19) = '1' else
"101101" when I_Select(18) = '1' else
"101110" when I_Select(17) = '1' else
"101111" when I_Select(16) = '1' else
"110000" when I_Select(15) = '1' else
"110001" when I_Select(14) = '1' else
"110010" when I_Select(13) = '1' else
"110011" when I_Select(12) = '1' else
"110100" when I_Select(11) = '1' else
"110101" when I_Select(10) = '1' else
"110110" when I_Select(9) = '1' else
"110111" when I_Select(8) = '1' else
"111000" when I_Select(7) = '1' else
"111001" when I_Select(6) = '1' else
"111010" when I_Select(5) = '1' else
"111011" when I_Select(4) = '1' else
"111100" when I_Select(3) = '1' else
"111101" when I_Select(2) = '1' else
"111110" when I_Select(1) = '1' else
"111111" when I_Select(0) = '1' else
"------";
O_Code <= C_Code;
end architecture;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;
--@ Priority Encoder (Generic)
--@ This is a combinatorial priority encoder that encodes the highest priority
--@ bit in the input vector to a 6-bit output code.
entity PriorityEncoder_G is
generic (
--@ Code width with minimum 2 bits and maximum 6 bits.
G_CodeWidth : integer := 6
);
port (
--@ Input vector to be encoded.
--@ The least significant bit has the highest priority.
I_Select : in std_logic_vector(2 ** G_CodeWidth - 1 downto 0);
--@ Output code.
--@ The output code is the index of the highest priority bit in the input vector.
O_Code : out std_logic_vector(G_CodeWidth - 1 downto 0)
);
end entity PriorityEncoder_G;
architecture Combinatoric of PriorityEncoder_G is
signal C_Select : std_logic_vector(63 downto 0) := (others => '-');
signal C_Code : std_logic_vector(5 downto 0) := (others => '-');
begin
entity_inst : entity work.PriorityEncoder_64
port map(
I_Select => C_Select,
O_Code => C_Code
);
C_Select(G_CodeWidth * 2 - 1 downto 0) <= I_Select;
O_Code <= C_Code(G_CodeWidth - 1 downto 0);
end architecture;

221
test/OPDecoder_tb.vhd Normal file
View File

@@ -0,0 +1,221 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.OPCodes.all;
use std.env.stop;
entity OPDecoder_tb is
end entity OPDecoder_tb;
architecture bench of OPDecoder_tb is
-- Clock period
constant K_CLKPeriod : time := 10 ns;
-- Generics
constant G_OPCodeData_Width : integer := 10;
constant G_ROM_DataWidth : integer := 16;
constant G_Index_Width : integer := 6;
constant G_Offset_Width : integer := 4;
constant G_LineData_Width : integer := 16;
constant G_X_Width : integer := 10;
constant G_Y_Width : integer := 10;
constant G_Sprite_Height : integer := 16;
constant G_PipelineStages : integer := 2;
-- Ports
signal I_CLK : std_logic;
signal I_CE : std_logic;
signal I_RST : std_logic;
signal I_OP_Valid : std_logic := '0';
signal O_OP_Ready : std_logic := '0';
signal I_OP_Code : std_logic_vector(3 downto 0) := (others => '0');
signal I_OP_Data : std_logic_vector(G_OPCodeData_Width - 1 downto 0) := (others => '0');
signal O_Register_Index_WE : std_logic := '0';
signal O_Register_Index : std_logic_vector(G_Index_Width - 1 downto 0) := (others => '0');
signal O_Register_Offset_WE : std_logic := '0';
signal O_Register_Offset : std_logic_vector(G_Offset_Width - 1 downto 0) := (others => '0');
signal O_Register_X_We : std_logic := '0';
signal O_Register_X : std_logic_vector(G_X_Width - 1 downto 0) := (others => '0');
signal O_Register_Y_WE : std_logic := '0';
signal O_Register_Y : std_logic_vector(G_Y_Width - 1 downto 0) := (others => '0');
signal O_Register_CachedLineData_WE : std_logic := '0';
signal O_Register_CachedLineData : std_logic_vector(G_LineData_Width - 1 downto 0) := (others => '0');
signal O_Register_CacheValid_WE : std_logic := '0';
signal O_Register_CacheValid : std_logic := '0';
signal I_YHitCheck_Ready : std_logic := '0';
signal O_YHitCheck_Valid : std_logic := '0';
signal O_YHitCheck_YToCheck : std_logic_vector(G_Y_Width - 1 downto 0) := (others => '0');
signal O_YHitCheck_Ready : std_logic := '0';
signal I_YHitCheck_Valid : std_logic := '0';
signal I_YHitCheck_IsVisible : std_logic := '0';
signal I_YHitCheck_Offset : std_logic_vector(G_Offset_Width - 1 downto 0) := (others => '0');
signal O_Rom_Valid : std_logic := '0';
signal I_Rom_Ready : std_logic := '0';
signal I_Rom_Valid : std_logic := '0';
signal O_Rom_Ready : std_logic := '0';
signal I_Rom_Data : std_logic_vector(G_ROM_DataWidth - 1 downto 0) := (others => '0');
signal O_CalcPipeline_Valid : std_logic := '0';
signal I_CalcPipeline_Ready : std_logic := '0';
signal O_CalcPipeline_X : std_logic_vector(G_X_Width - 1 downto 0) := (others => '0');
signal R1, R2 : std_logic := '0';
signal TestDone : boolean := false;
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;
i_OPDecoder : entity work.OPDecoder
generic map(
G_OPCodeData_Width => G_OPCodeData_Width,
G_ROM_DataWidth => G_ROM_DataWidth,
G_Index_Width => G_Index_Width,
G_Offset_Width => G_Offset_Width,
G_LineData_Width => G_LineData_Width,
G_X_Width => G_X_Width,
G_Y_Width => G_Y_Width
)
port map(
I_CLK => I_CLK,
I_CE => I_CE,
I_RST => I_RST,
I_OP_Valid => I_OP_Valid,
O_OP_Ready => O_OP_Ready,
I_OP_Code => I_OP_Code,
I_OP_Data => I_OP_Data,
O_Register_Index_WE => O_Register_Index_WE,
O_Register_Index => O_Register_Index,
O_Register_Offset_WE => O_Register_Offset_WE,
O_Register_Offset => O_Register_Offset,
O_Register_X_We => O_Register_X_We,
O_Register_X => O_Register_X,
O_Register_Y_WE => O_Register_Y_WE,
O_Register_Y => O_Register_Y,
O_Register_CachedLineData_WE => O_Register_CachedLineData_WE,
O_Register_CachedLineData => O_Register_CachedLineData,
O_Register_CacheValid_WE => O_Register_CacheValid_WE,
O_Register_CacheValid => O_Register_CacheValid,
I_YHitCheck_Ready => I_YHitCheck_Ready,
O_YHitCheck_Valid => O_YHitCheck_Valid,
O_YHitCheck_YToCheck => O_YHitCheck_YToCheck,
O_YHitCheck_Ready => O_YHitCheck_Ready,
I_YHitCheck_Valid => I_YHitCheck_Valid,
I_YHitCheck_IsVisible => I_YHitCheck_IsVisible,
I_YHitCheck_Offset => I_YHitCheck_Offset,
O_Rom_Valid => O_Rom_Valid,
I_Rom_Ready => I_Rom_Ready,
I_Rom_Valid => I_Rom_Valid,
O_Rom_Ready => O_Rom_Ready,
I_Rom_Data => I_Rom_Data,
O_HSpritePipeline_Valid => O_CalcPipeline_Valid,
I_HSpritePipeline_Ready => I_CalcPipeline_Ready,
O_HSpritePipeline_X_Request => O_CalcPipeline_X
);
I_CalcPipeline_Ready <= O_CalcPipeline_Valid;
i_YHitCheck : entity work.VerticalSpritePipeline
generic map(
G_Y_Width => G_Y_Width,
G_Sprite_Height => G_Sprite_Height,
G_Offset_Width => G_Offset_Width,
G_PipelineStages => G_PipelineStages
)
port map(
I_CLK => I_CLK,
I_CE => I_CE,
O_Ready => I_YHitCheck_Ready,
I_Valid => O_YHitCheck_Valid,
I_YToCheck => O_YHitCheck_YToCheck,
I_Y => "0000000000",
I_Ready => O_YHitCheck_Ready,
O_Valid => I_YHitCheck_Valid,
O_IsVisible => I_YHitCheck_IsVisible,
O_Offset => I_YHitCheck_Offset
);
StimulusProc : process
type T_OpTest is record
Code : std_logic_vector(3 downto 0);
Data : std_logic_vector(G_OPCodeData_Width - 1 downto 0);
Name : string(1 to 20);
end record;
type T_OpTestArray is array (natural range <>) of T_OpTest;
constant TestCases : T_OpTestArray := (
0 => (K_OP_NOP, (others => '0'), "NOP "),
1 => (K_OP_SET_ID, std_logic_vector(to_unsigned(2, G_OPCodeData_Width)), "SET_ID "),
2 => (K_OP_SET_X, std_logic_vector(to_unsigned(3, G_OPCodeData_Width)), "SET_X "),
3 => (K_OP_SET_Y, std_logic_vector(to_unsigned(4, G_OPCodeData_Width)), "SET_Y "),
4 => (K_OP_CLEAR_ALL, (others => '1'), "CLEAR_ALL "),
6 => (K_OP_REQ_ROW_DATA, std_logic_vector(to_unsigned(5, G_OPCodeData_Width)), "REQ_ROW_DATA "),
5 => (K_OP_NEWLINE, std_logic_vector(to_unsigned(1, G_Y_Width)), "NEWLINE ")
);
variable i : integer;
begin
-- Init
I_RST <= '1';
I_CE <= '1';
wait for K_CLKPeriod * 2;
I_RST <= '0';
wait for K_CLKPeriod * 2;
for i in TestCases'range loop
-- Warte auf Ready
wait until rising_edge(I_CLK);
while O_OP_Ready /= '1' loop
wait until rising_edge(I_CLK);
end loop;
I_OP_Code <= TestCases(i).Code;
I_OP_Data <= TestCases(i).Data;
I_OP_Valid <= '1';
wait until rising_edge(I_CLK);
I_OP_Valid <= '0';
-- Einfach ein bisschen warten, bis Modul durch ist
-- wait for K_CLKPeriod * 5;
report "Opcode-Test: " & TestCases(i).Name & " abgeschlossen." severity note;
end loop;
report "Alle OPCodes getestet." severity note;
TestDone <= true;
wait;
end process;
-- ROM Simulation: immer gültig, gibt X"FFFF" zurück
RomProcess : process (I_CLK)
begin
if rising_edge(I_CLK) then
if I_CE = '1' then
-- Standard: nichts tun
I_Rom_Valid <= '0';
I_Rom_Data <= (others => '0');
-- Prüfen, ob Decoder Daten anfordert
if O_Rom_Valid = '1' then
I_Rom_Valid <= '1';
I_Rom_Data <= (others => '1'); -- z.B. X"FFFF"
end if;
end if;
end if;
end process;
-- ROM ist immer bereit
I_Rom_Ready <= '1';
end architecture;

View File

@@ -0,0 +1,176 @@
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;

View File

@@ -0,0 +1,199 @@
<?xml version="1.0" encoding="UTF-8"?>
<wave_config>
<wave_state>
</wave_state>
<db_ref_list>
<db_ref path="./isim1.wdb" id="1" type="auto">
<top_modules>
<top_module name="env" />
<top_module name="glbl" />
<top_module name="math_real" />
<top_module name="numeric_std" />
<top_module name="opcodes" />
<top_module name="spritechannel_tb" />
<top_module name="spriterom" />
<top_module name="std_logic_1164" />
</top_modules>
</db_ref>
</db_ref_list>
<WVObjectSize size="30" />
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_clk" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_clk</obj_property>
<obj_property name="ObjectShortName">i_clk</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_ce" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_ce</obj_property>
<obj_property name="ObjectShortName">i_ce</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_rst" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_rst</obj_property>
<obj_property name="ObjectShortName">i_rst</obj_property>
</wvobject>
<wvobject fp_name="group223" type="group">
<obj_property name="label">Input_OP</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_op_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_op_valid</obj_property>
<obj_property name="ObjectShortName">i_op_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/o_op_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_op_ready</obj_property>
<obj_property name="ObjectShortName">o_op_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_op_x_request" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_op_x_request[9:0]</obj_property>
<obj_property name="ObjectShortName">i_op_x_request[9:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_op_index" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_op_index[4:0]</obj_property>
<obj_property name="ObjectShortName">i_op_index[4:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_op_offset" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_op_offset[7:0]</obj_property>
<obj_property name="ObjectShortName">i_op_offset[7:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_op_x_sprite" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_op_x_sprite[9:0]</obj_property>
<obj_property name="ObjectShortName">i_op_x_sprite[9:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/o_rom_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_rom_valid</obj_property>
<obj_property name="ObjectShortName">o_rom_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_rom_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_rom_ready</obj_property>
<obj_property name="ObjectShortName">i_rom_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/o_rom_address" type="array" db_ref_id="1">
<obj_property name="ElementShortName">o_rom_address[12:0]</obj_property>
<obj_property name="ObjectShortName">o_rom_address[12:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_rom_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_rom_valid</obj_property>
<obj_property name="ObjectShortName">i_rom_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/o_rom_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_rom_ready</obj_property>
<obj_property name="ObjectShortName">o_rom_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_rom_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_rom_data[7:0]</obj_property>
<obj_property name="ObjectShortName">i_rom_data[7:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/o_pixel_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_pixel_valid</obj_property>
<obj_property name="ObjectShortName">o_pixel_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_pixel_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_pixel_ready</obj_property>
<obj_property name="ObjectShortName">i_pixel_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/o_pixel_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">o_pixel_data[7:0]</obj_property>
<obj_property name="ObjectShortName">o_pixel_data[7:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/k_pipelinestages" type="other" db_ref_id="1">
<obj_property name="ElementShortName">k_pipelinestages</obj_property>
<obj_property name="ObjectShortName">k_pipelinestages</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/r_index" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_index[4:0]</obj_property>
<obj_property name="ObjectShortName">r_index[4:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/r_offset" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_offset[7:0]</obj_property>
<obj_property name="ObjectShortName">r_offset[7:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/r_x_request" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_x_request[9:0]</obj_property>
<obj_property name="ObjectShortName">r_x_request[9:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/r_x_sprite" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_x_sprite[9:0]</obj_property>
<obj_property name="ObjectShortName">r_x_sprite[9:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/r_address" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_address[12:0]</obj_property>
<obj_property name="ObjectShortName">r_address[12:0]</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/r_x_visible" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">r_x_visible</obj_property>
<obj_property name="ObjectShortName">r_x_visible</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/c_address" type="array" db_ref_id="1">
<obj_property name="ElementShortName">c_address[12:0]</obj_property>
<obj_property name="ObjectShortName">c_address[12:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/s_calculatingpipeline_enable" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">s_calculatingpipeline_enable</obj_property>
<obj_property name="ObjectShortName">s_calculatingpipeline_enable</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_calculatingpipeline_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_calculatingpipeline_ready</obj_property>
<obj_property name="ObjectShortName">i_calculatingpipeline_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/o_calculatingpipeline_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_calculatingpipeline_valid</obj_property>
<obj_property name="ObjectShortName">o_calculatingpipeline_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/o_romrequest_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_romrequest_ready</obj_property>
<obj_property name="ObjectShortName">o_romrequest_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/i_romrequest_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_romrequest_valid</obj_property>
<obj_property name="ObjectShortName">i_romrequest_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/I_CalculatingPipeline_Address/r_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_data[0:0]</obj_property>
<obj_property name="ObjectShortName">r_data[0:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/I_CalculatingPipeline_Address/r_data[0]" type="array" db_ref_id="1">
<obj_property name="ElementShortName">[0]</obj_property>
<obj_property name="ObjectShortName">r_data[0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/I_ForwardRomRequest/gen_pipelineregister_d0/I_PielineRegister_D0/r_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_data[0:1]</obj_property>
<obj_property name="ObjectShortName">r_data[0:1]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/I_ForwardRomRequest/gen_pipelineregister_d0/I_PielineRegister_D0/r_data[0]" type="array" db_ref_id="1">
<obj_property name="ElementShortName">[0]</obj_property>
<obj_property name="ObjectShortName">r_data[0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/I_ForwardRomRequest/gen_pipelineregister_d0/I_PielineRegister_D0/r_data[1]" type="array" db_ref_id="1">
<obj_property name="ElementShortName">[1]</obj_property>
<obj_property name="ObjectShortName">r_data[1]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/I_ForwardRomRequest/I_PipelineCtrl/o_enable" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_enable</obj_property>
<obj_property name="ObjectShortName">o_enable</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_CalcPipeline/I_ForwardRomRequest/I_PipelineCtrl/r_valid" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_valid[1:0]</obj_property>
<obj_property name="ObjectShortName">r_valid[1:0]</obj_property>
</wvobject>
</wave_config>

View File

@@ -0,0 +1,292 @@
<?xml version="1.0" encoding="UTF-8"?>
<wave_config>
<wave_state>
</wave_state>
<db_ref_list>
<db_ref path="./isim1.wdb" id="1" type="auto">
<top_modules>
<top_module name="env" />
<top_module name="glbl" />
<top_module name="math_real" />
<top_module name="numeric_std" />
<top_module name="opcodes" />
<top_module name="spritechannel_tb" />
<top_module name="spriterom" />
<top_module name="std_logic_1164" />
</top_modules>
</db_ref>
</db_ref_list>
<WVObjectSize size="38" />
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_clk" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_clk</obj_property>
<obj_property name="ObjectShortName">i_clk</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_ce" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_ce</obj_property>
<obj_property name="ObjectShortName">i_ce</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ffffff</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_rst" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_rst</obj_property>
<obj_property name="ObjectShortName">i_rst</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ffffff</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_op_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_op_valid</obj_property>
<obj_property name="ObjectShortName">i_op_valid</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/o_op_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_op_ready</obj_property>
<obj_property name="ObjectShortName">o_op_ready</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_op_code" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_op_code[3:0]</obj_property>
<obj_property name="ObjectShortName">i_op_code[3:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_op_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_op_data[9:0]</obj_property>
<obj_property name="ObjectShortName">i_op_data[9:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/r_index" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_index[4:0]</obj_property>
<obj_property name="ObjectShortName">r_index[4:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/r_offset" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_offset[7:0]</obj_property>
<obj_property name="ObjectShortName">r_offset[7:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/r_x" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_x[9:0]</obj_property>
<obj_property name="ObjectShortName">r_x[9:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/r_isvisible" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">r_isvisible</obj_property>
<obj_property name="ObjectShortName">r_isvisible</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_p0_address_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_p0_address_valid</obj_property>
<obj_property name="ObjectShortName">oi_p0_address_valid</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/io_p0_address_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">io_p0_address_ready</obj_property>
<obj_property name="ObjectShortName">io_p0_address_ready</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_p0_address" type="array" db_ref_id="1">
<obj_property name="ElementShortName">oi_p0_address[12:0]</obj_property>
<obj_property name="ObjectShortName">oi_p0_address[12:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/io_p0_data_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">io_p0_data_valid</obj_property>
<obj_property name="ObjectShortName">io_p0_data_valid</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_p0_data_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_p0_data_ready</obj_property>
<obj_property name="ObjectShortName">oi_p0_data_ready</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/io_p0_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">io_p0_data[7:0]</obj_property>
<obj_property name="ObjectShortName">io_p0_data[7:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_register_index_we" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_register_index_we</obj_property>
<obj_property name="ObjectShortName">oi_register_index_we</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_register_index" type="array" db_ref_id="1">
<obj_property name="ElementShortName">oi_register_index[4:0]</obj_property>
<obj_property name="ObjectShortName">oi_register_index[4:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_register_offset_we" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_register_offset_we</obj_property>
<obj_property name="ObjectShortName">oi_register_offset_we</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_register_offset" type="array" db_ref_id="1">
<obj_property name="ElementShortName">oi_register_offset[7:0]</obj_property>
<obj_property name="ObjectShortName">oi_register_offset[7:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_register_x_we" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_register_x_we</obj_property>
<obj_property name="ObjectShortName">oi_register_x_we</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_register_x" type="array" db_ref_id="1">
<obj_property name="ElementShortName">oi_register_x[9:0]</obj_property>
<obj_property name="ObjectShortName">oi_register_x[9:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_register_y_we" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_register_y_we</obj_property>
<obj_property name="ObjectShortName">oi_register_y_we</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_register_y" type="array" db_ref_id="1">
<obj_property name="ElementShortName">oi_register_y[9:0]</obj_property>
<obj_property name="ObjectShortName">oi_register_y[9:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_isvisible_we" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_isvisible_we</obj_property>
<obj_property name="ObjectShortName">oi_isvisible_we</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_isvisible" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_isvisible</obj_property>
<obj_property name="ObjectShortName">oi_isvisible</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="divider87" type="divider">
<obj_property name="label">Intern</obj_property>
<obj_property name="DisplayName">label</obj_property>
<obj_property name="BkColor">128 128 255</obj_property>
<obj_property name="TextColor">230 230 230</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/c_nextstate" type="other" db_ref_id="1">
<obj_property name="ElementShortName">c_nextstate</obj_property>
<obj_property name="ObjectShortName">c_nextstate</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/r_state" type="other" db_ref_id="1">
<obj_property name="ElementShortName">r_state</obj_property>
<obj_property name="ObjectShortName">r_state</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/r_op_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_op_data[9:0]</obj_property>
<obj_property name="ObjectShortName">r_op_data[9:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="group83" type="group">
<obj_property name="label">YHitCheck</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/o_yhitcheck_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_yhitcheck_valid</obj_property>
<obj_property name="ObjectShortName">o_yhitcheck_valid</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#00ff00</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_yhitcheck_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_yhitcheck_ready</obj_property>
<obj_property name="ObjectShortName">i_yhitcheck_ready</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#00ff00</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/o_yhitcheck_ytocheck" type="array" db_ref_id="1">
<obj_property name="ElementShortName">o_yhitcheck_ytocheck[9:0]</obj_property>
<obj_property name="ObjectShortName">o_yhitcheck_ytocheck[9:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#00ff00</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/r_y" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_y[9:0]</obj_property>
<obj_property name="ObjectShortName">r_y[9:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#00ff00</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/o_yhitcheck_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_yhitcheck_ready</obj_property>
<obj_property name="ObjectShortName">o_yhitcheck_ready</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_yhitcheck_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_yhitcheck_valid</obj_property>
<obj_property name="ObjectShortName">i_yhitcheck_valid</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_yhitcheck_isvisible" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_yhitcheck_isvisible</obj_property>
<obj_property name="ObjectShortName">i_yhitcheck_isvisible</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_yhitcheck_offset" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_yhitcheck_offset[7:0]</obj_property>
<obj_property name="ObjectShortName">i_yhitcheck_offset[7:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_calcpipeline_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">oi_calcpipeline_valid</obj_property>
<obj_property name="ObjectShortName">oi_calcpipeline_valid</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/io_calcpipeline_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">io_calcpipeline_ready</obj_property>
<obj_property name="ObjectShortName">io_calcpipeline_ready</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/oi_calcpipeline_x_request" type="array" db_ref_id="1">
<obj_property name="ElementShortName">oi_calcpipeline_x_request[9:0]</obj_property>
<obj_property name="ObjectShortName">oi_calcpipeline_x_request[9:0]</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#008080</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/o_pixel_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_pixel_valid</obj_property>
<obj_property name="ObjectShortName">o_pixel_valid</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_pixel_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_pixel_ready</obj_property>
<obj_property name="ObjectShortName">i_pixel_ready</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/o_pixel_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">o_pixel_data[7:0]</obj_property>
<obj_property name="ObjectShortName">o_pixel_data[7:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
<obj_property name="UseCustomSignalColor">true</obj_property>
<obj_property name="CustomSignalColor">#ff0000</obj_property>
</wvobject>
</wave_config>

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<wave_config>
<wave_state>
</wave_state>
<db_ref_list>
<db_ref path="./isim.wdb" id="1" type="auto">
<top_modules>
<top_module name="env" />
<top_module name="glbl" />
<top_module name="math_real" />
<top_module name="numeric_std" />
<top_module name="opcodes" />
<top_module name="spritechannel_tb" />
<top_module name="spriterom" />
<top_module name="std_logic_1164" />
</top_modules>
</db_ref>
</db_ref_list>
<WVObjectSize size="8" />
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_Rom/i_clk" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_clk</obj_property>
<obj_property name="ObjectShortName">i_clk</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_Rom/i_p0_address_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_p0_address_valid</obj_property>
<obj_property name="ObjectShortName">i_p0_address_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_Rom/o_p0_address_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_p0_address_ready</obj_property>
<obj_property name="ObjectShortName">o_p0_address_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_Rom/i_p0_address" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_p0_address[12:0]</obj_property>
<obj_property name="ObjectShortName">i_p0_address[12:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_Rom/s_p0_address_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">s_p0_address_valid</obj_property>
<obj_property name="ObjectShortName">s_p0_address_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_Rom/c_p0_address_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">c_p0_address_ready</obj_property>
<obj_property name="ObjectShortName">c_p0_address_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_Rom/r_p0_address" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_p0_address[12:0]</obj_property>
<obj_property name="ObjectShortName">r_p0_address[12:0]</obj_property>
<obj_property name="Radix">UNSIGNEDDECRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_Rom/r_p0_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_p0_data[7:0]</obj_property>
<obj_property name="ObjectShortName">r_p0_data[7:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
</wave_config>

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?>
<wave_config>
<wave_state>
</wave_state>
<db_ref_list>
<db_ref path="./isim1.wdb" id="1" type="auto">
<top_modules>
<top_module name="env" />
<top_module name="glbl" />
<top_module name="math_real" />
<top_module name="numeric_std" />
<top_module name="opcodes" />
<top_module name="spritechannel_tb" />
<top_module name="spriterom" />
<top_module name="std_logic_1164" />
</top_modules>
</db_ref>
</db_ref_list>
<WVObjectSize size="7" />
<wvobject fp_name="/spritechannel_tb/i_clk" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_clk</obj_property>
<obj_property name="ObjectShortName">i_clk</obj_property>
</wvobject>
<wvobject fp_name="group91" type="group">
<obj_property name="label">State</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/r_state" type="other" db_ref_id="1">
<obj_property name="ElementShortName">r_state</obj_property>
<obj_property name="ObjectShortName">r_state</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/c_nextstate" type="other" db_ref_id="1">
<obj_property name="ElementShortName">c_nextstate</obj_property>
<obj_property name="ObjectShortName">c_nextstate</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="group94" type="group">
<obj_property name="label">OP Data</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/c_op_data_we" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">c_op_data_we</obj_property>
<obj_property name="ObjectShortName">c_op_data_we</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/r_op_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_op_data[9:0]</obj_property>
<obj_property name="ObjectShortName">r_op_data[9:0]</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="group105" type="group">
<obj_property name="label">Y_HitCheck</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_YHitCheck/I_CalculatingPipelineCtrl/o_enable" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_enable</obj_property>
<obj_property name="ObjectShortName">o_enable</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_YHitCheck/I_CalculatingPipelineCtrl/r_valid" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_valid[3:0]</obj_property>
<obj_property name="ObjectShortName">r_valid[3:0]</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_YHitCheck/I_YToCheck_InputRegister/i_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_data[9:0]</obj_property>
<obj_property name="ObjectShortName">i_data[9:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_YHitCheck/I_YToCheck_InputRegister/r_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_data[0:1]</obj_property>
<obj_property name="ObjectShortName">r_data[0:1]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_YHitCheck/I_YToCheck_InputRegister/o_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">o_data[9:0]</obj_property>
<obj_property name="ObjectShortName">o_data[9:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="group95" type="group">
<obj_property name="label">O_YHitCheck</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/i_yhitcheck_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_yhitcheck_ready</obj_property>
<obj_property name="ObjectShortName">i_yhitcheck_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/o_yhitcheck_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_yhitcheck_valid</obj_property>
<obj_property name="ObjectShortName">o_yhitcheck_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/o_yhitcheck_ytocheck" type="array" db_ref_id="1">
<obj_property name="ElementShortName">o_yhitcheck_ytocheck[9:0]</obj_property>
<obj_property name="ObjectShortName">o_yhitcheck_ytocheck[9:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="group96" type="group">
<obj_property name="label">I_YHitCheck</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/o_yhitcheck_ready" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">o_yhitcheck_ready</obj_property>
<obj_property name="ObjectShortName">o_yhitcheck_ready</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/i_yhitcheck_valid" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_yhitcheck_valid</obj_property>
<obj_property name="ObjectShortName">i_yhitcheck_valid</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/i_yhitcheck_isvisible" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_yhitcheck_isvisible</obj_property>
<obj_property name="ObjectShortName">i_yhitcheck_isvisible</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_OPDecoder/i_yhitcheck_offset" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_yhitcheck_offset[7:0]</obj_property>
<obj_property name="ObjectShortName">i_yhitcheck_offset[7:0]</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="group124" type="group">
<obj_property name="label">Offset</obj_property>
<obj_property name="DisplayName">label</obj_property>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_YHitCheck/I_Offset_OutputRegister/i_enable" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">i_enable</obj_property>
<obj_property name="ObjectShortName">i_enable</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_YHitCheck/I_Offset_OutputRegister/i_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">i_data[7:0]</obj_property>
<obj_property name="ObjectShortName">i_data[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/spritechannel_tb/i_SpriteChannel/i_YHitCheck/I_Offset_OutputRegister/r_data" type="array" db_ref_id="1">
<obj_property name="ElementShortName">r_data[0:1]</obj_property>
<obj_property name="ObjectShortName">r_data[0:1]</obj_property>
</wvobject>
</wvobject>
</wave_config>

194
test/SpriteChannel_tb.vhd Normal file
View File

@@ -0,0 +1,194 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.env.stop;
use work.OPCodes.all;
entity SpriteChannel_tb is
end entity SpriteChannel_tb;
architecture Testbench of SpriteChannel_tb is
function to_hex(v : std_logic_vector) return string is
variable h : string(1 to 8); -- Maximal 8 Hex-Zeichen
variable u : unsigned(v'range) := unsigned(v);
begin
for i in h'range loop
exit when i > (v'length + 3) / 4;
case to_integer(u((v'length - 1) - (i - 1) * 4 downto v'length - i * 4)) is
when 0 => h(i) := '0';
when 1 => h(i) := '1';
when 2 => h(i) := '2';
when 3 => h(i) := '3';
when 4 => h(i) := '4';
when 5 => h(i) := '5';
when 6 => h(i) := '6';
when 7 => h(i) := '7';
when 8 => h(i) := '8';
when 9 => h(i) := '9';
when 10 => h(i) := 'A';
when 11 => h(i) := 'B';
when 12 => h(i) := 'C';
when 13 => h(i) := 'D';
when 14 => h(i) := 'E';
when 15 => h(i) := 'F';
when others => h(i) := '?';
end case;
end loop;
return h(1 to (v'length + 3) / 4);
end;
-- Clock period
constant K_CLKPeriod : time := 10 ns;
-- Generics
constant G_OPCodeData_Width : integer := 10;
constant G_Index_Width : integer := 5;
constant G_Offset_Width : integer := 8;
constant G_X_Width : integer := 10;
constant G_Y_Width : integer := 10;
constant G_Sprite_Height : integer := 16;
constant G_Sprite_Width : integer := 16;
-- Ports
signal I_CLK : std_logic;
signal I_CE : std_logic := '1';
signal I_RST : std_logic := '0';
signal I_OP_Valid : std_logic := '0';
signal O_OP_Ready : std_logic := '0';
signal I_OP_Code : std_logic_vector(3 downto 0) := (others => '0');
signal I_OP_Data : std_logic_vector(G_OPCodeData_Width - 1 downto 0) := (others => '0');
signal O_Pixel_Valid : std_logic := '0';
signal I_Pixel_Ready : std_logic := '0';
signal O_Pixel_Data : std_logic_vector(7 downto 0) := (others => '0');
signal TestDone : boolean := false;
-- Testdaten für Befehle
type T_Command is record
OP_Code : std_logic_vector(3 downto 0);
OP_Data : std_logic_vector(G_OPCodeData_Width - 1 downto 0);
end record;
type T_CommandArray is array (natural range <>) of T_Command;
constant CommandSequence : T_CommandArray := (
(OP_Code => K_OP_NEWLINE, OP_Data => "0000000100"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000000000"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000000001"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000000010"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000000011"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000000100"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000000101"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000000110"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000000111"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000001000"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000001001"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000001010"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000001011"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000001100"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000001101"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000001110"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000001111"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000010000"),
(OP_Code => K_OP_REQ_ROW_DATA, OP_Data => "0000010001")
);
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;
StimulusProc : process
variable i : integer := 0;
begin
-- Initialisierung
I_RST <= '1';
wait for K_CLKPeriod * 2;
I_RST <= '0';
wait for K_CLKPeriod * 2;
-- Befehle senden
for i in CommandSequence'range loop
-- Warten, bis das Modul bereit ist
wait until rising_edge(I_CLK);
while O_OP_Ready /= '1' loop
wait until rising_edge(I_CLK);
end loop;
-- Befehl setzen
I_OP_Code <= CommandSequence(i).OP_Code;
I_OP_Data <= CommandSequence(i).OP_Data;
I_OP_Valid <= '1';
-- Einen Takt warten
wait until rising_edge(I_CLK);
I_OP_Valid <= '0';
-- Warten, bis der Befehl verarbeitet wurde
while O_OP_Ready /= '1' loop
wait until rising_edge(I_CLK);
end loop;
-- Optional: Ergebnisse prüfen (falls relevant)
report "Befehl " & integer'image(i) & " erfolgreich gesendet." severity note;
end loop;
wait for K_CLKPeriod * 10;
-- Test abgeschlossen
report "Alle Befehle erfolgreich gesendet." severity note;
TestDone <= true;
wait;
end process;
AXIReceiverProc : process
variable V_PacketCount : integer := 0;
begin
-- Initialisierung
I_Pixel_Ready <= '1'; -- Signalisiert, dass Daten empfangen werden können
while TestDone = false loop
-- Warten, bis gültige Daten anliegen
wait until rising_edge(I_CLK);
if O_Pixel_Valid = '1' then
report "Empfangenes Paket #" & integer'image(V_PacketCount) &
" (hex): " & to_hex(O_Pixel_Data)
severity note;
V_PacketCount := V_PacketCount + 1;
end if;
end loop;
wait;
end process;
i_SpriteChannel : entity work.SpriteChannel
generic map(
G_OPCodeData_Width => G_OPCodeData_Width,
G_Index_Width => G_Index_Width,
G_Offset_Width => G_Offset_Width,
G_X_Width => G_X_Width,
G_Y_Width => G_Y_Width,
G_Sprite_Height => G_Sprite_Height,
G_Sprite_Width => G_Sprite_Width
)
port map(
I_CLK => I_CLK,
I_CE => I_CE,
I_RST => I_RST,
I_OP_Valid => I_OP_Valid,
O_OP_Ready => O_OP_Ready,
I_OP_Code => I_OP_Code,
I_OP_Data => I_OP_Data,
O_Pixel_Valid => O_Pixel_Valid,
I_Pixel_Ready => I_Pixel_Ready,
O_Pixel_Data => O_Pixel_Data
);
end architecture;

165
test/YHitCheck_tb.vhd Normal file
View File

@@ -0,0 +1,165 @@
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.env.stop;
use work.SpriteRom.all;
entity YHitCheck_tb is
end;
architecture bench of YHitCheck_tb is
-- Clock period
constant K_CLKPeriod : time := 10 ns;
-- Generics
constant G_YWidth : integer := 10;
constant G_SpriteHeight : integer := 16;
-- Ports
signal I_CLK : std_logic := '0';
signal I_CE : std_logic;
signal O_Ready : std_logic;
signal I_Valid : std_logic;
signal I_YToCheck : std_logic_vector(G_YWidth - 1 downto 0);
signal I_Y : std_logic_vector(G_YWidth - 1 downto 0);
signal I_Ready : std_logic;
signal O_Valid : std_logic;
signal O_IsVisible : std_logic;
signal O_Offset : std_logic_vector(7 downto 0);
type T_TestData is record
YToCheck : integer;
SpriteY : integer;
ExpectedVisible : std_logic;
ExpectedOffset : integer; -- NEU
end record;
type T_TestArray is array (natural range <>) of T_TestData;
constant TestValues : T_TestArray := (
(10, 10, '1', 0),
(25, 10, '1', K_SPRITE_ROW_OFFSETS(15)),
(26, 10, '0', 0),
(9, 10, '0', 0),
(15, 0, '1', K_SPRITE_ROW_OFFSETS(15)),
(31, 16, '1', K_SPRITE_ROW_OFFSETS(15)),
(32, 16, '0', 0),
(984, 459, '0', 0),
(360, 972, '0', 0),
(160, 434, '0', 0),
(996, 713, '0', 0),
(63, 184, '0', 0),
(700, 376, '0', 0),
(702, 69, '0', 0),
(583, 181, '0', 0),
(302, 974, '0', 0),
(985, 392, '0', 0),
(0, 0, '1', 0),
(15, 0, '1', K_SPRITE_ROW_OFFSETS(15)),
(16, 0, '0', 0),
(0, 1, '0', 0),
(1023, 1008, '1', K_SPRITE_ROW_OFFSETS(15)),
(1023, 1007, '0', 0),
(1007, 1007, '1', 0),
(1008, 1008, '1', 0),
(1009, 1008, '1', K_SPRITE_ROW_OFFSETS(1)),
(1023, 1008, '1', K_SPRITE_ROW_OFFSETS(15))
);
signal TestDone : boolean := false;
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_YHitCheck_inst : entity work.VerticalSpritePipeline
generic map(
G_Y_Width => G_YWidth,
G_Sprite_Height => G_SpriteHeight
)
port map(
I_CLK => I_CLK,
I_CE => I_CE,
O_Ready => O_Ready,
I_Valid => I_Valid,
I_YToCheck => I_YToCheck,
I_Y => I_Y,
I_Ready => I_Ready,
O_Valid => O_Valid,
O_IsVisible => O_IsVisible,
O_Offset => O_Offset
);
StimulusProc : process
variable i : integer := 0;
begin
-- Init
i := 0;
I_CE <= '1';
I_Valid <= '0';
I_Ready <= '1';
I_Y <= (others => '0');
I_YToCheck <= (others => '0');
wait for K_CLKPeriod * 5;
for i in TestValues'range loop
-- Warte auf Ready
wait until rising_edge(I_CLK);
while O_Ready /= '1' loop
wait until rising_edge(I_CLK);
end loop;
-- Werte setzen
I_Y <= std_logic_vector(to_unsigned(TestValues(i).SpriteY, G_YWidth));
I_YToCheck <= std_logic_vector(to_unsigned(TestValues(i).YToCheck, G_YWidth));
I_Valid <= '1';
wait until rising_edge(I_CLK);
I_Valid <= '0';
-- Warte auf O_Valid
while O_Valid /= '1' loop
wait until rising_edge(I_CLK);
end loop;
-- Ergebnis prüfen
if O_IsVisible /= TestValues(i).ExpectedVisible then
assert false
report "Fehler bei Test " & integer'image(i) &
": SpriteY=" & integer'image(TestValues(i).SpriteY) &
" YToCheck=" & integer'image(TestValues(i).YToCheck) &
" Erwartet Sichtbarkeit=" & std_logic'image(TestValues(i).ExpectedVisible) &
" Tatsaechlich=" & std_logic'image(O_IsVisible)
severity error;
elsif O_IsVisible = '1' then
-- Nur prüfen, wenn sichtbar
if to_integer(unsigned(O_Offset)) /= TestValues(i).ExpectedOffset then
assert false
report "Fehler bei Test " & integer'image(i) &
": Falscher Offset. Erwartet=" & integer'image(TestValues(i).ExpectedOffset) &
" Tatsaechlich=" & integer'image(to_integer(unsigned(O_Offset)))
severity error;
else
report "Test " & integer'image(i) & " erfolgreich." severity note;
end if;
else
-- Unsichtbarer Fall, Sichtbarkeit korrekt => Erfolg
report "Test " & integer'image(i) & " erfolgreich." severity note;
end if;
wait for K_CLKPeriod * 2;
end loop;
report "Alle Tests abgeschlossen." severity note;
TestDone <= true;
wait;
end process;
end;