OpenCores
URL https://opencores.org/ocsvn/dp_repack_data/dp_repack_data/trunk

Subversion Repositories dp_repack_data

[/] [dp_repack_data/] [trunk/] [tb_dp_repack_data.vhd] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 danv
-------------------------------------------------------------------------------
2
--
3 5 danv
-- Copyright 2020
4 2 danv
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
5
-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
6 5 danv
-- 
7
-- Licensed under the Apache License, Version 2.0 (the "License");
8
-- you may not use this file except in compliance with the License.
9
-- You may obtain a copy of the License at
10
-- 
11
--     http://www.apache.org/licenses/LICENSE-2.0
12
-- 
13
-- Unless required by applicable law or agreed to in writing, software
14
-- distributed under the License is distributed on an "AS IS" BASIS,
15
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
-- See the License for the specific language governing permissions and
17
-- limitations under the License.
18 2 danv
--
19
-------------------------------------------------------------------------------
20
 
21
-- Purpose:
22
-- . Test bench for dp_repack_data
23
-- Description:
24
--                                                       c_no_unpack
25
--                                                          .
26
--             g_in_dat_w             g_pack_dat_w          .   g_in_dat_w
27
--             g_in_nof_words         g_pack_nof_words      .   g_in_nof_words
28
--                 .                       .                .       .
29
--                 .   u_pack              .       u_unpack .       .
30
--                 .   ______________      .       ______________   .
31
--                 .  |dp_repack_data|     .      |dp_repack_data|  .
32
--   stimuli_src ---->|              |----------->|              |----> verify_snk
33
--                    | in       out |  pack_src  | in       out |
34
--                    |______________|            |______________|
35
--
36
-- Usage:                                  
37
-- > as 10
38
-- > run -all
39
--
40
 
41
LIBRARY IEEE, common_pkg_lib, dp_pkg_lib;
42
USE IEEE.std_logic_1164.ALL;
43
USE IEEE.numeric_std.ALL;
44
USE common_pkg_lib.common_pkg.ALL;
45
USE common_pkg_lib.common_lfsr_sequences_pkg.ALL;
46
USE common_pkg_lib.tb_common_pkg.ALL;
47
USE dp_pkg_lib.dp_stream_pkg.ALL;
48
USE dp_pkg_lib.tb_dp_pkg.ALL;
49
 
50
 
51
ENTITY tb_dp_repack_data IS
52
  GENERIC (
53
    -- general
54
    g_flow_control_stimuli   : t_dp_flow_control_enum := e_active;  -- always e_active, e_random or e_pulse flow control
55
    g_flow_control_verify    : t_dp_flow_control_enum := e_active;  -- always e_active, e_random or e_pulse flow control
56
    -- specific
57
    g_in_dat_w               : NATURAL := 8 * 42;
58
    g_in_nof_words           : NATURAL := 1;
59
    g_pack_dat_w             : NATURAL := 32;
60
    g_pack_nof_words         : NATURAL := 11;
61
    g_in_bypass              : BOOLEAN := TRUE;   -- can use TRUE when g_in_nof_words=1  or g_in_nof_words=g_out_nof_words
62
    g_pack_bypass            : BOOLEAN := FALSE;  -- can use TRUE when g_out_nof_words=1 or g_in_nof_words=g_out_nof_words
63
    g_in_symbol_w            : NATURAL := 8;      -- default 1 for snk_in.empty  in nof bits, else use power of 2
64
    g_pack_symbol_w          : NATURAL := 8;      -- default 1 for src_out.empty in nof bits, else use power of 2
65
    g_nof_repeat             : NATURAL := 10;
66
    g_pkt_len                : NATURAL := 1;     -- if not a multiple of g_in_nof_words then the input stage flush creates gap between blocks
67
    g_pkt_gap                : NATURAL := 0
68
  );
69
END tb_dp_repack_data;
70
 
71
 
72
ARCHITECTURE tb OF tb_dp_repack_data IS
73
 
74
  CONSTANT c_no_unpack                : BOOLEAN := FALSE;
75
  CONSTANT c_enable_repack_in         : BOOLEAN := TRUE;
76
  CONSTANT c_enable_repack_out        : BOOLEAN := TRUE;
77
 
