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

Subversion Repositories funbase_ip_library

[/] [funbase_ip_library/] [trunk/] [TUT/] [ip.hwp.communication/] [n2h2/] [1.0/] [tb/] [blocks/] [tb_n2h2_tx_fo.vhd] - Blame information for rev 145

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 145 lanttu
------------------------------------------------------------
2
-- Project     : Engine
3
-- Author      : Ari Kulmala
4
-- e-mail      : ari.kulmala@tut.fi
5
-- Date        : 7.7.2004
6
-- File        : tb_n2h_tx.vhdl
7
-- Design      : Syncronous testbench for Nios-to-Hibi v2 (N2H2 )transmitter
8
--               Unlike rx tb, this does not use config file, but
9
--               all the tests are hard-coded into this file.
10
------------------------------------------------------------
11
-- $Log$
12
-- Revision 1.1  2005/04/14 06:45:55  kulmala3
13
-- First version to CVS
14
--
15
-- 31.08.04 AK Streaming
16
-- 05.01.04 AK Interface signals naming changed.
17
------------------------------------------------------------
18
-------------------------------------------------------------------------------
19
-- Funbase IP library Copyright (C) 2011 TUT Department of Computer Systems
20
--
21
-- This file is part of HIBI
22
--
23
-- This source file may be used and distributed without
24
-- restriction provided that this copyright statement is not
25
-- removed from the file and that any derivative work contains
26
-- the original copyright notice and the associated disclaimer.
27
--
28
-- This source file is free software; you can redistribute it
29
-- and/or modify it under the terms of the GNU Lesser General
30
-- Public License as published by the Free Software Foundation;
31
-- either version 2.1 of the License, or (at your option) any
32
-- later version.
33
--
34
-- This source is distributed in the hope that it will be
35
-- useful, but WITHOUT ANY WARRANTY; without even the implied
36
-- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
37
-- PURPOSE.  See the GNU Lesser General Public License for more
38
-- details.
39
--
40
-- You should have received a copy of the GNU Lesser General
41
-- Public License along with this source; if not, download it
42
-- from http://www.opencores.org/lgpl.shtml
43
-------------------------------------------------------------------------------
44
 
45
library ieee;
46
use ieee.std_logic_1164.all;
47
--use ieee.std_logic_arith.all;
48
use ieee.std_logic_unsigned.all;
49
use ieee.numeric_std.all;
50
 
51
use work.txt_util.all;
52
 
53
 
54
entity tb_n2h2_tx is
55
 
56
end tb_n2h2_tx;
57
 
58
architecture rtl of tb_n2h2_tx is
59
  constant PERIOD : time := 50 ns;
60
 
61
  constant data_width_c   : integer := 32;  -- bits
62
  constant amount_width_c : integer := 9;   -- at max 2^amount words sent
63
  constant addr_width_c   : integer := 32;  -- bits
64
  constant addr_offset_c  : integer := (data_width_c)/8;
65
 
66
  constant comm_write_c     : std_logic_vector(4 downto 0) := "00010";
67
  constant comm_idle_c      : std_logic_vector(4 downto 0) := "00000";
68
  constant comm_write_msg_c : std_logic_vector(4 downto 0) := "00011";
69
 
70
  constant data_start_c    : integer := 0;
71
  constant wait_req_freq_c : integer := 10;
72
 
73
  -- Clk and reset
74
  signal clk   : std_logic;
75
  signal clk2  : std_logic;
76
  signal rst_n : std_logic;
77
 
78
 
79
  -- Two-level FSM in the testbench
80
  -- There are multiple test cases, and each has 4 phases
81
  type   test_states is (test1, test2, test3, stop_tests);
82
  type   test_case_states is (assign, trigger, monitor, finish);
83
  signal test_ctrl_r      : test_states      := test1;
84
  signal test_case_ctrl_r : test_case_states := trigger;
85
 
86
 
87
 
88
  -- signals from n2h_tx
89
  signal tx_status_duv_tb : std_logic := '0';
90
  signal tx_busy_duv_tb   : std_logic;
91
 
92
  -- signals from tb to n2h_tx
93
  signal internal_wait_tb_duv  : std_logic := '0';
94
  signal tx_irq_tb_duv         : std_logic;
