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

Subversion Repositories qfp32

[/] [qfp32/] [trunk/] [Test/] [qfp_unit_tb.vhd] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 mgraep
-- Copyright (c) 2013 Malte Graeper (mgraep@t-online.de) All rights reserved.
2
 
3 2 mgraep
-------------------------------------------------------------------------------
4 3 mgraep
-- Testbench for design "qfp_unit"
5 2 mgraep
-------------------------------------------------------------------------------
6
 
7
library ieee;
8
use ieee.std_logic_1164.all;
9
use ieee.numeric_std.all;
10
use ieee.std_logic_textio.all; -- read std_ulogic etc
11
 
12
library work;
13
use work.qfp_p.all;
14
use work.qfp32_add_p.all;
15
use work.qfp32_misc_p.all;
16
use work.qfp32_unit_p.all;
17
use work.qfp32_test_p.all;
18
 
19
library std;
20
use std.textio.all;
21
 
22
-------------------------------------------------------------------------------
23
 
24
entity qfp_unit_tb is
25
 
26
end entity qfp_unit_tb;
27
 
28
-------------------------------------------------------------------------------
29
 
30
architecture Behav of qfp_unit_tb is
31
 
32
  type cmd_vector_t is array (natural range <>) of qfp_cmd_t;
33
 
34
  constant cmds : cmd_vector_t(6 downto 0) :=
35
    (
36
      (QFP_UNIT_ADD,QFP_SCMD_ADD),      -- add
37
      (QFP_UNIT_ADD,QFP_SCMD_SUB),      -- sub
38
      (QFP_UNIT_MUL,"00"),              -- mul
39
      (QFP_UNIT_RECP,"00"),             -- recp
40
      (QFP_UNIT_MISC,QFP_SCMD_Q2I),     -- convert qfp to integer
41
      (QFP_UNIT_MISC,QFP_SCMD_I2Q),     -- convert integer to qfp
42
      (QFP_UNIT_DIV,"00")               -- division  
43
    );
44
 
45
  -- component ports
46
  signal clk      : std_ulogic := '1';
47
  signal reset_n  : std_ulogic;
48
  signal cmd      : qfp_cmd_t;
49
  signal idle     : std_ulogic;
50
  signal start    : std_ulogic;
51
  signal regA     : std_ulogic_vector(31 downto 0);
52
  signal regB     : std_ulogic_vector(31 downto 0);
53
  signal result   : std_ulogic_vector(31 downto 0);
54
  signal gt       : std_ulogic;
55
  signal z        : std_ulogic;
56
  signal complete : std_ulogic;
57
 
58
  signal i : integer;
59
  file test_file : text;
60
  signal test : qfp_test_t;
61
 
62
begin  -- architecture Behav
63
 
64
  -- component instantiation
65
  DUT: entity work.qfp_unit
66
    generic map (
67
      config => qfp_config_all)
68
    port map (
69
      clk_i      => clk,
70
      reset_n_i  => reset_n,
71
      cmd_i      => cmd,
72
      ready_o    => idle,
73
      start_i    => start,
74
      regA_i     => regA,
75
      regB_i     => regB,
76
      result_o   => result,
77
      cmp_gt_o   => gt,                 -- regB > regA
78
      cmp_z_o    => z,
79
      complete_o => complete);
80
 
81
  -- clock generation
82
  clk <= not clk after 10 ns;
83
 
84
  -- waveform generation
85
  process
86
    variable l : line;
87
    variable test_as_var : qfp_test_t;
88
    variable dummy : character;
89
  begin
90
    reset_n <= '0';
91
    regA <= (others => '0');
92
    regB <= (others => '0');
93
    start <= '0';
94
    cmd <= (QFP_UNIT_NONE,"00");
95
 
96
    file_open(test_file,"test.vector");
97
 
98
    i <= 0;
99
    test <= (X"00000000",X"00000000",'0','0',(X"00000000",X"00000000",X"00000000",X"00000000",X"00000000",X"00000000",X"00000000"));
100
 
101
    wait for 33 ns;
102
 
103
    reset_n <= '1';
104
 
105
    wait until rising_edge(clk);
106
 
107
    while not endfile(test_file) loop
108
 
109
      -- read entry from file
110
      readline(test_file,l);
111
 
112
      hread(l,test_as_var.a);
113
      read(l,dummy);
114
      hread(l,test_as_var.b);
115
      read(l,dummy);
116
      read(l,test_as_var.gt);
117
      read(l,dummy);
118
      read(l,test_as_var.eq);
119
      read(l,dummy);
120
 
121
      hread(l,test_as_var.results(6));
122
        read(l,dummy);
123
 
124
      for k in 1 to 6 loop
125
        hread(l,test_as_var.results(6-k));
126
        read(l,dummy);
127
      end loop;  -- k
128
 
129
      test <= test_as_var;
130
 
131
      wait for 1 ns;
132
 
133
      regA <= test.a;
134
      regB <= test.b;
135
 
136
      -- for each instruction
137
      for j in 0 to cmds'length-1 loop
138
        wait for 1 ns;
139
 
140
        cmd <= cmds(j);
141
        start <= '1';
142
        wait until rising_edge(clk);
143
        start <= '0';
144
 
145
        if complete = '0' then
146
          wait until rising_edge(clk) and complete = '1';
147
        end if;
148
 
149
        assert result = test.results(j) report "result error" severity failure;
150
 
151
        if j = cmds'length-2 then -- if op = sub   
152
          assert gt = test.gt and z = test.eq report "compare flag error" severity failure;
153
        end if;
154
 
155
      end loop;  -- j
156
 
157
      i <= i+1;
158
 
159
    end loop;
160
 
161
    file_close(test_file);
162
 
163
    wait;
164
 
165
  end process;
166
 
167
end architecture Behav;

powered by: WebSVN 2.1.0

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