78
  -- dp_stream_stimuli
79
  CONSTANT c_stimuli_pulse_active     : NATURAL := 3;  --g_in_nof_words;
80
  CONSTANT c_stimuli_pulse_period     : NATURAL := 7;
81
 
82
  CONSTANT c_data_init                : NATURAL := 0;
83
  CONSTANT c_bsn_init                 : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0) := X"0000000000000000";  -- X"0877665544332211"
84
  CONSTANT c_err_init                 : NATURAL := 247;
85
  CONSTANT c_channel_init             : NATURAL := 5;  -- fixed
86
 
87
  -- dp_stream_verify
88
  CONSTANT c_verify_pulse_active      : NATURAL := 1;
89
  CONSTANT c_verify_pulse_period      : NATURAL := 5;
90
 
91
  CONSTANT c_data_max                 : UNSIGNED(g_in_dat_w-1 DOWNTO 0) := (OTHERS=>'1');
92
  CONSTANT c_dsp_max                  : UNSIGNED(g_in_dat_w-1 DOWNTO 0) := (OTHERS=>'1');
93
 
94
  --CONSTANT c_verify_snk_in_cnt_max    : t_dp_sosi_unsigned := c_dp_sosi_unsigned_rst;  -- default 0 is no wrap
95
  CONSTANT c_verify_snk_in_cnt_max    : t_dp_sosi_unsigned := TO_DP_SOSI_UNSIGNED('0', '0', '0', '0', c_data_max, c_dsp_max, c_dsp_max, c_unsigned_0, c_unsigned_0, c_unsigned_0, c_unsigned_0);
96
  CONSTANT c_verify_snk_in_cnt_gap    : t_dp_sosi_unsigned := c_dp_sosi_unsigned_ones; -- default only accept increment +1
97
 
98
  CONSTANT c_expected_pkt_len         : NATURAL := sel_a_b(c_no_unpack, g_pkt_len * g_pack_nof_words / g_in_nof_words, g_pkt_len);
99
  -- both
100
  CONSTANT c_sync_period              : NATURAL := 10;
101
  CONSTANT c_sync_offset              : NATURAL := 7;
102
 
103
  SIGNAL clk                        : STD_LOGIC := '1';
104
  SIGNAL rst                        : STD_LOGIC := '1';
105
  SIGNAL tb_end                     : STD_LOGIC := '0';
106
 
107
  SIGNAL stimuli_src_in             : t_dp_siso := c_dp_siso_rdy;
108
  SIGNAL stimuli_src_out            : t_dp_sosi;
109
  SIGNAL stimuli_src_out_data       : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
110
 
111
  SIGNAL verify_snk_in_enable       : t_dp_sosi_sl := c_dp_sosi_sl_rst;
112
  SIGNAL last_snk_in                : t_dp_sosi;
113
  SIGNAL last_snk_in_evt            : STD_LOGIC;
114
  SIGNAL verify_last_snk_in_evt     : t_dp_sosi_sl := c_dp_sosi_sl_rst;
115
 
116
  SIGNAL verify_snk_out             : t_dp_siso := c_dp_siso_rdy;
117
  SIGNAL verify_snk_in              : t_dp_sosi;
118
  SIGNAL verify_snk_in_data         : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
119
 
120
  -- specific
121
  SIGNAL pack_src_in                : t_dp_siso;
122
  SIGNAL pack_src_out               : t_dp_sosi;
123
  SIGNAL pack_src_out_data          : STD_LOGIC_VECTOR(g_pack_dat_w-1 DOWNTO 0);
124
 
125
  SIGNAL unpack_src_in              : t_dp_siso;
126
  SIGNAL unpack_src_out             : t_dp_sosi;
127
  SIGNAL unpack_src_out_data        : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
128
 
129
BEGIN
130
 
131
  clk <= (NOT clk) OR tb_end AFTER clk_period/2;
132
  rst <= '1', '0' AFTER clk_period*7;
133
 
134
  ------------------------------------------------------------------------------
135
  -- DATA GENERATION
136
  ------------------------------------------------------------------------------
137
 
138
  u_dp_stream_stimuli : ENTITY dp_pkg_lib.dp_stream_stimuli