95
  signal amount_tb_duv         : integer   := 0;
96
  signal amount_vec_tb_duv     : std_logic_vector(amount_width_c-1 downto 0);
97
  signal dpram_vec_addr_tb_duv : std_logic_vector(addr_width_c-1 downto 0);
98
  signal dpram_addr_tb_duv     : integer   := 0;
99
  signal hibi_addr_tb_duv      : std_logic_vector (data_width_c-1 downto 0);  -- 2011-11-11
100
  signal comm_tb_duv           : std_logic_vector(4 downto 0);
101
 
102
 
103
 
104
  --Duv=tx writes to hibi with these
105
  signal hibi_av_duv_tb       : std_logic := '0';
106
  signal hibi_data_duv_tb     : integer   := 0;
107
  signal hibi_data_vec_duv_tb : std_logic_vector(data_width_c-1 downto 0);
108
  signal hibi_comm_duv_tb     : std_logic_vector(4 downto 0);
109
  signal hibi_we_duv_tb       : std_logic;
110
  signal hibi_full_tb_duv     : std_logic := '1';
111
 
112
  -- Duv=tx reads meemory via these avalon signals
113
  signal avalon_addr_duv_tb          : std_logic_vector(addr_width_c-1 downto 0);
114
  signal avalon_read_duv_tb          : std_logic;
115
  signal avalon_vec_readdata_tb_duv  : std_logic_vector(data_width_c-1 downto 0);
116
  signal avalon_readdata_tb_duv      : integer := 0;
117
  signal avalon_waitrequest_tb_duv   : std_logic;
118
  signal avalon_readdatavalid_tb_duv : std_logic;
119
 
120
 
121
 
122
  -- others
123
  signal counter_r        : integer := 0;  -- temp counter_r, no special func
124
  signal new_hibi_addr_r  : integer := 0;
125
  signal new_amount_r     : integer := 0;
126
  signal new_dpram_addr_r : integer := 0;
127
 
128
 
129
 
130
 
131
  -- which address hibi should get next
132
  signal global_hibi_addr_r : integer := 0;
133
  -- global number of data in next packet
134
  signal global_amount_r    : integer := 0;
135
  signal global_comm_r      : std_logic_vector(4 downto 0);
136
  signal global_dpram_addr  : integer := 0;  -- given dpram addr
137
 
138
  -- check avalon signals
139
  signal avalon_data_counter_r : integer   := data_start_c;  -- data sent
140
  signal avalon_addr_counter_r : integer   := 0;    -- avalon addr right?
141
  signal avalon_amount         : integer   := 0;    -- how many data
142
  signal avalon_addr_sent      : std_logic := '0';  -- if already gave address
143
  signal avalon_last_addr      : integer   := 0;    -- store the old addr
144
  --  signal avalon_gave_data    : std_logic := 0;  -- avalon timing
145
  --  signal avalon_ok           : std_logic := '0';  -- all the avalon data ok
146
 
147
  -- check hibi signals
148
  signal hibi_addr_came      : std_logic; --:= '0';
149
  signal hibi_data_counter_r : integer   := data_start_c;  -- data received
150
  signal hibi_addr           : integer   := 0;  -- right hibi addr
151
  signal hibi_amount         : integer   := 0;  -- how many datas hibi has received
152
  --  signal hibi_ok           : std_logic := '0';  --hibi received all ok.
153
 
154
 
155
begin  -- rtl
156
 
157
  --
158
  -- Instantiate DUV. Note that this is just one sbu-block
159
  -- from N2H.
160
  -- 
161
  -- 
162
  n2h2_tx_1 : entity work.n2h2_tx
163
    generic map (
164
      data_width_g   => data_width_c,
165
      amount_width_g => amount_width_c
166
      )
