self checking segment sent/recv comparison

This commit is contained in:
2018-12-04 17:01:38 +01:00
parent 35077a9d84
commit 5e79f3f426

View File

@ -2,7 +2,7 @@
-- Paul Scherrer Institute (PSI)
--------------------------------------------------------------------------------
-- Unit : evr320_decoder_tb.vhd
-- Author : Goran Marinkovic, Section Diagnostic
-- Author : Goran Marinkovic, Section Diagnostic, Jonas Purtschert
-- Version : $Revision: 1.1 $
--------------------------------------------------------------------------------
-- Copyright© PSI, Section Diagnostic
@ -14,7 +14,6 @@ library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_textio.all;
use ieee.std_logic_1164.all;
@ -80,7 +79,13 @@ architecture testbench of evr320_decoder_tb is
signal dec_stream_data : std_logic_vector(11+8-1 downto 0) := (others => '0');
signal dec_stream_valid : std_logic;
signal dec_stream_check : dec_stream_check_arr(127 downto 0);
signal dec_stream_check : dec_stream_check_arr(0 to 2047);
signal dec_stream_recv_bytes : integer range 0 to 2047;
type segment_data_arr is array (natural range <>) of std_logic_vector(7 downto 0);
signal segment_addr : std_logic_vector(7 downto 0);
signal segment_data : segment_data_arr(0 to 2047);
signal segment_length : natural range 0 to 2047;
signal usr_events : std_logic_vector( 3 downto 0) := (others => '0');
@ -146,7 +151,7 @@ begin
end process;
---------------------------------------------------------
-- Print decoder stream
-- Receive decoder data stream
---------------------------------------------------------
process
variable addr : std_logic_vector(10 downto 0);
@ -157,11 +162,12 @@ begin
if (dec_stream_valid = '1') then
addr := dec_stream_data(18 downto 8);
data := dec_stream_data(7 downto 0);
-- save stream for later comparision:
dec_stream_check(i).addr <= addr;
dec_stream_check(i).data <= data;
log(ID_SEGMENT_DATA, "Decoder Data Stream: addr=0x" & to_string(addr, HEX)
& " data=0x" & to_string(data, HEX));
log(ID_SEGMENT_DATA, "Recv Decoder Stream: count=" & integer'image(i) & " addr=0x" & to_string(addr, HEX) & " data=0x" & to_string(data, HEX));
i := i + 1;
dec_stream_recv_bytes <= i;
end if;
end process;
@ -170,6 +176,7 @@ begin
-----------------------------------------------------------------------------
file_blk : block
file file_stimuli : text;
type parse_fsm_state is (idle, seg_start, seg_addr, seg_Wait, seg_payload, seg_payload_wait, seg_done);
begin
process
variable file_line : line;
@ -177,11 +184,14 @@ begin
variable data_k, event_k : std_logic_vector(0 downto 0);
variable space : character;
variable i : integer;
variable parse_fsm : parse_fsm_state := idle;
variable payload_cnt : integer range 0 to 2047;
begin
file_open(file_stimuli, "../tb/stimuli_mgt.dat", read_mode);
readline(file_stimuli, file_line);
readline(file_stimuli, file_line);
readline(file_stimuli, file_line); -- comment
readline(file_stimuli, file_line); -- comment
i := 0;
-- read line by line from .dat file:
while not endfile(file_stimuli) loop
readline(file_stimuli, file_line);
hread(file_line, event);
@ -198,8 +208,37 @@ 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
when idle =>
if (data = x"5C" and data_k = "1") then -- check if frame start
parse_fsm := seg_start;
end if;
when seg_start =>
parse_fsm := seg_addr;
when seg_addr =>
segment_addr <= data;
parse_fsm := seg_wait;
when seg_wait =>
parse_fsm := seg_payload;
payload_cnt := 0;
when seg_payload =>
if (data = x"3C" and data_k = "1") then -- check if frame end
parse_fsm := seg_done;
else
segment_data(payload_cnt) <= data;
parse_fsm := seg_payload_wait;
segment_length <= payload_cnt+1;
end if;
when seg_payload_wait =>
payload_cnt := payload_cnt + 1;
parse_fsm := seg_payload;
when seg_done =>
-- done
end case;
i := i + 1;
end loop;
file_close(file_stimuli);
@ -216,10 +255,12 @@ begin
variable mgt_stream_rep_var : integer := 0;
variable mgt_stream_index_var : integer := 0;
variable i,g : integer := 0;
type state is (idle, payload, frame_end);
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);
begin
-- init uvvm:
set_log_file_name(c_TB_NAME & "_LOG.txt");
@ -250,7 +291,7 @@ begin
-- Stimuli MGT
--------------------------------------------------------------------------
wait until rising_edge(rxusrclk);
log(ID_DATA, "Stimuli Stream for MGT");
log(ID_DATA, "Start stimuli Stream for MGT");
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);
@ -258,20 +299,6 @@ begin
rxcharisk <= mgt_stream(idx).data_k & mgt_stream(idx).event_k;
end loop;
--------------------------------------------------------------------------
-- Test receiving a package
--------------------------------------------------------------------------
wait for 1 us;
log(ID_DATA, "Read Segment from DPRAM");
-- print 16 words from dpram data buffer:
for offset in 0 to 7 loop
mem_addr <= std_logic_vector(to_unsigned(8 + offset, 12));
wait until rising_edge(usr_clk);
wait until rising_edge(usr_clk);
wait until rising_edge(usr_clk);
log(ID_PACKET_DATA, "Data buffer DPRAM: addr=0x" & to_string(mem_addr, HEX) & " data=0x" & to_string(mem_data, HEX));
end loop;
--------------------------------------------------------------------------
-- Check if decoder stream is correct
--------------------------------------------------------------------------
@ -280,29 +307,30 @@ begin
i := 0;
g := 0;
var_data_state := idle;
-- loop through mgt frame and compare frame bytes with received decoder-stream:
while var_data_state /= frame_end loop
i := i + 1;
var_data := mgt_stream(i).data;
var_data_k := mgt_stream(i).data_k;
if (var_data = x"3C" and var_data_k = "1") then -- check if frame end:
var_data_state := frame_end;
next;
end if;
if (var_data = x"5C" and var_data_k = "1") then -- check if frame start:
i := i + 3; -- skip segment address and dist. bytes
var_data_state := payload;
g := 0; -- init decoder stream index
next;
end if;
-- compare only frame bytes:
if (var_data_state = payload) then
check_value(dec_stream_check(g).data, var_data, ERROR, "Compare Sent and Received Decoder Stream Data");
--log (ID_CTRL, " check: " & to_string(var_data, HEX) & " = " & to_string(dec_stream_check(g).data, HEX));
i := i + 1; -- skip dist. byte
g := g + 1;
end if;
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;
--------------------------------------------------------------------------
-- Read DPRAM buffer
--------------------------------------------------------------------------
wait for 1 us;
log(ID_DATA, "Read Segment from DPRAM");
-- print 16 words from dpram data buffer:
for offset in 0 to segment_length/4-1 loop
mem_base := to_integer(unsigned(segment_addr));
mem_addr <= std_logic_vector(to_unsigned(4*mem_base + offset , 12));
wait until rising_edge(usr_clk);
wait until rising_edge(usr_clk);
wait until rising_edge(usr_clk);
segment_data_word := segment_data(offset*4+3)
& segment_data(offset*4+2)
& segment_data(offset*4+1)
& segment_data(offset*4);
check_value(mem_data, segment_data_word, ERROR, "Compare DPRAM with Sent Segment");
--log(ID_PACKET_DATA, "Data buffer DPRAM: addr=0x" & to_string(mem_addr, HEX) & " data=0x" & to_string(mem_data, HEX));
end loop;
--------------------------------------------------------------------------