139
  GENERIC MAP (
140
    g_instance_nr    => 0,                        -- only one stream so choose index 0
141
    -- flow control
142
    g_random_w       => 15,                       -- use different random width for stimuli and for verify to have different random sequences
143
    g_pulse_active   => c_stimuli_pulse_active,
144
    g_pulse_period   => c_stimuli_pulse_period,
145
    g_flow_control   => g_flow_control_stimuli,   -- always active, random or pulse flow control
146
    -- initializations
147
    g_sync_period    => c_sync_period,
148
    g_sync_offset    => c_sync_offset,
149
    g_data_init      => c_data_init,
150
    g_bsn_init       => c_bsn_init,
151
    g_err_init       => c_err_init,
152
    g_channel_init   => c_channel_init,
153
    -- specific
154
    g_in_dat_w       => g_in_dat_w,
155
    g_nof_repeat     => g_nof_repeat,
156
    g_pkt_len        => g_pkt_len,
157
    g_pkt_gap        => g_pkt_gap
158
  )
159
  PORT MAP (
160
    rst                 => rst,
161
    clk                 => clk,
162
 
163
    -- Generate stimuli
164
    src_in              => stimuli_src_in,
165
    src_out             => stimuli_src_out,
166
 
167
    -- End of stimuli
168
    last_snk_in         => last_snk_in,      -- expected verify_snk_in after end of stimuli
169
    last_snk_in_evt     => last_snk_in_evt,  -- trigger verify to verify the last_snk_in
170
    tb_end              => tb_end            -- signal end of tb as far as this dp_stream_stimuli is concerned
171
  );
172
 
173
 
174
  ------------------------------------------------------------------------------
175
  -- DATA VERIFICATION
176
  ------------------------------------------------------------------------------
177
 
178
  -- Select fields that need to be verified
179
  -- . during the test
180
  verify_snk_in_enable.sync    <= '1';
181
  verify_snk_in_enable.bsn     <= '1';
182
  verify_snk_in_enable.data    <= '1' WHEN c_no_unpack=FALSE ELSE '0';
183
  verify_snk_in_enable.re      <= '0';
184
  verify_snk_in_enable.im      <= '0';
185
  verify_snk_in_enable.valid   <= '1';
186
  verify_snk_in_enable.sop     <= '1';
187
  verify_snk_in_enable.eop     <= '1';
188
  verify_snk_in_enable.empty   <= '0';
189
  verify_snk_in_enable.channel <= '1';
190
  verify_snk_in_enable.err     <= '1';
191
 
192
  -- . after the test
193
  verify_last_snk_in_evt.sync    <= last_snk_in_evt;
194
  verify_last_snk_in_evt.bsn     <= last_snk_in_evt;
195
  verify_last_snk_in_evt.data    <= last_snk_in_evt WHEN c_no_unpack=FALSE ELSE '0';
196
  verify_last_snk_in_evt.re      <= '0';
197
  verify_last_snk_in_evt.im      <= '0';
198
  verify_last_snk_in_evt.valid   <= last_snk_in_evt;
199
  verify_last_snk_in_evt.sop     <= last_snk_in_evt;
200
  verify_last_snk_in_evt.eop     <= last_snk_in_evt;
201
  verify_last_snk_in_evt.empty   <= '0';
202
  verify_last_snk_in_evt.channel <= last_snk_in_evt;
203
  verify_last_snk_in_evt.err     <= last_snk_in_evt;
204
 
205
  u_dp_stream_verify : ENTITY dp_pkg_lib.dp_stream_verify
206
  GENERIC MAP (
207
    g_instance_nr    => 0,                        -- only one stream so choose index 0
208
    -- flow control
209
    g_random_w       => 14,                       -- use different random width for stimuli and for verify to have different random sequences
210
    g_pulse_active   => c_verify_pulse_active,
211
    g_pulse_period   => c_verify_pulse_period,
212
    g_flow_control   => g_flow_control_verify,    -- always active, random or pulse flow control
213
    -- initializations
214
    g_sync_period    => c_sync_period,
215
    g_sync_offset    => c_sync_offset,
216
    g_snk_in_cnt_max => c_verify_snk_in_cnt_max,
217
    g_snk_in_cnt_gap => c_verify_snk_in_cnt_gap,
218
    -- specific
219
    g_in_dat_w       => g_in_dat_w,
220
    g_pkt_len        => c_expected_pkt_len
221
  )
