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

Subversion Repositories qfp32

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

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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