self checking testbench: read MGT frame from file and compare data

stream
This commit is contained in:
2018-12-03 17:15:39 +01:00
parent 2634412bd0
commit 35077a9d84
2 changed files with 250 additions and 164 deletions

View File

@ -44,145 +44,17 @@ architecture testbench of evr320_decoder_tb is
-- MGT stream
---------------------------------------------------------------------------
type mgt_stream_sample_type is record
data : std_logic_vector(15 downto 0);
charisk : std_logic_vector( 1 downto 0);
data : std_logic_vector(7 downto 0);
data_k : std_logic_vector(0 downto 0);
event : std_logic_vector(7 downto 0);
event_k : std_logic_vector(0 downto 0);
end record mgt_stream_sample_type;
type mgt_stream_type is array (natural range <>) of mgt_stream_sample_type;
signal mgt_stream_index : integer range 0 to 127 := 0;
constant mgt_stream : mgt_stream_type(0 to 127) :=
(
0 => (data => X"0000", charisk => "00"), -- gap
1 => (data => X"00BC", charisk => "01"), -- align
2 => (data => X"0000", charisk => "00"), -- gap
3 => (data => X"0000", charisk => "00"), -- gap
4 => (data => X"0000", charisk => "00"), -- gap
5 => (data => X"00BC", charisk => "01"), -- align
6 => (data => X"0000", charisk => "00"), -- gap
7 => (data => X"0000", charisk => "00"), -- gap
8 => (data => X"0000", charisk => "00"), -- gap
9 => (data => X"00BC", charisk => "01"), -- align
10 => (data => X"5C00", charisk => "10"), -- frame start
11 => (data => X"0000", charisk => "00"), -- gap
12 => (data => X"0200", charisk => "00"), -- frame byte
13 => (data => X"00BC", charisk => "01"), -- align
14 => (data => X"DB00", charisk => "00"), -- frame byte
15 => (data => X"0000", charisk => "00"), -- gap
16 => (data => X"9300", charisk => "00"), -- frame byte
17 => (data => X"00BC", charisk => "01"), -- align
18 => (data => X"3600", charisk => "00"), -- frame byte
19 => (data => X"0000", charisk => "00"), -- gap
20 => (data => X"4100", charisk => "00"), -- frame byte
21 => (data => X"00BC", charisk => "01"), -- align
22 => (data => X"0000", charisk => "00"), -- frame byte
23 => (data => X"0000", charisk => "00"), -- gap
24 => (data => X"0000", charisk => "00"), -- frame byte
25 => (data => X"00BC", charisk => "01"), -- align
26 => (data => X"0000", charisk => "00"), -- frame byte
27 => (data => X"0000", charisk => "00"), -- gap
28 => (data => X"0000", charisk => "00"), -- frame byte
29 => (data => X"00BC", charisk => "01"), -- align
30 => (data => X"A300", charisk => "00"), -- frame byte
31 => (data => X"0000", charisk => "00"), -- gap
32 => (data => X"1D00", charisk => "00"), -- frame byte
33 => (data => X"00BC", charisk => "01"), -- align
34 => (data => X"7F00", charisk => "00"), -- frame byte
35 => (data => X"0000", charisk => "00"), -- gap
36 => (data => X"3300", charisk => "00"), -- frame byte
37 => (data => X"00BC", charisk => "01"), -- align
38 => (data => X"9B00", charisk => "00"), -- frame byte
39 => (data => X"0000", charisk => "00"), -- gap
40 => (data => X"F300", charisk => "00"), -- frame byte
41 => (data => X"00BC", charisk => "01"), -- align
42 => (data => X"5100", charisk => "00"), -- frame byte
43 => (data => X"0000", charisk => "00"), -- gap
44 => (data => X"0400", charisk => "00"), -- frame byte
45 => (data => X"00BC", charisk => "01"), -- align
46 => (data => X"6B00", charisk => "00"), -- frame byte
47 => (data => X"0000", charisk => "00"), -- gap
48 => (data => X"7C00", charisk => "00"), -- frame byte
49 => (data => X"00BC", charisk => "01"), -- align
50 => (data => X"1600", charisk => "00"), -- frame byte
51 => (data => X"0000", charisk => "00"), -- gap
52 => (data => X"0000", charisk => "00"), -- frame byte
53 => (data => X"00BC", charisk => "01"), -- align
54 => (data => X"0000", charisk => "00"), -- frame byte
55 => (data => X"0000", charisk => "00"), -- gap
56 => (data => X"0000", charisk => "00"), -- frame byte
57 => (data => X"00BC", charisk => "01"), -- align
58 => (data => X"0000", charisk => "00"), -- frame byte
59 => (data => X"0000", charisk => "00"), -- gap
60 => (data => X"0000", charisk => "00"), -- frame byte
61 => (data => X"00BC", charisk => "01"), -- align
62 => (data => X"0000", charisk => "00"), -- frame byte
63 => (data => X"0000", charisk => "00"), -- gap
64 => (data => X"0000", charisk => "00"), -- frame byte
65 => (data => X"00BC", charisk => "01"), -- align
66 => (data => X"0000", charisk => "00"), -- frame byte
67 => (data => X"0000", charisk => "00"), -- gap
68 => (data => X"0000", charisk => "00"), -- frame byte
69 => (data => X"00BC", charisk => "01"), -- align
70 => (data => X"0000", charisk => "00"), -- frame byte
71 => (data => X"0000", charisk => "00"), -- gap
72 => (data => X"0000", charisk => "00"), -- frame byte
73 => (data => X"00BC", charisk => "01"), -- align
74 => (data => X"0000", charisk => "00"), -- frame byte
75 => (data => X"0000", charisk => "00"), -- gap
76 => (data => X"0000", charisk => "00"), -- frame byte
77 => (data => X"00BC", charisk => "01"), -- align
78 => (data => X"3C00", charisk => "10"), -- frame end
79 => (data => X"0000", charisk => "00"), -- gap
80 => (data => X"F900", charisk => "00"), -- check sum MSB
81 => (data => X"00BC", charisk => "01"), -- align
82 => (data => X"C600", charisk => "00"), -- check sum LSB
83 => (data => X"0000", charisk => "00"), -- gap
84 => (data => X"0000", charisk => "00"), -- gap
85 => (data => X"00BC", charisk => "01"), -- align
86 => (data => X"0000", charisk => "00"), -- gap
87 => (data => X"0000", charisk => "00"), -- gap
88 => (data => X"0000", charisk => "00"), -- gap
89 => (data => X"00BC", charisk => "01"), -- align
90 => (data => X"0000", charisk => "00"), -- gap
91 => (data => X"0000", charisk => "00"), -- gap
92 => (data => X"0000", charisk => "00"), -- gap
93 => (data => X"00BC", charisk => "01"), -- align
94 => (data => X"0000", charisk => "00"), -- gap
95 => (data => X"0000", charisk => "00"), -- gap
96 => (data => X"0000", charisk => "00"), -- gap
97 => (data => X"00BC", charisk => "01"), -- align
98 => (data => X"0000", charisk => "00"), -- gap
99 => (data => X"0000", charisk => "00"), -- gap
100 => (data => X"0000", charisk => "00"), -- gap
101 => (data => X"00BC", charisk => "01"), -- align
102 => (data => X"0000", charisk => "00"), -- gap
103 => (data => X"0000", charisk => "00"), -- gap
104 => (data => X"0000", charisk => "00"), -- gap
105 => (data => X"00BC", charisk => "01"), -- align
106 => (data => X"0000", charisk => "00"), -- gap
107 => (data => X"0000", charisk => "00"), -- gap
108 => (data => X"0000", charisk => "00"), -- gap
109 => (data => X"00BC", charisk => "01"), -- align
110 => (data => X"0000", charisk => "00"), -- gap
111 => (data => X"0000", charisk => "00"), -- gap
112 => (data => X"0000", charisk => "00"), -- gap
113 => (data => X"00BC", charisk => "01"), -- align
114 => (data => X"0000", charisk => "00"), -- gap
115 => (data => X"0000", charisk => "00"), -- gap
116 => (data => X"0000", charisk => "00"), -- gap
117 => (data => X"00BC", charisk => "01"), -- align
118 => (data => X"0000", charisk => "00"), -- gap
119 => (data => X"0000", charisk => "00"), -- gap
120 => (data => X"0000", charisk => "00"), -- gap
121 => (data => X"00BC", charisk => "01"), -- align
122 => (data => X"0000", charisk => "00"), -- gap
123 => (data => X"0000", charisk => "00"), -- gap
124 => (data => X"0000", charisk => "00"), -- gap
125 => (data => X"00BC", charisk => "01"), -- align
126 => (data => X"0000", charisk => "00"), -- gap
127 => (data => X"000F", charisk => "00") -- BPM event
);
signal mgt_stream_index : integer range 0 to 511 := 0;
signal mgt_stream : mgt_stream_type(511 downto 0) := (others=>(others=>(others=>'0')));
-----------------------------------------------------------------------------
-- Timing decoder interface
-----------------------------------------------------------------------------
@ -199,8 +71,16 @@ architecture testbench of evr320_decoder_tb is
signal evr_params : typ_evr320_params;
signal mem_addr : std_logic_vector(11 downto 0) := (others => '0');
signal mem_data : std_logic_vector(31 downto 0) := (others => '0');
-- Decoder stream:
type dec_stream_type is record
data : std_logic_vector(7 downto 0);
addr : std_logic_vector(10 downto 0);
end record dec_stream_type;
type dec_stream_check_arr is array (natural range <>) of dec_stream_type;
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 usr_events : std_logic_vector( 3 downto 0) := (others => '0');
@ -271,28 +151,61 @@ begin
process
variable addr : std_logic_vector(10 downto 0);
variable data : std_logic_vector(7 downto 0);
variable i : integer := 0;
begin
wait until rising_edge(usr_clk);
if (dec_stream_valid = '1') then
addr := dec_stream_data(18 downto 8);
data := dec_stream_data(7 downto 0);
log(ID_SEGMENT_DATA, "Decoder Data Stream: addr=0x" & to_string(addr, HEX)
wait until rising_edge(usr_clk);
if (dec_stream_valid = '1') then
addr := dec_stream_data(18 downto 8);
data := dec_stream_data(7 downto 0);
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));
end if;
i := i + 1;
end if;
end process;
-----------------------------------------------------------------------------
-- Stimulus MGT interface
-- Read stimuli file
-----------------------------------------------------------------------------
-- process(rxusrclk)
-- begin
-- if rising_edge(rxusrclk) then
-- mgt_stream_index <= mgt_stream_index + 1;
-- end if;
-- end process mgt_stream_index_proc;
rxdata <= mgt_stream(mgt_stream_index).data;
rxcharisk <= mgt_stream(mgt_stream_index).charisk;
file_blk : block
file file_stimuli : text;
begin
process
variable file_line : line;
variable data, event : std_logic_vector(7 downto 0);
variable data_k, event_k : std_logic_vector(0 downto 0);
variable space : character;
variable i : integer;
begin
file_open(file_stimuli, "../tb/stimuli_mgt.dat", read_mode);
readline(file_stimuli, file_line);
readline(file_stimuli, file_line);
i := 0;
while not endfile(file_stimuli) loop
readline(file_stimuli, file_line);
hread(file_line, event);
read(file_line, event_k);
read(file_line, space);
read(file_line, space);
hread(file_line, data);
read(file_line, space);
read(file_line, data_k);
-- write to array:
mgt_stream(i).data <= data;
mgt_stream(i).data_k <= data_k;
mgt_stream(i).event <= data;
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) & " ");
i := i + 1;
end loop;
file_close(file_stimuli);
wait;
end process;
end block;
-----------------------------------------------------------------------------
-- Stimulus CPU interface
@ -302,6 +215,11 @@ 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;
type state is (idle, payload, frame_end);
variable var_data_state : state;
variable var_data : std_logic_vector(7 downto 0);
variable var_data_k : std_logic_vector(0 downto 0);
begin
-- init uvvm:
set_log_file_name(c_TB_NAME & "_LOG.txt");
@ -312,7 +230,7 @@ begin
log(ID_LOG_HDR, "Start Simulation of evr320 decoder", C_SCOPE);
--------------------------------------------------------------------------
-- Get out of reset
-- Get out of reset, enable events
--------------------------------------------------------------------------
evr_params.event_enable( 0) <= '1';
evr_params.event_enable( 1) <= '0';
@ -327,28 +245,66 @@ begin
mem_addr <= x"000";
await_value(rxlos, '0', 0 ns, 10 us, FAILURE, "wait for release RX LOS");
--wait until (rxlos = '0');
--------------------------------------------------------------------------
-- Stimuli MGT
--------------------------------------------------------------------------
wait until rising_edge(rxusrclk);
log(ID_DATA, "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);
rxdata <= mgt_stream(idx).data & mgt_stream(idx).event;
rxcharisk <= mgt_stream(idx).data_k & mgt_stream(idx).event_k;
end loop;
--------------------------------------------------------------------------
-- Test receiving a package
--------------------------------------------------------------------------
-- send mgt stream:
for mgt_stream_rep_var in 0 to 1 loop
wait for 30 ns;
for mgt_stream_index_var in 0 to 127 loop
wait until rising_edge(rxusrclk);
mgt_stream_index <= mgt_stream_index_var;
end loop;
end loop;
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(rxusrclk);
wait until rising_edge(rxusrclk);
wait until rising_edge(rxusrclk);
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
--------------------------------------------------------------------------
var_data := x"00";
var_data_k := "0";
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;
end loop;
--------------------------------------------------------------------------
-- Test Done
--------------------------------------------------------------------------

130
tb/stimuli_mgt.dat Normal file
View File

@ -0,0 +1,130 @@
# stimuli timing master frame, hex
# event k data k comment
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 5C 1 frame start
00 0 00 0 gap
00 0 02 0 frame byte
BC 1 00 0 align
00 0 DB 0 frame byte
00 0 00 0 gap
00 0 93 0 frame byte
BC 1 00 0 align
00 0 36 0 frame byte
00 0 00 0 gap
00 0 41 0 frame byte
BC 1 00 0 align
00 0 00 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 00 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 A3 0 frame byte
00 0 00 0 gap
00 0 1D 0 frame byte
BC 1 00 0 align
00 0 7F 0 frame byte
00 0 00 0 gap
00 0 33 0 frame byte
BC 1 00 0 align
00 0 9B 0 frame byte
00 0 00 0 gap
00 0 F3 0 frame byte
BC 1 00 0 align
00 0 51 0 frame byte
00 0 00 0 gap
00 0 04 0 frame byte
BC 1 00 0 align
00 0 6B 0 frame byte
00 0 00 0 gap
00 0 7C 0 frame byte
BC 1 00 0 align
00 0 16 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 00 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 00 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 00 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 00 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 00 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 00 0 frame byte
00 0 00 0 gap
00 0 00 0 frame byte
BC 1 00 0 align
00 0 3C 1 frame end
00 0 00 0 gap
00 0 F9 0 check sum MSB
BC 1 00 0 align
00 0 C6 0 check sum LSB
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
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
0F 0 00 0 BPM event