DEVEL: extended testbench with checks for event recorder
This commit is contained in:
@ -34,7 +34,7 @@ entity evr320_decoder_tb is
|
||||
g_EVENT_NR_1 : integer range 0 to 255 := 16#04#;
|
||||
g_EVENT_NR_2 : integer range 0 to 255 := 16#00#;
|
||||
g_EVENT_NR_3 : integer range 0 to 255 := 16#00#;
|
||||
g_EVENT_NR_SOS : integer range 0 to 255 := 16#00#
|
||||
g_EVENT_NR_SOS : integer range 0 to 255 := 16#20#
|
||||
);
|
||||
end entity;
|
||||
|
||||
@ -46,6 +46,9 @@ architecture testbench of evr320_decoder_tb is
|
||||
constant C_RXUSRCLK_CYCLE : time:= 7 ns;
|
||||
constant C_USRCLK_CYCLE : time:= 8 ns;
|
||||
constant C_EVT_NR : integer := 4;
|
||||
constant C_MEM_DATA_WIDTH : integer := 32; -- 32|64 (64 bit used for tosca2 on ifc1210)
|
||||
constant C_EVENT_RECORDER : boolean := true;
|
||||
constant C_EVENT_REC_FLAGS : std_logic_vector(11 downto 6) := B"1101_11";
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
-- MGT stream
|
||||
@ -115,6 +118,10 @@ architecture testbench of evr320_decoder_tb is
|
||||
|
||||
-- Event Recorder
|
||||
signal event_recorder_status : typ_evt_rec_status;
|
||||
signal event_recorder_ctrl : typ_evt_rec_ctrl := c_INIT_EVT_REC_CTRL;
|
||||
signal check_evt_rec_events : std_logic := '0';
|
||||
signal all_expected_events : std_logic_vector(255 downto 0) := (others => '0');
|
||||
signal expected_user_events : integer range 0 to 255 := 0;
|
||||
|
||||
begin
|
||||
|
||||
@ -124,8 +131,8 @@ begin
|
||||
evr320_decoder_inst: entity work.evr320_decoder
|
||||
generic map
|
||||
(
|
||||
EVENT_RECORDER => true,
|
||||
MEM_DATA_WIDTH => 32
|
||||
EVENT_RECORDER => C_EVENT_RECORDER,
|
||||
MEM_DATA_WIDTH => C_MEM_DATA_WIDTH
|
||||
)
|
||||
port map
|
||||
(
|
||||
@ -147,7 +154,7 @@ begin
|
||||
i_usr_clk => usr_clk,
|
||||
i_evr_params => evr_params,
|
||||
o_event_recorder_stat => event_recorder_status,
|
||||
i_event_recorder_ctrl => c_INIT_EVT_REC_CTRL,
|
||||
i_event_recorder_ctrl => event_recorder_ctrl,
|
||||
i_mem_addr => mem_addr,
|
||||
o_mem_data => mem_data,
|
||||
--------------------------------------------------------------------------
|
||||
@ -217,6 +224,7 @@ begin
|
||||
variable event_cnt_1 : integer := 0;
|
||||
variable event_cnt_2 : integer := 0;
|
||||
variable event_cnt_3 : integer := 0;
|
||||
variable event_cnt_user : integer := 0;
|
||||
begin
|
||||
file_open(file_stimuli, "../tb/stimuli_mgt.dat", read_mode);
|
||||
readline(file_stimuli, file_line); -- comment
|
||||
@ -271,10 +279,18 @@ begin
|
||||
|
||||
-- Event Recorder:
|
||||
------------------
|
||||
if (event = std_logic_vector(to_unsigned(g_EVENT_NR_SOS, 8)) and event_k = "0") then
|
||||
log("Start-of-Sequence Event in Stimuli present");
|
||||
if (event_k = "0") then
|
||||
all_expected_events(to_integer(unsigned(event))) <= '1';
|
||||
if (event = std_logic_vector(to_unsigned(g_EVENT_NR_SOS, 8))) then
|
||||
log("Start-of-Sequence Event in Stimuli present");
|
||||
end if;
|
||||
if (event /= X"00" and event(7 downto 4) /= X"7") then
|
||||
event_cnt_user := event_cnt_user + 1;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
|
||||
expected_user_events <= event_cnt_user;
|
||||
|
||||
-- Parse only segment:
|
||||
----------------------
|
||||
case (parse_fsm) is
|
||||
@ -367,6 +383,7 @@ begin
|
||||
wait until rising_edge(rxusrclk);
|
||||
if (sos_event = '1') then
|
||||
log(ID_CTRL, "Start of Sequence Event Received: "& to_string(std_logic_vector(to_unsigned(g_EVENT_NR_SOS, 8)), HEX, AS_IS, INCL_RADIX) ); -- change to await_value
|
||||
check_evt_rec_events <= '1';
|
||||
end if;
|
||||
end process;
|
||||
|
||||
@ -384,6 +401,7 @@ begin
|
||||
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);
|
||||
variable expected_evt_rec_events : integer range 0 to 255 := 0;
|
||||
begin
|
||||
-- init uvvm:
|
||||
set_log_file_name(c_TB_NAME & "_LOG.txt");
|
||||
@ -391,22 +409,26 @@ begin
|
||||
set_alert_stop_limit(ERROR, 0); -- never(0) pause simulator on error
|
||||
set_alert_stop_limit(TB_ERROR, 0); -- never(0) pause simulator on error
|
||||
enable_log_msg(ALL_MESSAGES);
|
||||
--------------------------------------------------------------------------
|
||||
log(ID_LOG_HDR, "Start Simulation of evr320 decoder", C_SCOPE);
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Get out of reset, enable events
|
||||
--------------------------------------------------------------------------
|
||||
evr_params.event_enable( 0) <= '0' when g_EVENT_NR_0 = 0 else '1';
|
||||
evr_params.event_enable( 1) <= '0' when g_EVENT_NR_1 = 0 else '1';
|
||||
evr_params.event_enable( 2) <= '0' when g_EVENT_NR_2 = 0 else '1';
|
||||
evr_params.event_enable( 3) <= '0' when g_EVENT_NR_3 = 0 else '1';
|
||||
evr_params.event_numbers( 0) <= std_logic_vector(to_unsigned(g_EVENT_NR_0, 8));
|
||||
evr_params.event_numbers( 1) <= std_logic_vector(to_unsigned(g_EVENT_NR_1, 8));
|
||||
evr_params.event_numbers( 2) <= std_logic_vector(to_unsigned(g_EVENT_NR_2, 8));
|
||||
evr_params.event_numbers( 3) <= std_logic_vector(to_unsigned(g_EVENT_NR_3, 8));
|
||||
evr_params.cs_min_cnt <= X"00000000";
|
||||
evr_params.cs_min_time <= X"00000000";
|
||||
mem_addr <= x"000";
|
||||
evr_params.event_enable( 0) <= '0' when g_EVENT_NR_0 = 0 else '1';
|
||||
evr_params.event_enable( 1) <= '0' when g_EVENT_NR_1 = 0 else '1';
|
||||
evr_params.event_enable( 2) <= '0' when g_EVENT_NR_2 = 0 else '1';
|
||||
evr_params.event_enable( 3) <= '0' when g_EVENT_NR_3 = 0 else '1';
|
||||
event_recorder_ctrl.event_enable <= '0' when g_EVENT_NR_SOS = 0 else '1';
|
||||
evr_params.event_numbers( 0) <= std_logic_vector(to_unsigned(g_EVENT_NR_0, 8));
|
||||
evr_params.event_numbers( 1) <= std_logic_vector(to_unsigned(g_EVENT_NR_1, 8));
|
||||
evr_params.event_numbers( 2) <= std_logic_vector(to_unsigned(g_EVENT_NR_2, 8));
|
||||
evr_params.event_numbers( 3) <= std_logic_vector(to_unsigned(g_EVENT_NR_3, 8));
|
||||
event_recorder_ctrl.event_number <= std_logic_vector(to_unsigned(g_EVENT_NR_SOS, 8));
|
||||
evr_params.cs_min_cnt <= X"00000000";
|
||||
evr_params.cs_min_time <= X"00000000";
|
||||
mem_addr <= x"000";
|
||||
await_value(rxlos, '0', 0 ns, 10 us, FAILURE, "wait for release RX LOS");
|
||||
--wait until (rxlos = '0');
|
||||
|
||||
@ -415,7 +437,7 @@ begin
|
||||
--------------------------------------------------------------------------
|
||||
wait until rising_edge(rxusrclk);
|
||||
for b in 0 to STIMULI_RUNS-1 loop
|
||||
log(ID_DATA, "Send stimuli stream to MGT");
|
||||
log(ID_LOG_HDR, "Send stimuli stream to MGT - RUN " & to_string(b+1));
|
||||
for idx in 0 to mgt_stream_index loop
|
||||
--log(ID_FRAME_DATA, to_string(mgt_stream(idx).data, HEX), to_string(mgt_stream(idx).event, HEX));
|
||||
wait until rising_edge(rxusrclk);
|
||||
@ -425,7 +447,7 @@ begin
|
||||
end loop;
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Check if decoder stream is correct
|
||||
log(ID_LOG_HDR, "Check if decoder stream is correct", C_SCOPE);
|
||||
--------------------------------------------------------------------------
|
||||
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:
|
||||
@ -434,7 +456,7 @@ begin
|
||||
end loop;
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Check if filter data is correct
|
||||
log(ID_LOG_HDR, "Check if filter data is correct", C_SCOPE);
|
||||
--------------------------------------------------------------------------
|
||||
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));
|
||||
@ -451,12 +473,40 @@ begin
|
||||
for i in 0 to C_EVT_NR-1 loop
|
||||
check_value(received_events(i), expect_events(i), ERROR, "Event " & to_string(i) & ": received = " & to_string(received_events(i)) & ", expected = " & to_string(expect_events(i)));
|
||||
end loop;
|
||||
-- check_value(to_integer(unsigned(event_recorder_status.usr_events_counter)), expect_events_total, ERROR, "Total Events: received = " & to_string(event_recorder_status.usr_events_counter) & ", expected = " & to_string(expect_events_total));
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
-- Read DPRAM buffer
|
||||
log(ID_LOG_HDR, "Event Recorder Checks", C_SCOPE);
|
||||
--------------------------------------------------------------------------
|
||||
wait for 1 us;
|
||||
if (C_EVENT_RECORDER) then
|
||||
if (check_evt_rec_events = '1' and STIMULI_RUNS > 1) then
|
||||
|
||||
----------------------------------------------------------------------
|
||||
log(ID_DATA, "Check expected Event Flags after SOS Event detected");
|
||||
----------------------------------------------------------------------
|
||||
for addr in 0 to 63 loop
|
||||
wait until rising_edge(usr_clk);
|
||||
mem_addr <= C_EVENT_REC_FLAGS & std_logic_vector(to_unsigned(addr, 6));
|
||||
wait until rising_edge(usr_clk);
|
||||
wait until rising_edge(usr_clk);
|
||||
check_value(mem_data(0), all_expected_events(4*addr), ERROR, "Event " & to_string(4*addr) & " Flag");
|
||||
check_value(mem_data(8), all_expected_events(4*addr + 1), ERROR, "Event " & to_string(4*addr + 1) & " Flag");
|
||||
check_value(mem_data(16), all_expected_events(4*addr + 2), ERROR, "Event " & to_string(4*addr + 2) & " Flag");
|
||||
check_value(mem_data(24), all_expected_events(4*addr + 3), ERROR, "Event " & to_string(4*addr + 3) & " Flag");
|
||||
end loop;
|
||||
|
||||
----------------------------------------------------------------------
|
||||
log(ID_DATA, "Check expected Event Recorder User Events");
|
||||
----------------------------------------------------------------------
|
||||
check_value(to_integer(unsigned(event_recorder_status.usr_events_counter)), expected_user_events, ERROR, "Total User Events: received = " & to_string(to_integer(unsigned(event_recorder_status.usr_events_counter))) & ", expected = " & to_string(expected_user_events));
|
||||
|
||||
end if;
|
||||
end if;
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
log(ID_LOG_HDR, "Read DPRAM buffer", C_SCOPE);
|
||||
--------------------------------------------------------------------------
|
||||
wait for 50 * C_USRCLK_CYCLE;
|
||||
log(ID_DATA, "Read Segment from DPRAM");
|
||||
-- print 16 words from dpram data buffer:
|
||||
for offset in 0 to segment_length/4-1 loop
|
||||
|
@ -95,41 +95,41 @@ BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
04 0 00 0 event 4
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
70 0 00 0 system event
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
0F 0 00 0 BPM event
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
20 0 00 0 event Start-of-Sequence
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
01 0 00 0 event 1
|
||||
02 0 00 0 event 2
|
||||
03 0 00 0 event 3
|
||||
@ -139,8 +139,32 @@ BC 1 00 0 align
|
||||
06 0 00 0 event 6
|
||||
BC 1 00 0 align
|
||||
07 0 00 0 event 7
|
||||
04 0 00 0 event 4
|
||||
08 0 00 0 event 8
|
||||
09 0 00 0 event 9
|
||||
BC 1 00 0 align
|
||||
0A 0 00 0 event 10
|
||||
0B 0 00 0 event 11
|
||||
0C 0 00 0 event 12
|
||||
BC 1 00 0 align
|
||||
32 0 00 0 event 50
|
||||
33 0 00 0 event 51
|
||||
34 0 00 0 event 52
|
||||
BC 1 00 0 align
|
||||
35 0 00 0 event 53
|
||||
36 0 00 0 event 54
|
||||
37 0 00 0 event 55
|
||||
BC 1 00 0 align
|
||||
38 0 00 0 event 56
|
||||
39 0 00 0 event 57
|
||||
3A 0 00 0 event 58
|
||||
BC 1 00 0 align
|
||||
FA 0 00 0 event 250
|
||||
FB 0 00 0 event 251
|
||||
FC 0 00 0 event 252
|
||||
BC 1 00 0 align
|
||||
FD 0 00 0 event 253
|
||||
FE 0 00 0 event 254
|
||||
FF 0 00 0 event 255
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
0F 0 00 0 gap
|
||||
@ -156,4 +180,8 @@ BC 1 00 0 align
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
BC 1 00 0 align
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
||||
00 0 00 0 gap
|
Reference in New Issue
Block a user