167
    port map (
168
      clk   => clk,
169
      rst_n => rst_n,
170
 
171
      -- Avalon master read interface to access the memory
172
      avalon_addr_out         => avalon_addr_duv_tb,
173
      avalon_readdata_in      => avalon_vec_readdata_tb_duv,
174
      avalon_re_out           => avalon_read_duv_tb,
175
      avalon_waitrequest_in   => avalon_waitrequest_tb_duv,
176
      avalon_readdatavalid_in => avalon_readdatavalid_tb_duv,  -- ES 2010/05/07
177
 
178
      -- Hibi interface for sending data
179
      hibi_data_out => hibi_data_vec_duv_tb,
180
      hibi_av_out   => hibi_av_duv_tb,
181
      hibi_full_in  => hibi_full_tb_duv,
182
      hibi_comm_out => hibi_comm_duv_tb,
183
      hibi_we_out   => hibi_we_duv_tb,
184
 
185
      -- DMA configuration interface, driven by "N2H ctrl logic" (=tb here)
186
      tx_start_in        => tx_irq_tb_duv,
187
      tx_status_done_out => tx_status_duv_tb,
188
      tx_comm_in         => comm_tb_duv,
189
      tx_hibi_addr_in    => hibi_addr_tb_duv,  --(others => '0'),
190
      tx_ram_addr_in     => dpram_vec_addr_tb_duv,
191
      tx_amount_in       => amount_vec_tb_duv
192
      );
193
 
194
 
195
 
196
  -- Processes check_avalon and check_hibi continuously monitor avalon and hibi
197
  -- buses and automatically check whether the data came right.
198
  -- It's simple because the sent data is implemented
199
  -- as a counter and hence the incoming data should be in order.
200
  -- If theres too much data read from avalon, hibi gets wrong packets
201
  -- and informs.
202
  -- If theres too much/few data sent to hibi, hibi informs also.
203
 
204
 
205
  -- TB uses integers. Convert them to/from bit vectors for port mapping
206
  hibi_data_duv_tb      <= to_integer(unsigned(hibi_data_vec_duv_tb));
207
  amount_vec_tb_duv     <= std_logic_vector(to_unsigned(amount_tb_duv, amount_width_c));
208
  dpram_vec_addr_tb_duv <=
209
    std_logic_vector(to_unsigned(dpram_addr_tb_duv, addr_width_c));
210
  avalon_vec_readdata_tb_duv <=
211
    std_logic_vector(to_unsigned(avalon_readdata_tb_duv, data_width_c))
212
    when avalon_readdatavalid_tb_duv = '1' else (others => 'Z');
213
  hibi_addr_tb_duv <= std_logic_vector (to_unsigned(global_hibi_addr_r, data_width_c));
214
 
215
 
216
  --
217
  -- "Test" is the main process that is implented as a state machine
218
  -- (test1, test2 ... etc) so that new tests can be easily implemented
219
  -- 
220
  test : process (clk, rst_n)
221
  begin  -- process test
222
    if rst_n = '0' then                 -- asynchronous reset (active low)
223
      test_ctrl_r      <= test1;        -- test2;
224
      test_case_ctrl_r <= trigger;      --assign;
225
 
226
      -- Initializations added 2011-11-11, ES
227
      comm_tb_duv   <= comm_idle_c;
228
      global_comm_r <= comm_idle_c;
229
      tx_irq_tb_duv <= '0';
230
 
231
    elsif clk'event and clk = '1' then  -- rising clock edge
232
      case test_ctrl_r is
233
 
234
        -----------------------------------------------------------------------
235
        -- tests are controlled by following signals, which must be set
236
        --       global_hibi_addr_r = where to send
237
        --       global_amount_r    = how much to send
238
        --       global_comm_r      = which command to use
239
        -----------------------------------------------------------------------
240
        when test1 =>
241
          -- Basic test: tests action under hibi_full signal
242
          -- and how one packet is transferred.
243
          case test_case_ctrl_r is
244
            when trigger =>
245
              -- assign and trigger irq.
246
 
247
 
248
              if tx_status_duv_tb = '1' then
249
                global_amount_r    <= 1; --4;
250
                amount_tb_duv      <= 1; --4;
251
                global_hibi_addr_r <= 230;
252
                global_comm_r      <= comm_write_c;
253
                comm_tb_duv        <= comm_write_c;
254
                tx_irq_tb_duv      <= '1';
255
                dpram_addr_tb_duv  <= 8;
256
                global_dpram_addr  <= 8;
257
                test_case_ctrl_r   <= monitor;
258
 
259
                -- Assert hibi full signal
260
                hibi_full_tb_duv <= '1';
261
 
262
              else
263
                assert false report "Cannot start test1, tx_status low" severity note;
