~ruther/jesd204b-vhdl

ref: 6f22c7a4793a3d38b0c155f4fc7e5536f3d467bb jesd204b-vhdl/testbench/transport/octets_to_samples_simp_tb.vhd -rw-r--r-- 6.6 KiB
6f22c7a4 — František Boháček feat: update transport layer to accept whole frame 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
library ieee;
use ieee.std_logic_1164.all;
use work.data_link_pkg.all;
use work.transport_pkg.all;
use work.testing_functions.all;

entity octets_to_samples_simp_tb is
end entity octets_to_samples_simp_tb;

architecture a1 of octets_to_samples_simp_tb is
  constant CONTROL_SIZE : integer := 1;  -- Size in bits of the control bits
  constant M            : integer := 4;  -- Count of converters
  constant S            : integer := 1;  -- Count of samples
  constant L            : integer := 1;  -- Count of lanes
  constant F            : integer := 4;  -- Count of octets in a frame per lane
  constant CF            : integer := 0;  -- Count of control word bits
  constant N : integer := 4;            -- Sample size
  constant Nn : integer := 8;
  constant CLK_PERIOD : time := 1 ns;

  constant DUMMY_FC : frame_character := ('1', '1', '1', "11111111", 0, 0, '1');
  constant DUMMY_S : sample := ("0000", "0");
  type test_vector is record
    di_lanes_data : frame_character_array (0 to L - 1);
    expected_result : integer;
  end record test_vector;

  type result_vector is record
    co_correct_data : std_logic;
    do_samples_data : samples_array (0 to M - 1, 0 to S - 1)(data(M - 1 downto 0), ctrl_bits(CONTROL_SIZE - 1 downto 0));
  end record result_vector;

  type test_vector_array is array (natural range<>) of test_vector;
  constant test_vectors : test_vector_array :=
  (
    ((('1', '0', '0', "00000000", 0, 0, '0'), others => DUMMY_FC), -1),
    ((('1', '0', '0', "00000000", 0, 0, '0'), others => DUMMY_FC), -1),
    ((('1', '0', '0', "00000000", 0, 0, '0'), others => DUMMY_FC), -1),
    ((('1', '0', '0', "00000000", 0, 0, '0'), others => DUMMY_FC), -1),
    ((('0', '0', '0', "10111000", 0, 0, '1'), others => DUMMY_FC), -1),
    ((('0', '0', '0', "11100000", 1, 0, '1'), others => DUMMY_FC), -1),
    ((('0', '0', '0', "00011000", 2, 0, '1'), others => DUMMY_FC), -1),
    ((('0', '0', '0', "01000000", 3, 0, '1'), others => DUMMY_FC), -1),
    ((('0', '0', '0', "00011000", 0, 1, '1'), others => DUMMY_FC), 0),
    ((('0', '0', '0', "00011000", 1, 1, '1'), others => DUMMY_FC), 0),
    ((('0', '0', '0', "00011000", 2, 1, '1'), others => DUMMY_FC), 0),
    ((('0', '0', '0', "00011000", 3, 1, '1'), others => DUMMY_FC), 0),
    ((('0', '0', '0', "11100000", 0, 2, '1'), others => DUMMY_FC), 1),
    ((('0', '0', '0', "11100000", 1, 2, '1'), others => DUMMY_FC), 1),
    ((('0', '0', '0', "11100000", 2, 2, '1'), others => DUMMY_FC), 1),
    ((('0', '0', '0', "11100000", 3, 2, '1'), others => DUMMY_FC), 1),
    ((('0', '0', '0', "11100000", 0, 3, '0'), others => DUMMY_FC), 2),
    ((('0', '0', '0', "11100000", 1, 3, '1'), others => DUMMY_FC), 2),
    ((('0', '0', '0', "11100000", 2, 3, '1'), others => DUMMY_FC), 2),
    ((('0', '0', '0', "11100000", 3, 3, '1'), others => DUMMY_FC), 2),
    ((('0', '0', '0', "11100000", 0, 3, '0'), others => DUMMY_FC), 3),
    ((('0', '0', '0', "11100000", 1, 3, '1'), others => DUMMY_FC), 3),
    ((('0', '0', '0', "11100000", 2, 3, '1'), others => DUMMY_FC), 3),
    ((('0', '0', '0', "11100000", 3, 3, '1'), others => DUMMY_FC), 3)
  );

  type result_vector_array is array (natural range<>) of result_vector;
  constant result_vectors : result_vector_array :=
  (
    (
      '1',
      (
        (("1011", "1"), others => DUMMY_S),
        (("1110", "0"), others => DUMMY_S),
        (("0001", "1"), others => DUMMY_S),
        (("0100", "0"), others => DUMMY_S)
      )
    ),
    (
      '1',
      (
        (("0001", "1"), others => DUMMY_S),
        (("0001", "1"), others => DUMMY_S),
        (("0001", "1"), others => DUMMY_S),
        (("0001", "1"), others => DUMMY_S)
        )
    ),
    (
      '1',
      (
        (("1110", "0"), others => DUMMY_S),
        (("1110", "0"), others => DUMMY_S),
        (("1110", "0"), others => DUMMY_S),
        (("1110", "0"), others => DUMMY_S)
      )
    ),
    (
      '0',
      (
        (("1110", "0"), others => DUMMY_S),
        (("1110", "0"), others => DUMMY_S),
        (("1110", "0"), others => DUMMY_S),
        (("1110", "0"), others => DUMMY_S)
        )
    )
  );

  signal ci_char_clk : std_logic := '0';
  signal ci_frame_clk : std_logic := '0';
  signal ci_reset : std_logic := '0';

  signal di_lanes_data : frame_character_array(0 to L - 1);

  signal do_samples_data : samples_array
    (0 to M - 1, 0 to S - 1)
    (data(N - 1 downto 0), ctrl_bits(CONTROL_SIZE - 1 downto 0));
  signal co_correct_data : std_logic;

  signal test_data_index : integer := 0;
