Introduces the PipelineSwitch component with configurable routing behavior based on input comparison modes. Implements modes such as "none", "or", "and", "xor", "equal", and others. Adds a comprehensive testbench to validate functionality across all supported modes.
517 lines
20 KiB
VHDL
517 lines
20 KiB
VHDL
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
use ieee.math_real.all;
|
|
|
|
entity PipelineSwitch_tb is
|
|
end entity PipelineSwitch_tb;
|
|
|
|
architecture RTL of PipelineSwitch_tb is
|
|
constant G_MaskWidth : integer := 4;
|
|
constant G_Mask : std_logic_vector(G_MaskWidth - 1 downto 0) := "1101";
|
|
|
|
-- === Signals for mode "none" ===
|
|
signal I_Match_none : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_none : std_logic := '0';
|
|
signal O_Ready_none : std_logic;
|
|
signal O_Default_Valid_none : std_logic;
|
|
signal I_Default_Ready_none : std_logic := '0';
|
|
signal O_Selected_Valid_none : std_logic;
|
|
signal I_Selected_Ready_none : std_logic := '0';
|
|
|
|
-- === Signals for mode "or" ===
|
|
signal I_Match_or : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_or : std_logic := '0';
|
|
signal O_Ready_or : std_logic;
|
|
signal O_Default_Valid_or : std_logic;
|
|
signal I_Default_Ready_or : std_logic := '0';
|
|
signal O_Selected_Valid_or : std_logic;
|
|
signal I_Selected_Ready_or : std_logic := '0';
|
|
|
|
-- === Signals for mode "and" ===
|
|
signal I_Match_and : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_and : std_logic := '0';
|
|
signal O_Ready_and : std_logic;
|
|
signal O_Default_Valid_and : std_logic;
|
|
signal I_Default_Ready_and : std_logic := '0';
|
|
signal O_Selected_Valid_and : std_logic;
|
|
signal I_Selected_Ready_and : std_logic := '0';
|
|
|
|
-- === Signals for mode "xor" ===
|
|
signal I_Match_xor : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_xor : std_logic := '0';
|
|
signal O_Ready_xor : std_logic;
|
|
signal O_Default_Valid_xor : std_logic;
|
|
signal I_Default_Ready_xor : std_logic := '0';
|
|
signal O_Selected_Valid_xor : std_logic;
|
|
signal I_Selected_Ready_xor : std_logic := '0';
|
|
|
|
-- === Signals for mode "equal" ===
|
|
signal I_Match_eq : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_eq : std_logic := '0';
|
|
signal O_Ready_eq : std_logic;
|
|
signal O_Default_Valid_eq : std_logic;
|
|
signal I_Default_Ready_eq : std_logic := '0';
|
|
signal O_Selected_Valid_eq : std_logic;
|
|
signal I_Selected_Ready_eq : std_logic := '0';
|
|
|
|
-- === Signals for mode "not_eq" ===
|
|
signal I_Match_neq : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_neq : std_logic := '0';
|
|
signal O_Ready_neq : std_logic;
|
|
signal O_Default_Valid_neq : std_logic;
|
|
signal I_Default_Ready_neq : std_logic := '0';
|
|
signal O_Selected_Valid_neq : std_logic;
|
|
signal I_Selected_Ready_neq : std_logic := '0';
|
|
|
|
-- === Signals for mode "gt" ===
|
|
signal I_Match_gt : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_gt : std_logic := '0';
|
|
signal O_Ready_gt : std_logic;
|
|
signal O_Default_Valid_gt : std_logic;
|
|
signal I_Default_Ready_gt : std_logic := '0';
|
|
signal O_Selected_Valid_gt : std_logic;
|
|
signal I_Selected_Ready_gt : std_logic := '0';
|
|
|
|
-- === Signals for mode "ge" ===
|
|
signal I_Match_ge : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_ge : std_logic := '0';
|
|
signal O_Ready_ge : std_logic;
|
|
signal O_Default_Valid_ge : std_logic;
|
|
signal I_Default_Ready_ge : std_logic := '0';
|
|
signal O_Selected_Valid_ge : std_logic;
|
|
signal I_Selected_Ready_ge : std_logic := '0';
|
|
|
|
-- === Signals for mode "lt" ===
|
|
signal I_Match_lt : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_lt : std_logic := '0';
|
|
signal O_Ready_lt : std_logic;
|
|
signal O_Default_Valid_lt : std_logic;
|
|
signal I_Default_Ready_lt : std_logic := '0';
|
|
signal O_Selected_Valid_lt : std_logic;
|
|
signal I_Selected_Ready_lt : std_logic := '0';
|
|
|
|
-- === Signals for mode "le" ===
|
|
signal I_Match_le : std_logic_vector(G_MaskWidth - 1 downto 0) := (others => '0');
|
|
signal I_Valid_le : std_logic := '0';
|
|
signal O_Ready_le : std_logic;
|
|
signal O_Default_Valid_le : std_logic;
|
|
signal I_Default_Ready_le : std_logic := '0';
|
|
signal O_Selected_Valid_le : std_logic;
|
|
signal I_Selected_Ready_le : std_logic := '0';
|
|
|
|
begin
|
|
|
|
-- === Instanz: "none" ===
|
|
UUT_none : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "none"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_none,
|
|
I_Valid => I_Valid_none,
|
|
O_Ready => O_Ready_none,
|
|
O_Default_Valid => O_Default_Valid_none,
|
|
I_Default_Ready => I_Default_Ready_none,
|
|
O_Selected_Valid => O_Selected_Valid_none,
|
|
I_Selected_Ready => I_Selected_Ready_none
|
|
);
|
|
|
|
-- === Instanz: "or" ===
|
|
UUT_or : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "or"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_or,
|
|
I_Valid => I_Valid_or,
|
|
O_Ready => O_Ready_or,
|
|
O_Default_Valid => O_Default_Valid_or,
|
|
I_Default_Ready => I_Default_Ready_or,
|
|
O_Selected_Valid => O_Selected_Valid_or,
|
|
I_Selected_Ready => I_Selected_Ready_or
|
|
);
|
|
|
|
-- === Instanz: "and" ===
|
|
UUT_and : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "and"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_and,
|
|
I_Valid => I_Valid_and,
|
|
O_Ready => O_Ready_and,
|
|
O_Default_Valid => O_Default_Valid_and,
|
|
I_Default_Ready => I_Default_Ready_and,
|
|
O_Selected_Valid => O_Selected_Valid_and,
|
|
I_Selected_Ready => I_Selected_Ready_and
|
|
);
|
|
|
|
-- === Instanz: "xor" ===
|
|
UUT_xor : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "xor"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_xor,
|
|
I_Valid => I_Valid_xor,
|
|
O_Ready => O_Ready_xor,
|
|
O_Default_Valid => O_Default_Valid_xor,
|
|
I_Default_Ready => I_Default_Ready_xor,
|
|
O_Selected_Valid => O_Selected_Valid_xor,
|
|
I_Selected_Ready => I_Selected_Ready_xor
|
|
);
|
|
|
|
-- === Instanz: "equal" ===
|
|
UUT_eq : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "equal"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_eq,
|
|
I_Valid => I_Valid_eq,
|
|
O_Ready => O_Ready_eq,
|
|
O_Default_Valid => O_Default_Valid_eq,
|
|
I_Default_Ready => I_Default_Ready_eq,
|
|
O_Selected_Valid => O_Selected_Valid_eq,
|
|
I_Selected_Ready => I_Selected_Ready_eq
|
|
);
|
|
|
|
-- === Instanz: "not_eq" ===
|
|
UUT_neq : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "not_equal"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_neq,
|
|
I_Valid => I_Valid_neq,
|
|
O_Ready => O_Ready_neq,
|
|
O_Default_Valid => O_Default_Valid_neq,
|
|
I_Default_Ready => I_Default_Ready_neq,
|
|
O_Selected_Valid => O_Selected_Valid_neq,
|
|
I_Selected_Ready => I_Selected_Ready_neq
|
|
);
|
|
|
|
-- === Instanz: "gt" ===
|
|
UUT_gt : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "gt"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_gt,
|
|
I_Valid => I_Valid_gt,
|
|
O_Ready => O_Ready_gt,
|
|
O_Default_Valid => O_Default_Valid_gt,
|
|
I_Default_Ready => I_Default_Ready_gt,
|
|
O_Selected_Valid => O_Selected_Valid_gt,
|
|
I_Selected_Ready => I_Selected_Ready_gt
|
|
);
|
|
|
|
-- === Instanz: "ge" ===
|
|
UUT_ge : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "ge"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_ge,
|
|
I_Valid => I_Valid_ge,
|
|
O_Ready => O_Ready_ge,
|
|
O_Default_Valid => O_Default_Valid_ge,
|
|
I_Default_Ready => I_Default_Ready_ge,
|
|
O_Selected_Valid => O_Selected_Valid_ge,
|
|
I_Selected_Ready => I_Selected_Ready_ge
|
|
);
|
|
|
|
-- === Instanz: "lt" ===
|
|
UUT_lt : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "lt"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_lt,
|
|
I_Valid => I_Valid_lt,
|
|
O_Ready => O_Ready_lt,
|
|
O_Default_Valid => O_Default_Valid_lt,
|
|
I_Default_Ready => I_Default_Ready_lt,
|
|
O_Selected_Valid => O_Selected_Valid_lt,
|
|
I_Selected_Ready => I_Selected_Ready_lt
|
|
);
|
|
|
|
-- === Instanz: "le" ===
|
|
UUT_le : entity work.PipelineSwitch
|
|
generic map(
|
|
G_MaskWidth => G_MaskWidth,
|
|
G_Mask => G_Mask,
|
|
G_MaskMode => "le"
|
|
)
|
|
port map(
|
|
I_Match => I_Match_le,
|
|
I_Valid => I_Valid_le,
|
|
O_Ready => O_Ready_le,
|
|
O_Default_Valid => O_Default_Valid_le,
|
|
I_Default_Ready => I_Default_Ready_le,
|
|
O_Selected_Valid => O_Selected_Valid_le,
|
|
I_Selected_Ready => I_Selected_Ready_le
|
|
);
|
|
|
|
stimulus : process
|
|
begin
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "none"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: none";
|
|
I_Default_Ready_none <= '1';
|
|
I_Match_none <= "0000";
|
|
I_Valid_none <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_none = '1' and O_Selected_Valid_none = '0'
|
|
report "Fehler im Modus 'none'" severity error;
|
|
I_Valid_none <= '0';
|
|
I_Default_Ready_none <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "or"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: or";
|
|
I_Selected_Ready_or <= '1';
|
|
I_Match_or <= "0100"; -- bit 2 matches mask
|
|
I_Valid_or <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_or = '1' and O_Default_Valid_or = '0'
|
|
report "Fehler im Modus 'or' (Match-Fall)" severity error;
|
|
I_Selected_Ready_or <= '0';
|
|
I_Valid_or <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_or <= '1';
|
|
I_Match_or <= "0010"; -- no bit matches mask
|
|
I_Valid_or <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_or = '1' and O_Selected_Valid_or = '0'
|
|
report "Fehler im Modus 'or' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_or <= '0';
|
|
I_Valid_or <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "and"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: and";
|
|
I_Selected_Ready_and <= '1';
|
|
I_Match_and <= "1101";
|
|
I_Valid_and <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_and = '1' and O_Default_Valid_and = '0'
|
|
report "Fehler im Modus 'and' (Match-Fall)" severity error;
|
|
I_Selected_Ready_and <= '0';
|
|
I_Valid_and <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_and <= '1';
|
|
I_Match_and <= "1001"; -- bit 2 missing
|
|
I_Valid_and <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_and = '1' and O_Selected_Valid_and = '0'
|
|
report "Fehler im Modus 'and' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_and <= '0';
|
|
I_Valid_and <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "xor"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: xor";
|
|
I_Selected_Ready_xor <= '1';
|
|
I_Match_xor <= "1001"; -- differs at bit 2
|
|
I_Valid_xor <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_xor = '1' and O_Default_Valid_xor = '0'
|
|
report "Fehler im Modus 'xor' (Match-Fall)" severity error;
|
|
I_Selected_Ready_xor <= '0';
|
|
I_Valid_xor <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_xor <= '1';
|
|
I_Match_xor <= "1101";
|
|
I_Valid_xor <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_xor = '1' and O_Selected_Valid_xor = '0'
|
|
report "Fehler im Modus 'xor' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_xor <= '0';
|
|
I_Valid_xor <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "equal"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: equal";
|
|
I_Selected_Ready_eq <= '1';
|
|
I_Match_eq <= "1101";
|
|
I_Valid_eq <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_eq = '1' and O_Default_Valid_eq = '0'
|
|
report "Fehler im Modus 'equal' (Match-Fall)" severity error;
|
|
I_Selected_Ready_eq <= '0';
|
|
I_Valid_eq <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_eq <= '1';
|
|
I_Match_eq <= "1111";
|
|
I_Valid_eq <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_eq = '1' and O_Selected_Valid_eq = '0'
|
|
report "Fehler im Modus 'equal' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_eq <= '0';
|
|
I_Valid_eq <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "not_equal"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: not_equal";
|
|
I_Selected_Ready_neq <= '1';
|
|
I_Match_neq <= "1111"; -- not equal
|
|
I_Valid_neq <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_neq = '1' and O_Default_Valid_neq = '0'
|
|
report "Fehler im Modus 'not_equal' (Match-Fall)" severity error;
|
|
I_Selected_Ready_neq <= '0';
|
|
I_Valid_neq <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_neq <= '1';
|
|
I_Match_neq <= "1101";
|
|
I_Valid_neq <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_neq = '1' and O_Selected_Valid_neq = '0'
|
|
report "Fehler im Modus 'not_equal' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_neq <= '0';
|
|
I_Valid_neq <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "gt"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: gt";
|
|
I_Selected_Ready_gt <= '1';
|
|
I_Match_gt <= "1110"; -- > 1101
|
|
I_Valid_gt <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_gt = '1' and O_Default_Valid_gt = '0'
|
|
report "Fehler im Modus 'gt' (Match-Fall)" severity error;
|
|
I_Selected_Ready_gt <= '0';
|
|
I_Valid_gt <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_gt <= '1';
|
|
I_Match_gt <= "1010"; -- < 1101
|
|
I_Valid_gt <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_gt = '1' and O_Selected_Valid_gt = '0'
|
|
report "Fehler im Modus 'gt' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_gt <= '0';
|
|
I_Valid_gt <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "ge"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: ge";
|
|
I_Selected_Ready_ge <= '1';
|
|
I_Match_ge <= "1101"; -- == 1101
|
|
I_Valid_ge <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_ge = '1' and O_Default_Valid_ge = '0'
|
|
report "Fehler im Modus 'ge' (Match-Fall ==)" severity error;
|
|
I_Selected_Ready_ge <= '0';
|
|
I_Valid_ge <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_ge <= '1';
|
|
I_Match_ge <= "0101"; -- < 1101
|
|
I_Valid_ge <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_ge = '1' and O_Selected_Valid_ge = '0'
|
|
report "Fehler im Modus 'ge' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_ge <= '0';
|
|
I_Valid_ge <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "lt"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: lt";
|
|
I_Selected_Ready_lt <= '1';
|
|
I_Match_lt <= "0101"; -- < 1101
|
|
I_Valid_lt <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_lt = '1' and O_Default_Valid_lt = '0'
|
|
report "Fehler im Modus 'lt' (Match-Fall)" severity error;
|
|
I_Selected_Ready_lt <= '0';
|
|
I_Valid_lt <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_lt <= '1';
|
|
I_Match_lt <= "1111"; -- > 1101
|
|
I_Valid_lt <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_lt = '1' and O_Selected_Valid_lt = '0'
|
|
report "Fehler im Modus 'lt' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_lt <= '0';
|
|
I_Valid_lt <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Mode: "le"
|
|
----------------------------------------------------------------
|
|
report "Testmodus: le";
|
|
I_Selected_Ready_le <= '1';
|
|
I_Match_le <= "1101"; -- == 1101
|
|
I_Valid_le <= '1';
|
|
wait for 10 ns;
|
|
assert O_Selected_Valid_le = '1' and O_Default_Valid_le = '0'
|
|
report "Fehler im Modus 'le' (Match-Fall ==)" severity error;
|
|
I_Selected_Ready_le <= '0';
|
|
I_Valid_le <= '0';
|
|
wait for 10 ns;
|
|
|
|
I_Default_Ready_le <= '1';
|
|
I_Match_le <= "1111"; -- > 1101
|
|
I_Valid_le <= '1';
|
|
wait for 10 ns;
|
|
assert O_Default_Valid_le = '1' and O_Selected_Valid_le = '0'
|
|
report "Fehler im Modus 'le' (No-Match-Fall)" severity error;
|
|
I_Default_Ready_le <= '0';
|
|
I_Valid_le <= '0';
|
|
wait for 10 ns;
|
|
|
|
----------------------------------------------------------------
|
|
-- Done!
|
|
----------------------------------------------------------------
|
|
report "Alle Tests abgeschlossen!" severity note;
|
|
wait;
|
|
end process;
|
|
|
|
end architecture RTL;
|