264
              end if;
265
 
266
 
267
            when monitor =>
268
              tx_irq_tb_duv <= '0';
269
 
270
              counter_r <= counter_r+1;
271
              if counter_r < 10 then
272
                test_case_ctrl_r <= monitor;
273
              else
274
                hibi_full_tb_duv <= '0';
275
                test_case_ctrl_r <= finish;
276
              end if;
277
 
278
              -- if tx_status_duv_tb = '1' then
279
              --  -- values read.
280
              --                amount_tb_duv     <= 0;
281
              --                dpram_addr_tb_duv <= 0;
282
              --                comm_tb_duv       <= comm_idle_c;
283
              --                -- lets test the full signal
284
              --              end if;
285
 
286
            when finish =>
287
              if tx_status_duv_tb = '1' then
288
                assert false report "test1 finished." severity note;
289
                test_ctrl_r      <= test2;
290
                test_case_ctrl_r <= assign;
291
                counter_r        <= 0;
292
              else
293
                test_case_ctrl_r <= finish;
294
              end if;
295
 
296
 
297
            when others => null;
298
          end case;
299
        when test2 =>
300
          -- Tests how multiple packets are transferred and
301
          -- how max values are treated.
302
 
303
          case test_case_ctrl_r is
304
            when assign =>
305
              -- we always go to trigger next, unless otherwise noted.
306
              test_case_ctrl_r <= trigger;
307
              -- assign new values
308
              if counter_r = 0 then
309
                new_amount_r     <= 6;
310
                new_hibi_addr_r  <= 6302;
311
                new_dpram_addr_r <= 400;
312
              elsif counter_r = 1 then
313
                new_amount_r     <= 172;
314
                new_hibi_addr_r  <= 30;
315
                new_dpram_addr_r <= 300;
316
              elsif counter_r = 2 then
317
                new_amount_r     <= 1;
318
                new_hibi_addr_r  <= 21;
319
                new_dpram_addr_r <= 323;
320
              elsif counter_r = 3 then
321
                new_amount_r     <= 14;
322
                new_hibi_addr_r  <= 54;
323
                new_dpram_addr_r <= 12;
324
              elsif counter_r = 4 then
325
                new_amount_r     <= 6;
326
                new_hibi_addr_r  <= 602;
327
                new_dpram_addr_r <= 40;
328
              elsif counter_r = 5 then
329
                new_amount_r     <= 9;
330
                new_hibi_addr_r  <= 64510;
331
                new_dpram_addr_r <= 511;
332
              else
333
                --stop the tests
334
                test_ctrl_r      <= stop_tests;
335
                test_case_ctrl_r <= assign;
336
              end if;
337
 
338
              counter_r <= counter_r+1;
339
 
340
            when trigger =>
341
              -- assign and trigger irq.
342
 
343
              if tx_status_duv_tb = '1' then
344
                global_amount_r    <= new_amount_r;
345
                amount_tb_duv      <= new_amount_r;
346
                global_hibi_addr_r <= new_hibi_addr_r;
347
                global_comm_r      <= comm_write_c;
348
                comm_tb_duv        <= comm_write_c;
349
                tx_irq_tb_duv      <= '1';
350
                dpram_addr_tb_duv  <= new_dpram_addr_r;
351
                global_dpram_addr  <= new_dpram_addr_r;
352
                test_case_ctrl_r   <= monitor;
353
                -- deassert hibi full signal, just in case
354
                hibi_full_tb_duv   <= '0';
355
 
356
              else
357
                assert false report "Cannot start test, tx_status low" severity note;
358
              end if;
359
 
360
            when monitor =>
361
              tx_irq_tb_duv    <= '0';
362
              -- if tx_status_duv_tb = '1' then
363
              --  -- values read.
364
              --                amount_tb_duv     <= 0;
365
              --                dpram_addr_tb_duv <= 0;
366
              --                comm_tb_duv       <= comm_idle_c;
367
              -- lets test the full signal
368
              test_case_ctrl_r <= finish;
369
              -- end if;
370
 
371
            when finish =>
372
              if tx_status_duv_tb = '1' then
373
                assert false report "test2 finished." severity note;
374
                test_case_ctrl_r <= assign;