begin  -- architecture a1
  uut : entity work.octets_to_samples
    generic map (
      CS => CONTROL_SIZE,
      M  => M,
      S  => S,
      L  => L,
      F  => F,
      CF => CF,
      N  => N,
      Nn => Nn)
    port map (
      ci_char_clk     => ci_char_clk,
      ci_reset        => ci_reset,
      ci_frame_clk    => ci_frame_clk,
      di_lanes_data   => di_lanes_data,
      co_correct_data => co_correct_data,
      do_samples_data => do_samples_data);

  ci_char_clk <= not ci_char_clk after CLK_PERIOD/2;
  ci_reset <= '1' after CLK_PERIOD*2;

  test: process is
    variable test_vec : test_vector;
    variable prev_test_vec : test_vector;
    variable dummy : std_logic_vector(M - 1 downto 0);
  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_lanes_data <= test_vec.di_lanes_data;

      if i > 0 then
        prev_test_vec := test_vectors(i - 1);

        if prev_test_vec.expected_result /= -1 then
          assert co_correct_data = result_vectors(prev_test_vec.expected_result).co_correct_data report "The correct data does not match, Index: " & integer'image(i-1) severity error;

          for ci in 0 to M - 1 loop
            for si in 0 to S - 1 loop
              assert do_samples_data(ci, si).data = result_vectors(prev_test_vec.expected_result).do_samples_data(ci, si).data report "The samples data do not match, expected: " & vec2str(result_vectors(prev_test_vec.expected_result).do_samples_data(ci, si).data) & ", got: " & vec2str(dummy) & ", index: " & integer'image(i-1) & ", ci: " & integer'image(ci) & ", si: " & integer'image(si) severity error;
              assert do_samples_data(ci, si).ctrl_bits = result_vectors(prev_test_vec.expected_result).do_samples_data(ci, si).ctrl_bits report "The samples control bits do not match, index: " & integer'image(prev_test_vec.expected_result) & ", ci: " & integer'image(ci) & ", si: " & integer'image(si) severity error;
            end loop;  -- s
          end loop;  -- c
        end if;
      end if;

      wait for clk_period;
    end loop;  -- i
    wait for 100 ms;
  end process test;

end architecture a1;
Do not follow this link