library ieee;
use ieee.std_logic_1164.all;
use work.testing_functions.all;
use work.data_link_pkg.all;
entity ilas_parser_tb is
end entity ilas_parser_tb;
architecture a1 of ilas_parser_tb is
type test_vector is record
ci_state : link_state;
di_char : character_vector;
expected_finished : std_logic;
expected_error : std_logic;
expected_wrong_chksum : std_logic;
expected_unexpected_char : std_logic;
expected_config_index : integer;
end record test_vector;
type config_array is array (natural range<>) of link_config;
constant config_vectors : config_array :=
(
-- DID = 10101010
-- ADJCNT = 0111
-- BID = 1110
-- ADJDIR = 1
-- PHADJ = 0
-- LID 01010
-- SCR = 1
-- L = 11110
-- F = 11001100
-- K = 11111
-- M = 00110011
-- CS = 10
-- N = 00011
-- SUBCLASSV = 1
-- Nn = 11101
-- JESDV = 0
-- S = 0
-- HD = 0
-- CF = 0
-- RES1 = 11111111
-- RES2 = 00000000
-- X = 010010000
);
type test_vector_array is array (natural range<>) of test_vector;
constant test_vectors : test_vector_array :=
(
-- correct sequence, config index 0
(INIT, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', -1), -- R, 0 mult
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "01111100"), '0', '0', '0', '0', -1), -- A
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', -1), -- R, 1 mult
(ILAS, ('1', '0', '0', "10011100"), '0', '0', '0', '0', -1), -- 28.4
(ILAS, ('0', '0', '0', "10101010"), '0', '0', '0', '0', -1), -- DID
(ILAS, ('0', '0', '0', "01111110"), '0', '0', '0', '0', -1), -- ADJCNT,BID
(ILAS, ('0', '0', '0', "01001010"), '0', '0', '0', '0', -1), -- X,ADJDIR,PHADJ,LID
(ILAS, ('0', '0', '0', "11011110"), '0', '0', '0', '0', -1), -- SCR,X,L
(ILAS, ('0', '0', '0', "11001100"), '0', '0', '0', '0', -1), -- F
(ILAS, ('0', '0', '0', "01011111"), '0', '0', '0', '0', -1), -- X, K
(ILAS, ('0', '0', '0', "00110011"), '0', '0', '0', '0', -1), -- M
(ILAS, ('0', '0', '0', "10000011"), '0', '0', '0', '0', -1), -- CS,X,N
(ILAS, ('0', '0', '0', "00111101"), '0', '0', '0', '0', -1), -- SUBCLASSV,Nn
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1), -- JESDV,S
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "11111111"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00110000"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "01111100"), '0', '0', '0', '0', 0), -- A
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', 0), -- R
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('1', '0', '0', "01111100"), '0', '0', '0', '0', 0), -- A
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', 0), -- R, 2 mult
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', 0),
(ILAS, ('1', '0', '0', "01111100"), '0', '0', '0', '0', 0), -- A
(DATA, ('0', '0', '0', "00000001"), '1', '0', '0', '0', 0),
(DATA, ('0', '0', '0', "00000010"), '1', '0', '0', '0', 0),
(DATA, ('0', '0', '0', "00000011"), '1', '0', '0', '0', 0),
-- incorrect sequence - /R/ at wrong place
(INIT, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', -1), -- R, 0 mult
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "00011100"), '0', '1', '0', '1', -1), -- R, wrong place
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '0', '1', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '0', '1', -1),
(INIT, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
-- incorrect sequence - /A/ at wrong place
(INIT, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', -1), -- R, 0 mult
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "01111100"), '0', '1', '0', '1', 0), -- A
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '0', '1', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '0', '1', -1),
(INIT, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
-- incorrect sequence - wrong check sum
(INIT, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(CGS, ('0', '0', '0', "10111100"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', -1), -- R, 0 mult
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', -1), -- R, 0 mult
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "01111100"), '0', '0', '0', '0', -1), -- A
(ILAS, ('1', '0', '0', "00011100"), '0', '0', '0', '0', -1), -- R, 1 mult
(ILAS, ('1', '0', '0', "10011100"), '0', '0', '0', '0', -1), -- 28.4
(ILAS, ('0', '0', '0', "10101010"), '0', '0', '0', '0', -1), -- DID
(ILAS, ('0', '0', '0', "01111110"), '0', '0', '0', '0', -1), -- ADJCNT,BID
(ILAS, ('0', '0', '0', "01001010"), '0', '0', '0', '0', -1), -- X,ADJDIR,PHADJ,LID
(ILAS, ('0', '0', '0', "11011110"), '0', '0', '0', '0', -1), -- SCR,X,L
(ILAS, ('0', '0', '0', "11001100"), '0', '0', '0', '0', -1), -- F
(ILAS, ('0', '0', '0', "01011111"), '0', '0', '0', '0', -1), -- X, K
(ILAS, ('0', '0', '0', "00110011"), '0', '0', '0', '0', -1), -- M
(ILAS, ('0', '0', '0', "10000011"), '0', '0', '0', '0', -1), -- CS,X,N
(ILAS, ('0', '0', '0', "00111101"), '0', '0', '0', '0', -1), -- SUBCLASSV,Nn
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1), -- JESDV,S
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "11111111"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '0', '0', '0', -1),
(ILAS, ('1', '0', '0', "01111100"), '0', '1', '1', '0', -1), -- A
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '1', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '1', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '1', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '1', '0', -1),
(ILAS, ('0', '0', '0', "00000000"), '0', '1', '1', '0', -1)
);
constant clk_period : time := 1 ns;
constant F : integer range 0 to 256 := 17;
signal clk : std_logic := '0';
signal reset : std_logic := '0';
signal ci_state : link_state := INIT;
signal di_char : character_vector;
signal do_config : link_config;
signal co_finished : std_logic;
signal co_error : std_logic;
signal co_wrong_chksum : std_logic;
signal co_unexpected_char : std_logic;
signal test_data_index : integer := 0;
begin -- architecture a1
uut: entity work.ilas_parser
port map (
ci_char_clk => clk,
ci_reset => reset,
ci_F => F,
ci_state => ci_state,
di_char => di_char,
do_config => do_config,
co_finished => co_finished,
co_error => co_error,
co_wrong_chksum => co_wrong_chksum,
co_unexpected_char => co_unexpected_char);
clk <= not clk after clk_period/2;
reset <= '1' after clk_period*2;
test: process is
variable test_vec : test_vector;
variable prev_test_vec : test_vector;
begin -- process test
wait for clk_period*2;
for i in test_vectors'range loop
test_data_index <= i;
test_vec := test_vectors(i);
di_char <= test_vec.di_char;
ci_state <= test_vec.ci_state;
if i > 0 then
prev_test_vec := test_vectors(i - 1);
if prev_test_vec.expected_config_index > -1 then
assert co_config = config_vectors(prev_test_vec.expected_config_index) report "The config does not match. Index: " & integer'image(i-1) severity error;
end if;
assert co_error = prev_test_vec.expected_error report "The error does not match. Index: " & integer'image(i-1) severity error;
assert co_wrong_chksum = prev_test_vec.expected_wrong_chksum report "The wrong_chksum does not match. Index: " & integer'image(i-1) severity error;
assert co_unexpected_char = prev_test_vec.expected_unexpected_char report "The unexpected_char does not match. Index: " & integer'image(i-1) severity error;
assert co_finished = prev_test_vec.expected_finished report "The finished does not match. Index: " & integer'image(i-1) severity error;
end if;
wait for clk_period;
end loop; -- i
wait for 100 ms;
end process test;
end architecture a1;