375
              else
376
                test_case_ctrl_r <= finish;
377
              end if;
378
 
379
 
380
            when others => null;
381
          end case;
382
        when test3      =>
383
        when stop_tests =>
384
          assert false report "All tests finished." severity failure;
385
        when others => null;
386
      end case;
387
    end if;
388
  end process test;
389
 
390
 
391
 
392
  --
393
  -- Checks whether data going to hibi is right
394
  --
395
  check_hibi : process (clk)            -- (clk)
396
  begin  -- process check_hibi
397
    if rst_n = '0' then
398
      hibi_addr_came <=  '0';
399
 
400
    elsif clk = '1' and clk'event then
401
 
402
      assert hibi_amount >= 0 report "Hibi amount negative - too much data" severity warning;
403
 
404
 
405
      -- Not expecting more data
406
      if hibi_amount = 0 then
407
        hibi_addr_came <= '0';
408
      end if;
409
 
410
 
411
      -- DMA writes. Check the addr and data
412
      if hibi_we_duv_tb = '1' then
413
 
414
        if hibi_comm_duv_tb /= global_comm_r then
415
          assert false report "Hibi command failure - expected" & str(global_comm_r) severity warning;
416
        end if;
417
 
418
 
419
        if hibi_av_duv_tb = '1' then
420
          -- DMA writes addr
421
 
422
          -- Address valid should not come before we have received all the data
423
          if hibi_amount = 0 then
424
            if hibi_data_duv_tb = global_hibi_addr_r then
425
              hibi_addr_came <= '1';
426
              hibi_amount    <= global_amount_r;
427
              assert false report "Hibi addr OK " & str(hibi_data_duv_tb) severity note;
428
 
429
            else
430
              assert false report "Hibi address error, expected " & str(global_hibi_addr_r)
431
                & ", but got " & str(hibi_data_duv_tb)
432
                severity warning;
433
            end if;
434
 
435
          else
436
            assert false report "Hibi data failure, address came before prev transfer is completed" severity warning;
437
          end if;
438
 
439
        else
440
          -- DMA writes data
441
          -- Data must be correct and come after addr
442
 
443
          if hibi_addr_came = '1' then
444
            if hibi_data_duv_tb = hibi_data_counter_r then
445
              assert false report "Hibi data OK " & str(hibi_data_duv_tb) severity note;
446
 
447
              hibi_data_counter_r <= hibi_data_counter_r+1;
448
              hibi_amount         <= hibi_amount-1;
449
              if hibi_amount = 1 then
450
                hibi_addr_came <= '0';
451
              end if;
452
            else
453
              assert false report "Hibi data error, expexted " & str(hibi_data_counter_r)
454
                & ", but got " & str(hibi_data_duv_tb)
455
                severity warning;
456
            end if;
457
 
458
          else
459
            assert false report "Data " & str(hibi_data_duv_tb) & " came before an address" severity warning;
460
          end if;
461
        end if;
462
 
463
      end if;
464
    end if;
465
 
466
  end process check_hibi;
467
 
468
 
469
  --
470
  --
471
  --  
472
  check_avalon : process (clk2, rst_n)
473
    variable waitreq_cnt_r       : integer := 0;
474
    variable expected_ava_addr_v : integer := -1;
475
 
476
  begin  -- process check_avalon
477
    if rst_n = '0' then
478
      -- reset added 2011-11-11, ES
479
      avalon_readdatavalid_tb_duv <= '0';
480
      avalon_waitrequest_tb_duv   <= '0';
481
 
482
    --elsif clk2'event and clk2 = '1' then  -- rising clock edge
483
    elsif clk'event and clk = '1' then  -- rising clock edge
484
 
485
      --assert avalon_amount >= 0 report "avalon amount negative - tried to read too much data" severity warning;
486
 
487
      avalon_last_addr <= to_integer(unsigned(avalon_addr_duv_tb));
488
 
489
 
490
      -- DMA reads memory
491
      if avalon_read_duv_tb = '1' then
492
        if avalon_waitrequest_tb_duv = '0' then
493
 
494
          avalon_readdatavalid_tb_duv <= '1';
495
 
496
 
497
          -- Calculate the expected address
498
          expected_ava_addr_v := global_dpram_addr + avalon_addr_counter_r;  --es
