architecture sim of MupixTRBReadoutTest is
- component MupixTRBReadout
- generic(
- g_mupix_links : natural := 4;
- g_cyc_mem_address_width : integer := 13;
- g_datawidth : integer := 32
- );
- port(
- clk : in std_logic;
- rst : in std_logic;
- fifo_empty : in std_logic_vector(g_mupix_links - 1 downto 0);
- fifo_full : in std_logic_vector(g_mupix_links - 1 downto 0);
- fifo_datain : in std_logic_vector(g_mupix_links*g_datawidth - 1 downto 0);
- fifo_rden : out std_logic_vector(g_mupix_links - 1 downto 0);
- trb_trigger : in std_logic;
- dataout : out std_logic_vector(g_datawidth - 1 downto 0);
- data_valid : out std_logic;
- busy : out 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 MupixTRBReadout;
-
- component STD_FIFO
- generic(
- DATA_WIDTH : positive := 8;
- FIFO_DEPTH : positive := 256
- );
- port(
- CLK : in std_logic;
- RST : in std_logic;
- WriteEn : in std_logic;
- DataIn : in std_logic_vector(DATA_WIDTH - 1 downto 0);
- ReadEn : in std_logic;
- DataOut : out std_logic_vector(DATA_WIDTH - 1 downto 0);
- Empty : out std_logic;
- Full : out std_logic
- );
- end component STD_FIFO;
-
- constant c_clk_period : time := 10 ns;
- constant c_mupix_links : integer := 4;
- constant c_cyc_mem_address_width : integer := 6;
- constant c_datawidth : integer := 32;
-
- signal clk : std_logic;
- signal rst : std_logic := '0';
- signal fifo_empty : std_logic_vector(c_mupix_links - 1 downto 0) := (others => '1');
- signal fifo_full : std_logic_vector(c_mupix_links - 1 downto 0) := (others => '0');
- signal fifo_data_to_mux : std_logic_vector(c_mupix_links*c_datawidth - 1 downto 0) := (others => '0');
- signal fifo_rden : std_logic_vector(c_mupix_links - 1 downto 0) := (others => '0');
- signal trb_trigger : std_logic := '0';
- signal dataout : std_logic_vector(c_datawidth - 1 downto 0);
- signal data_valid : std_logic;
- signal busy : std_logic;
- 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;
-
- signal fifo_write_en : std_logic_vector(c_mupix_links - 1 downto 0) := (others => '0');
- signal fifo_datain : std_logic_vector(c_mupix_links*c_datawidth - 1 downto 0) := (others => '0');
-
+ component MupixTRBReadout
+ generic(
+ g_mupix_links : natural := 4;
+ g_cyc_mem_address_width : integer := 13;
+ g_datawidthfifo : integer := 40;
+ g_datawidthtrb : integer := 32
+ );
+ port(
+ clk : in std_logic;
+ rst : in std_logic;
+ fifo_empty : in std_logic_vector(g_mupix_links - 1 downto 0);
+ fifo_full : in std_logic_vector(g_mupix_links - 1 downto 0);
+ fifo_datain : in std_logic_vector(g_mupix_links*g_datawidthfifo - 1 downto 0);
+ fifo_rden : out std_logic_vector(g_mupix_links - 1 downto 0);
+ trb_trigger : in std_logic;
+ dataout : out std_logic_vector(g_datawidthtrb - 1 downto 0);
+ data_valid : out std_logic;
+ busy : out 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 MupixTRBReadout;
+
+ component STD_FIFO
+ generic(
+ DATA_WIDTH : positive := 8;
+ FIFO_DEPTH : positive := 256
+ );
+ port(
+ CLK : in std_logic;
+ RST : in std_logic;
+ WriteEn : in std_logic;
+ DataIn : in std_logic_vector(DATA_WIDTH - 1 downto 0);
+ ReadEn : in std_logic;
+ DataOut : out std_logic_vector(DATA_WIDTH - 1 downto 0);
+ Empty : out std_logic;
+ Full : out std_logic
+ );
+ end component STD_FIFO;
+
+ constant c_clk_period : time := 10 ns;
+ constant c_mupix_links : integer := 4;
+ constant c_cyc_mem_address_width : integer := 6;
+ constant c_datawidthfifo : integer := 40;
+ constant c_datawidthtrb : integer := 32;
+
+ type channel_type is array (0 to 3) of std_logic_vector(15 downto 0);
+ constant c_channel_id : channel_type := (x"C01C", x"C02C", x"C03C", x"C04C");
+
+ signal clk : std_logic;
+ signal rst : std_logic := '0';
+ signal fifo_empty : std_logic_vector(c_mupix_links - 1 downto 0) := (others => '1');
+ signal fifo_full : std_logic_vector(c_mupix_links - 1 downto 0) := (others => '0');
+ signal fifo_data_to_mux : std_logic_vector(c_mupix_links*c_datawidthfifo - 1 downto 0) := (others => '0');
+ signal fifo_rden : std_logic_vector(c_mupix_links - 1 downto 0) := (others => '0');
+ signal trb_trigger : std_logic := '0';
+ signal dataout : std_logic_vector(c_datawidthtrb - 1 downto 0);
+ signal data_valid : std_logic;
+ signal busy : std_logic;
+ 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;
+
+ signal fifo_write_en : std_logic_vector(c_mupix_links - 1 downto 0) := (others => '0');
+ signal fifo_datain : std_logic_vector(c_mupix_links*c_datawidthfifo - 1 downto 0) := (others => '0');
+
begin
- dut : entity work.MupixTRBReadout
- generic map(
- g_mupix_links => c_mupix_links,
- g_cyc_mem_address_width => c_cyc_mem_address_width,
- g_datawidth => c_datawidth
- )
- port map(
- clk => clk,
- rst => rst,
- fifo_empty => fifo_empty,
- fifo_full => fifo_full,
- fifo_datain => fifo_data_to_mux,
- fifo_rden => fifo_rden,
- trb_trigger => trb_trigger,
- dataout => dataout,
- data_valid => data_valid,
- busy => busy,
- 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
- );
-
- gen_input_fifo : for i in 0 to 3 generate
- input_fifo : entity work.STD_FIFO
- generic map(
- DATA_WIDTH => c_datawidth,
- FIFO_DEPTH => 16
- )
- port map(
- CLK => CLK,
- RST => RST,
- WriteEn => fifo_write_en(i),
- DataIn => fifo_datain((i + 1)*c_datawidth - 1 downto i*c_datawidth),
- ReadEn => fifo_rden(i),
- DataOut => fifo_data_to_mux((i + 1)*c_datawidth - 1 downto i*c_datawidth),
- Empty => fifo_empty(i),
- Full => fifo_full(i)
- );
- end generate gen_input_fifo;
-
-
- clock_gen : process is
- begin
- clk <= '1';
- wait for c_clk_period/2;
- clk <= '0';
- wait for c_clk_period/2;
- end process clock_gen;
-
- stimulus : process is
- begin
- wait for 100 ns;
- TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"0000000A", x"0101");
- TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"0000000B", x"0102");
- TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"ABBA0001", x"0103");
- TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"0000000F", x"0105");
- TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0106");
- wait for 5*c_clk_period;
- for i in 1 to 10 loop
- fifo_write_en <= (others => '1');
- fifo_datain(4*32 - 1 downto 3*32) <= std_logic_vector(to_unsigned(i, c_datawidth));
- fifo_datain(3*32 - 1 downto 2*32) <= std_logic_vector(to_unsigned(i + 10, c_datawidth));
- fifo_datain(2*32 - 1 downto 1*32) <= std_logic_vector(to_unsigned(i + 20, c_datawidth));
- fifo_datain(1*32 - 1 downto 0*32) <= std_logic_vector(to_unsigned(i + 30, c_datawidth));
- wait for c_clk_period;
- end loop;
- fifo_write_en <= (others => '0');
- fifo_datain(4*32 - 1 downto 3*32) <= (others => '0');
- wait for 500 ns;
- TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0100");
- TRBRegisterRead(SLV_READ_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0104");
- if SLV_ACK_OUT = '0' then
- wait until slv_ack_out = '1';
- wait for c_clk_period;
- end if;
- TRBRegisterRead(SLV_READ_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0104");
- if SLV_ACK_OUT = '0' then
- wait until slv_ack_out = '1';
- wait for c_clk_period;
- end if;
- TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000001", x"0100");
- TRBRegisterRead(SLV_READ_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0104");
- wait;
- end process stimulus;
-
-
-end architecture;
\ No newline at end of file
+ dut : entity work.MupixTRBReadout
+ generic map(
+ g_mupix_links => c_mupix_links,
+ g_cyc_mem_address_width => c_cyc_mem_address_width,
+ g_datawidthfifo => c_datawidthfifo,
+ g_datawidthtrb => c_datawidthtrb
+ )
+ port map(
+ clk => clk,
+ rst => rst,
+ fifo_empty => fifo_empty,
+ fifo_full => fifo_full,
+ fifo_datain => fifo_data_to_mux,
+ fifo_rden => fifo_rden,
+ trb_trigger => trb_trigger,
+ dataout => dataout,
+ data_valid => data_valid,
+ busy => busy,
+ 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
+ );
+
+ gen_input_fifo : for i in 0 to 3 generate
+ input_fifo : entity work.STD_FIFO
+ generic map(
+ DATA_WIDTH => c_datawidthfifo,
+ FIFO_DEPTH => 16
+ )
+ port map(
+ CLK => CLK,
+ RST => RST,
+ WriteEn => fifo_write_en(i),
+ DataIn => fifo_datain((i + 1)*c_datawidthfifo - 1 downto i*c_datawidthfifo),
+ ReadEn => fifo_rden(i),
+ DataOut => fifo_data_to_mux((i + 1)*c_datawidthfifo - 1 downto i*c_datawidthfifo),
+ Empty => fifo_empty(i),
+ Full => fifo_full(i)
+ );
+ end generate gen_input_fifo;
+
+
+ clock_gen : process is
+ begin
+ clk <= '1';
+ wait for c_clk_period/2;
+ clk <= '0';
+ wait for c_clk_period/2;
+ end process clock_gen;
+
+ stimulus : process is
+ begin
+ wait for 100 ns;
+ TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"0000000A", x"0101");
+ TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"0000000B", x"0102");
+ TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"ABBA0001", x"0103");
+ TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"0000000F", x"0105");
+ TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0106");
+ wait for 5*c_clk_period;
+ for i in 1 to 10 loop
+ fifo_write_en <= (others => '1');
+ fifo_datain(4*c_datawidthfifo - 1 downto 3*c_datawidthfifo) <= c_channel_id(0) & std_logic_vector(to_unsigned(i, 8)) & x"BEEB";
+ fifo_datain(3*c_datawidthfifo - 1 downto 2*c_datawidthfifo) <= c_channel_id(1) & std_logic_vector(to_unsigned(i, 8)) & x"BEEB";
+ fifo_datain(2*c_datawidthfifo - 1 downto 1*c_datawidthfifo) <= c_channel_id(2) & std_logic_vector(to_unsigned(i, 8)) & x"BEEB";
+ fifo_datain(1*c_datawidthfifo - 1 downto 0*c_datawidthfifo) <= c_channel_id(3) & std_logic_vector(to_unsigned(i, 8)) & x"BEEB";
+ wait for c_clk_period;
+ end loop;
+ fifo_write_en <= (others => '0');
+ fifo_datain(4*c_datawidthfifo - 1 downto 3*c_datawidthfifo) <= (others => '0');
+ wait for 500 ns;
+ TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0100");
+ TRBRegisterRead(SLV_READ_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0104");
+ if SLV_ACK_OUT = '0' then
+ wait until slv_ack_out = '1';
+ wait for c_clk_period;
+ end if;
+ TRBRegisterRead(SLV_READ_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0104");
+ if SLV_ACK_OUT = '0' then
+ wait until slv_ack_out = '1';
+ wait for c_clk_period;
+ end if;
+ TRBRegisterWrite(SLV_WRITE_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000001", x"0100");
+ TRBRegisterRead(SLV_READ_IN, SLV_DATA_IN, SLV_ADDR_IN, x"00000000", x"0104");
+ wait;
+ end process stimulus;
+
+
+end architecture;