--- /dev/null
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+use work.TRBSimulationPkg.all;
+
+entity SodaBoardSimulation is
+end entity SodaBoardSimulation;
+
+architecture sim of SodaBoardSimulation is
+
+ component sodaBoard is
+ port (
+ clk_in : in std_logic;
+ reset_in : in std_logic;
+ TIMING_TRG_IN : in std_logic;
+ LVL1_TRG_DATA_VALID_IN : in std_logic;
+ LVL1_VALID_TIMING_TRG_IN : in std_logic;
+ LVL1_VALID_NOTIMING_TRG_IN : in std_logic;
+ LVL1_INVALID_TRG_IN : in std_logic;
+ LVL1_TRG_TYPE_IN : in std_logic_vector(3 downto 0);
+ LVL1_TRG_NUMBER_IN : in std_logic_vector(15 downto 0);
+ LVL1_TRG_CODE_IN : in std_logic_vector(7 downto 0);
+ LVL1_TRG_INFORMATION_IN : in std_logic_vector(23 downto 0);
+ LVL1_INT_TRG_NUMBER_IN : in std_logic_vector(15 downto 0);
+ FEE_TRG_RELEASE_OUT : out std_logic;
+ FEE_TRG_STATUSBITS_OUT : out std_logic_vector(31 downto 0);
+ FEE_DATA_OUT : out std_logic_vector(31 downto 0);
+ FEE_DATA_WRITE_OUT : out std_logic;
+ FEE_DATA_FINISHED_OUT : out std_logic;
+ FEE_DATA_ALMOST_FULL_IN : in std_logic;
+ SLV_READ_IN : in std_logic;
+ SLV_WRITE_IN : in std_logic;
+ SLV_DATA_OUT : out std_logic_vector(31 downto 0);
+ SLV_DATA_IN : in std_logic_vector(31 downto 0);
+ SLV_ADDR_IN : in std_logic_vector(15 downto 0);
+ SLV_ACK_OUT : out std_logic;
+ SLV_NO_MORE_DATA_OUT : out std_logic;
+ SLV_UNKNOWN_ADDR_OUT : out std_logic);
+ end component sodaBoard;
+
+ constant clk_period : time := 10 ns;
+ signal clk_in : std_logic;
+ signal reset_in : std_logic := '0';
+ signal TIMING_TRG_IN : std_logic := '0';
+ signal LVL1_TRG_DATA_VALID_IN : std_logic := '0';
+ signal LVL1_VALID_TIMING_TRG_IN : std_logic := '0';
+ signal LVL1_VALID_NOTIMING_TRG_IN : std_logic := '0';
+ signal LVL1_INVALID_TRG_IN : std_logic := '0';
+ signal LVL1_TRG_TYPE_IN : std_logic_vector(3 downto 0) := (others => '0');
+ signal LVL1_TRG_NUMBER_IN : std_logic_vector(15 downto 0) := (others => '0');
+ signal LVL1_TRG_CODE_IN : std_logic_vector(7 downto 0) := (others => '0');
+ signal LVL1_TRG_INFORMATION_IN : std_logic_vector(23 downto 0) := (others => '0');
+ signal LVL1_INT_TRG_NUMBER_IN : std_logic_vector(15 downto 0) := (others => '0');
+ signal FEE_TRG_RELEASE_OUT : std_logic;
+ signal FEE_TRG_STATUSBITS_OUT : std_logic_vector(31 downto 0) := (others => '0');
+ signal FEE_DATA_OUT : std_logic_vector(31 downto 0) := (others => '0');
+ signal FEE_DATA_WRITE_OUT : std_logic;
+ signal FEE_DATA_FINISHED_OUT : std_logic;
+ signal FEE_DATA_ALMOST_FULL_IN : std_logic := '0';
+ signal SLV_READ_IN : std_logic := '0';
+ signal SLV_WRITE_IN : std_logic := '0';
+ signal SLV_DATA_OUT : std_logic_vector(31 downto 0);
+ signal SLV_DATA_IN : std_logic_vector(31 downto 0) := (others => '0');
+ signal SLV_ADDR_IN : std_logic_vector(15 downto 0) := (others => '0');
+ signal SLV_ACK_OUT : std_logic;
+ signal SLV_NO_MORE_DATA_OUT : std_logic;
+ signal SLV_UNKNOWN_ADDR_OUT : std_logic;
+
+begin -- architecture sim
+
+ sodaBoard_1 : entity work.sodaBoard
+ port map (
+ clk_in => clk_in,
+ reset_in => reset_in,
+ TIMING_TRG_IN => TIMING_TRG_IN,
+ LVL1_TRG_DATA_VALID_IN => LVL1_TRG_DATA_VALID_IN,
+ LVL1_VALID_TIMING_TRG_IN => LVL1_VALID_TIMING_TRG_IN,
+ LVL1_VALID_NOTIMING_TRG_IN => LVL1_VALID_NOTIMING_TRG_IN,
+ LVL1_INVALID_TRG_IN => LVL1_INVALID_TRG_IN,
+ LVL1_TRG_TYPE_IN => LVL1_TRG_TYPE_IN,
+ LVL1_TRG_NUMBER_IN => LVL1_TRG_NUMBER_IN,
+ LVL1_TRG_CODE_IN => LVL1_TRG_CODE_IN,
+ LVL1_TRG_INFORMATION_IN => LVL1_TRG_INFORMATION_IN,
+ LVL1_INT_TRG_NUMBER_IN => LVL1_INT_TRG_NUMBER_IN,
+ FEE_TRG_RELEASE_OUT => FEE_TRG_RELEASE_OUT,
+ FEE_TRG_STATUSBITS_OUT => FEE_TRG_STATUSBITS_OUT,
+ FEE_DATA_OUT => FEE_DATA_OUT,
+ FEE_DATA_WRITE_OUT => FEE_DATA_WRITE_OUT,
+ FEE_DATA_FINISHED_OUT => FEE_DATA_FINISHED_OUT,
+ FEE_DATA_ALMOST_FULL_IN => FEE_DATA_ALMOST_FULL_IN,
+ SLV_READ_IN => SLV_READ_IN,
+ SLV_WRITE_IN => SLV_WRITE_IN,
+ SLV_DATA_OUT => SLV_DATA_OUT,
+ SLV_DATA_IN => SLV_DATA_IN,
+ SLV_ADDR_IN => SLV_ADDR_IN,
+ SLV_ACK_OUT => SLV_ACK_OUT,
+ SLV_NO_MORE_DATA_OUT => SLV_NO_MORE_DATA_OUT,
+ SLV_UNKNOWN_ADDR_OUT => SLV_UNKNOWN_ADDR_OUT);
+
+ clock_gen : process is
+ begin -- process clock_gen
+ clk_in <= '0';
+ wait for clk_period/2;
+ clk_in <= '1';
+ wait for clk_period/2;
+ end process clock_gen;
+
+ stimul : process is
+ begin -- process stimul
+ wait for 100 ns;
+ -- simulate a trigger while bypass is on
+ LVL1_TRG_DATA_VALID_IN <= '1';
+ LVL1_TRG_TYPE_IN <= x"1";
+ LVL1_INT_TRG_NUMBER_IN <= (others => '0');
+ LVL1_VALID_NOTIMING_TRG_IN <= '1';
+ wait for 10*clk_period;
+ LVL1_TRG_DATA_VALID_IN <= '0';
+ LVL1_TRG_TYPE_IN <= x"0";
+ LVL1_VALID_NOTIMING_TRG_IN <= '0';
+ wait for 10*clk_period;
+ -- test status trigger
+ TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0004");
+ LVL1_TRG_DATA_VALID_IN <= '1';
+ LVL1_TRG_TYPE_IN <= x"e";
+ LVL1_INT_TRG_NUMBER_IN <= (others => '0');
+ LVL1_INT_TRG_NUMBER_IN(0) <= '1';
+ LVL1_VALID_NOTIMING_TRG_IN <= '1';
+ wait for 10*clk_period;
+ LVL1_TRG_DATA_VALID_IN <= '0';
+ LVL1_TRG_TYPE_IN <= x"0";
+ LVL1_VALID_NOTIMING_TRG_IN <= '0';
+ LVL1_INT_TRG_NUMBER_IN(0) <= '0';
+ wait for 100 ns;
+ -- test physics trigger and data generation
+ LVL1_TRG_DATA_VALID_IN <= '1';
+ LVL1_TRG_TYPE_IN <= x"1";
+ LVL1_INT_TRG_NUMBER_IN <= (others => '0');
+ LVL1_INT_TRG_NUMBER_IN(1) <= '1';
+ LVL1_VALID_NOTIMING_TRG_IN <= '1';
+ wait for 30*clk_period;
+ LVL1_TRG_DATA_VALID_IN <= '0';
+ LVL1_TRG_TYPE_IN <= x"0";
+ LVL1_VALID_NOTIMING_TRG_IN <= '0';
+ LVL1_INT_TRG_NUMBER_IN(0) <= '0';
+ wait;
+ end process stimul;
+
+end architecture sim;