499
 
500
          if (expected_ava_addr_v) = (2**addr_width_c-2) then
501
            avalon_addr_counter_r <= 0 - global_dpram_addr;
502
          elsif (expected_ava_addr_v) = (2**addr_width_c-1) then
503
            -- odd number (eg. 511) overflow, add one.
504
            avalon_addr_counter_r <= 1 - global_dpram_addr;
505
          else
506
            avalon_addr_counter_r <= avalon_addr_counter_r + addr_offset_c;
507
          end if;
508
 
509
          -- Check addr
510
          assert expected_ava_addr_v = avalon_addr_duv_tb report "Avalon address error, expected "
511
            & str(expected_ava_addr_v)
512
            & ", but got " & str(to_integer(unsigned(avalon_addr_duv_tb)))
513
            severity warning;
514
 
515
 
516
 
517
          -- Generate the data that comes from the "memory"
518
          if avalon_addr_sent = '0' then
519
            -- 2011-11-11 not sending addr anymore in the beginning
520
            -- modifcation is prograa, not yet complete....
521
            avalon_readdata_tb_duv <= avalon_data_counter_r;
522
            avalon_data_counter_r  <= avalon_data_counter_r+1;
523
            avalon_addr_sent       <= '1';
524
            avalon_amount          <= global_amount_r;
525
--            -- first slot contains address
526
--            avalon_readdata_tb_duv <= global_hibi_addr_r;
527
--            avalon_addr_sent       <= '1';
528
--            avalon_amount          <= global_amount_r;            
529
 
530
          else
531
            -- now the data
532
            if avalon_last_addr = avalon_addr_duv_tb then
533
              avalon_readdata_tb_duv <= avalon_data_counter_r;
534
              avalon_data_counter_r  <= avalon_data_counter_r;
535
              avalon_amount          <= avalon_amount;
536
            else
537
              avalon_readdata_tb_duv <= avalon_data_counter_r;
538
              avalon_data_counter_r  <= avalon_data_counter_r+1;
539
              avalon_amount          <= avalon_amount-1;
540
 
541
            end if;
542
 
543
            if avalon_amount = 1 then
544
              -- next we expect that a new packet should be sent.
545
              avalon_addr_sent      <= '0';
546
              avalon_addr_counter_r <= 0;
547
            end if;
548
 
549
          end if;
550
 
551
        end if;
552
      else
553
        -- Not reading
554
        avalon_readdatavalid_tb_duv <= '0';
555
      end if;
556
 
557
 
558
 
559
      -- Generate occasional wait requests to DMA
560
      avalon_waitrequest_tb_duv <= '0';  -- was always
561
      waitreq_cnt_r             := waitreq_cnt_r +1;
562
      -- generate waitreq
563
      if waitreq_cnt_r = wait_req_freq_c then
564
        avalon_waitrequest_tb_duv <= '1' and avalon_read_duv_tb;
565
        waitreq_cnt_r             := 0;
566
      end if;
567
 
568
 
569
    end if;                             -- rst/clk
570
  end process check_avalon;
571
 
572
 
573
  --
574
  -- Generate clocks and reset
575
  --  
576
  CLOCK1 : process                      -- generate clock signal for design
577
    variable clktmp : std_logic := '0';
578
  begin
579
    wait for PERIOD/2;
580
    clktmp := not clktmp;
581
    clk    <= clktmp;
582
  end process CLOCK1;
583
 
584
--  clk2 <= clk after PERIOD/4;           -- 2011-11-15 ES
585
 
586
  -- different phase for the avalon bus
587
  CLOCK2 : process                      -- generate clock signal for design
588
    variable clk2tmp : std_logic := '0';
589
  begin
590
    clk2tmp := not clk2tmp;
591
    clk2    <= clk2tmp;
592
    wait for PERIOD/2;
593
  end process CLOCK2;
594
 
595
  RESET : process
596
  begin
597
    rst_n <= '0';                       -- Reset the testsystem
598
    wait for 6*PERIOD;                  -- Wait 
599
    rst_n <= '1';                       -- de-assert reset
600
    wait;
601
  end process RESET;
602
 
603
 
604
end rtl;

powered by: WebSVN 2.1.0

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