simulate stream filter, integrated to if1210 wrapper, syntax fixes

This commit is contained in:
2018-12-05 10:08:52 +01:00
parent d7e669cb75
commit c52673a8ca
4 changed files with 54 additions and 18 deletions

View File

@ -14,7 +14,7 @@ use ieee.std_logic_1164.all;
entity evr320_data_filter is
generic (
ADDRESS : std_logic_vector(10 downto 0);
ADDRESS : std_logic_vector(11 downto 0);
NUM_BYTES : integer := 8
);
port (
@ -47,7 +47,7 @@ begin
addr := i_stream_data(i_stream_data'high downto 8);
data := i_stream_data(7 downto 0);
if (addr = ADDRESS or match = '1') then
if (addr = ADDRESS(10 downto 0) or match = '1') then
match <= '1';
if (shift_cnt < NUM_BYTES) then
data_shift <= data_shift((data_shift'high - data'length) downto 0) & data;

View File

@ -61,13 +61,13 @@ entity evr320_ifc1210_wrapper is
clk_evr_o : out std_logic; -- Recovered parallel clock from MGT
usr_events_o : out std_logic_vector( 3 downto 0); -- User defined event pulses with one clock cycle length
usr_events_ext_o : out std_logic_vector( 3 downto 0); -- User defined event pulses with four clock cycle length
sos_event_o : out std_logic -- Start-of-Sequence Event
sos_event_o : out std_logic; -- Start-of-Sequence Event
--------------------------------------------------------------------------
-- Decoder axi stream interface, User clock
--------------------------------------------------------------------------
stream_clk_i : in std_logic := '0';
stream_data_o : out std_logic_vector(18 downto 0); -- | addr 11bit | data 8bit |
stream_valid_o : out std_logic;
stream_valid_o : out std_logic
);
end evr320_ifc1210_wrapper;
@ -251,10 +251,10 @@ begin
generic map (
MasterFrequency_g => g_XUSER_CLK_FREQ,
MaxMeasFrequency_g => 150000000
);
)
port map (
ClkMaster => xuser_CLK,
Rst => xuser_RST,
Rst => xuser_RESET,
ClkTest => clk_evr,
FrequencyHz => evr_frequency
);

View File

@ -55,7 +55,8 @@ clean_libraries -all
compile_files -tag psi_common
compile_files -tag evr320_decoder
compile_files -tag evr320_decoder_tb
#compile_files -lib tosca2
compile_files -lib tosca2
compile_files -tag evr320_ifc1210
#compile_files -lib evr320
run_tb -all

View File

@ -88,6 +88,11 @@ architecture testbench of evr320_decoder_tb is
signal segment_length : natural range 0 to 2047;
signal usr_events : std_logic_vector( 3 downto 0) := (others => '0');
constant FILTER_ADDRESS : std_logic_vector(11 downto 0) := x"028";
constant FILTER_NUM_BYTES : integer := 8;
signal filter_data, filter_data_check : std_logic_vector(63 downto 0) := (others => '0');
signal filter_valid : std_logic := '0';
begin
@ -132,6 +137,18 @@ begin
o_sos_event => open
);
evr320_data_filter_inst: entity work.evr320_data_filter
generic map (
ADDRESS => FILTER_ADDRESS,
NUM_BYTES => 8
)
port map (
i_stream_clk => usr_clk,
i_stream_data => dec_stream_data,
i_stream_valid => dec_stream_valid,
o_data => filter_data,
o_valid => filter_valid
);
-----------------------------------------------------------------------------
-- MGT / User clock
-----------------------------------------------------------------------------
@ -171,6 +188,18 @@ begin
end if;
end process;
---------------------------------------------------------
-- Fetch filter data
---------------------------------------------------------
process
begin
wait until rising_edge(usr_clk);
if (filter_valid = '1') then
filter_data_check <= filter_data;
log(ID_SEGMENT_DATA, "Filter Valid: data=0x" & to_string(filter_data, HEX));
end if;
end process;
-----------------------------------------------------------------------------
-- Read stimuli file
-----------------------------------------------------------------------------
@ -208,8 +237,8 @@ begin
mgt_stream(i).event_k <= event_k;
mgt_stream_index <= i;
--debug output:
log(ID_SEGMENT_DATA, "stimuli file: i=" & integer'image(i) & " event=0x" & to_string(event, HEX) & " k=" & to_string(event_k, HEX)
& " data=0x" & to_string(data, HEX) & " k=" & to_string(data_k, HEX) & " ");
--log(ID_SEGMENT_DATA, "stimuli file: i=" & integer'image(i) & " event=0x" & to_string(event, HEX) & " k=" & to_string(event_k, HEX)
-- & " data=0x" & to_string(data, HEX) & " k=" & to_string(data_k, HEX) & " ");
-- Parse only segment:
----------------------
case (parse_fsm) is
@ -254,13 +283,12 @@ begin
constant c_TB_NAME : string := "evr320_decoder_tb";
variable mgt_stream_rep_var : integer := 0;
variable mgt_stream_index_var : integer := 0;
variable i,g : integer := 0;
variable i : integer := 0;
type state is (idle, payload, frame_end, segment_nr);
variable var_data_state : state;
variable var_data : std_logic_vector(7 downto 0);
variable var_data_k : std_logic_vector(0 downto 0);
variable mem_base : integer range 0 to 127;
variable segment_data_word : std_logic_vector(31 downto 0);
variable var_filter_offset : integer range 0 to 2047;
variable var_filter_word : std_logic_vector(FILTER_NUM_BYTES*8-1 downto 0);
begin
-- init uvvm:
set_log_file_name(c_TB_NAME & "_LOG.txt");
@ -302,17 +330,24 @@ begin
--------------------------------------------------------------------------
-- Check if decoder stream is correct
--------------------------------------------------------------------------
var_data := x"00";
var_data_k := "0";
i := 0;
g := 0;
var_data_state := idle;
await_value(dec_stream_recv_bytes, segment_length, 0 ns, 5 us, ERROR, "Wait for right number of bytes streamed");
-- loop through segment and compare frame bytes with received decoder-stream:
for idx in 0 to segment_length-1 loop
check_value(dec_stream_check(idx).data, segment_data(idx), ERROR, "Compare Sent and Received Decoder Stream Data");
end loop;
--------------------------------------------------------------------------
-- Check if filter data is correct
--------------------------------------------------------------------------
var_filter_offset := to_integer(unsigned(FILTER_ADDRESS)) - (to_integer(unsigned(segment_addr))*16);
--log(ID_CTRL, "var_filter_offset=" & integer'image(var_filter_offset) & " : " & to_string(FILTER_ADDRESS,HEX) & " : " & to_string(segment_addr, HEX));
for idx in 0 to FILTER_NUM_BYTES-1 loop
var_filter_word := var_filter_word(var_filter_word'high-8 downto 0) & segment_data(var_filter_offset + idx);
end loop;
check_value(filter_data_check, var_filter_word, ERROR, "Check Data Stream Filter "
& "addr=0x" & to_string(FILTER_ADDRESS, HEX)
& " bytes=" & integer'image(FILTER_NUM_BYTES));
--------------------------------------------------------------------------
-- Read DPRAM buffer
--------------------------------------------------------------------------