222
  PORT MAP (
223
    rst                        => rst,
224
    clk                        => clk,
225
 
226
    -- Verify data
227
    snk_out                    => verify_snk_out,
228
    snk_in                     => verify_snk_in,
229
 
230
    -- During stimuli
231
    verify_snk_in_enable       => verify_snk_in_enable,  -- enable verify to verify that the verify_snk_in fields are incrementing
232
 
233
    -- End of stimuli
234
    expected_snk_in            => last_snk_in,            -- expected verify_snk_in after end of stimuli
235
    verify_expected_snk_in_evt => verify_last_snk_in_evt  -- trigger verify to verify the last_snk_in
236
  );
237
 
238
  ------------------------------------------------------------------------------
239
  -- DUT Pack
240
  ------------------------------------------------------------------------------
241
 
242
  u_pack : ENTITY work.dp_repack_data
243
  GENERIC MAP (
244
    g_enable_repack_in  => c_enable_repack_in,
245
    g_enable_repack_out => c_enable_repack_out,
246
    g_in_bypass         => g_in_bypass,
247
    g_in_dat_w          => g_in_dat_w,
248
    g_in_nof_words      => g_in_nof_words,
249
    g_in_symbol_w       => g_in_symbol_w,
250
    g_out_bypass        => g_pack_bypass,
251
    g_out_dat_w         => g_pack_dat_w,
252
    g_out_nof_words     => g_pack_nof_words,
253
    g_out_symbol_w      => g_pack_symbol_w
254
  )
255
  PORT MAP (
256
    rst              => rst,
257
    clk              => clk,
258
 
259
    snk_out          => stimuli_src_in,
260
    snk_in           => stimuli_src_out,
261
 
262
    src_in           => pack_src_in,
263
    src_out          => pack_src_out
264
  );
265
 
266
  pack_src_out_data <= pack_src_out.data(g_pack_dat_w-1 DOWNTO 0);
267
 
268
  ------------------------------------------------------------------------------
269
  -- DUT Unpack
270
  ------------------------------------------------------------------------------
271
 
272
  no_unpack : IF c_no_unpack=TRUE GENERATE
273
    pack_src_in    <= unpack_src_in;
274
    unpack_src_out <= pack_src_out;
275
  END GENERATE;
276
 
277
  gen_unpack : IF c_no_unpack=FALSE GENERATE
278
    u_unpack : ENTITY work.dp_repack_data
279
    GENERIC MAP (
280
      g_enable_repack_in  => c_enable_repack_out,
281
      g_enable_repack_out => c_enable_repack_in,
282
      g_in_bypass         => g_pack_bypass,
283
      g_in_dat_w          => g_pack_dat_w,
284
      g_in_nof_words      => g_pack_nof_words,
285
      g_in_symbol_w       => g_pack_symbol_w,
286
      g_out_bypass        => g_in_bypass,
287
      g_out_dat_w         => g_in_dat_w,
288
      g_out_nof_words     => g_in_nof_words,
289
      g_out_symbol_w      => g_in_symbol_w
290
    )
291
    PORT MAP (
292
      rst              => rst,
293
      clk              => clk,
294
 
295
      snk_out          => pack_src_in,
296
      snk_in           => pack_src_out,
297
 
298
      src_in           => unpack_src_in,
299
      src_out          => unpack_src_out
300
    );
301
  END GENERATE;
302
 
303
  unpack_src_out_data <= unpack_src_out.data(g_in_dat_w-1 DOWNTO 0);
304
 
305
  unpack_src_in <= verify_snk_out;
306
  verify_snk_in <= unpack_src_out;
307
 
308
  ------------------------------------------------------------------------------
309
  -- Auxiliary
310
  ------------------------------------------------------------------------------
311
 
312
  -- Map to slv to ease monitoring in wave window
313
  stimuli_src_out_data <= stimuli_src_out.data(g_in_dat_w-1 DOWNTO 0);
314
  verify_snk_in_data   <= verify_snk_in.data(g_in_dat_w-1 DOWNTO 0);
315
 
316
END tb;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.