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

Subversion Repositories astron_multiplier

[/] [astron_multiplier/] [trunk/] [tb_common_complex_mult.vhd] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 danv
-------------------------------------------------------------------------------
2
--
3
-- Copyright (C) 2009
4
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
5
-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
6
--
7
-- This program is free software: you can redistribute it and/or modify
8
-- it under the terms of the GNU General Public License as published by
9
-- the Free Software Foundation, either version 3 of the License, or
10
-- (at your option) any later version.
11
--
12
-- This program is distributed in the hope that it will be useful,
13
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
-- GNU General Public License for more details.
16
--
17
-- You should have received a copy of the GNU General Public License
18
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
--
20
-------------------------------------------------------------------------------
21
-- Purpose: Verify different architectures of common_complex_mult
22
-- Description:
23
--   p_verify verifies that the instances of common_complex_mult all yield the
24
--   expected results and ASSERTs an ERROR in case they differ.
25
-- Usage:
26
-- > as 10
27
-- > run -all  -- signal tb_end will stop the simulation by stopping the clk
28
 
29
LIBRARY IEEE, common_pkg_lib, common_components_lib, technology_lib, tech_mult_lib; --, ip_stratixiv_mult_lib;
30
USE IEEE.std_logic_1164.ALL;
31
USE IEEE.numeric_std.ALL;
32
USE technology_lib.technology_select_pkg.ALL;
33
USE common_pkg_lib.common_pkg.ALL;
34
USE common_pkg_lib.common_lfsr_sequences_pkg.ALL;
35
USE common_pkg_lib.tb_common_pkg.ALL;
36
 
37
 
38
ENTITY tb_common_complex_mult IS
39
  GENERIC (
40
    g_in_dat_w         : NATURAL := 4;
41
    g_out_dat_w        : NATURAL := 8;       -- g_in_dat_w*2 for multiply and +1 for adder
42
    g_conjugate_b      : BOOLEAN := FALSE;   -- When FALSE p = a * b, else p = a * conj(b)
43
    g_pipeline_input   : NATURAL := 1;
44
    g_pipeline_product : NATURAL := 0;
45
    g_pipeline_adder   : NATURAL := 1;
46
    g_pipeline_output  : NATURAL := 1
47
  );
48
END tb_common_complex_mult;
49
 
50
 
51
ARCHITECTURE tb OF tb_common_complex_mult IS
52
 
53
  CONSTANT clk_period        : TIME := 10 ns;
54
  CONSTANT c_pipeline        : NATURAL := g_pipeline_input + g_pipeline_product + g_pipeline_adder + g_pipeline_output;
55
 
56
  CONSTANT c_max             : INTEGER :=  2**(g_in_dat_w-1)-1;
57
  CONSTANT c_min             : INTEGER := -2**(g_in_dat_w-1);
58
 
59
  CONSTANT c_technology      : NATURAL := c_tech_select_default;
60
 
61
  SIGNAL tb_end              : STD_LOGIC := '0';
62
  SIGNAL rst                 : STD_LOGIC;
63
  SIGNAL clk                 : STD_LOGIC := '0';
64
 
65
  SIGNAL random              : STD_LOGIC_VECTOR(14 DOWNTO 0) := (OTHERS=>'0');  -- use different lengths to have different random sequences
66
 
67
  SIGNAL in_ar               : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
68
  SIGNAL in_ai               : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
69
  SIGNAL in_br               : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
70
  SIGNAL in_bi               : STD_LOGIC_VECTOR(g_in_dat_w-1 DOWNTO 0);
71
 
72
  SIGNAL in_val              : STD_LOGIC;  -- in_val is only passed on to out_val
73
  SIGNAL result_val_expected : STD_LOGIC;
74
  SIGNAL result_val_rtl      : STD_LOGIC;
75
  SIGNAL result_val_ip       : STD_LOGIC;
76
 
77
  SIGNAL out_result_re       : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);  -- combinatorial result
78
  SIGNAL out_result_im       : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
79
  SIGNAL result_re_expected  : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);  -- pipelined results
80
  SIGNAL result_re_rtl       : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
81
  SIGNAL result_re_ip        : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
82
  SIGNAL result_im_expected  : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
83
  SIGNAL result_im_rtl       : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
84
  SIGNAL result_im_ip        : STD_LOGIC_VECTOR(g_out_dat_w-1 DOWNTO 0);
85
 
86
 
87
BEGIN
88
 
89
  clk <= (NOT clk) OR tb_end AFTER clk_period/2;
90
 
91
  random <= func_common_random(random) WHEN rising_edge(clk);
92
 
93
  in_val <= random(random'HIGH);
94
 
95
  -- run -all
96
  p_in_stimuli : PROCESS
97
  BEGIN
98
    rst <= '1';
99
    in_ar <= TO_SVEC(0, g_in_dat_w);
100
    in_br <= TO_SVEC(0, g_in_dat_w);
101
    in_ai <= TO_SVEC(0, g_in_dat_w);
102
    in_bi <= TO_SVEC(0, g_in_dat_w);
103
    WAIT UNTIL rising_edge(clk);
104
    FOR I IN 0 TO 9 LOOP
105
      WAIT UNTIL rising_edge(clk);
106
    END LOOP;
107
    rst <= '0';
108
    FOR I IN 0 TO 9 LOOP
109
      WAIT UNTIL rising_edge(clk);
110
    END LOOP;
111
 
112
    -- Some special combinations
113
    in_ar <= TO_SVEC(2, g_in_dat_w);
114
    in_ai <= TO_SVEC(4, g_in_dat_w);
115
    in_br <= TO_SVEC(3, g_in_dat_w);
116
    in_bi <= TO_SVEC(5, g_in_dat_w);
117
    WAIT UNTIL rising_edge(clk);
118
    in_ar <= TO_SVEC( c_max, g_in_dat_w);  -- p*p - p*p + j ( p*p + p*p) = 0 + j 2pp  or  p*p + p*p + j (-p*p + p*p) = 2pp + j 0
119
    in_ai <= TO_SVEC( c_max, g_in_dat_w);
120
    in_br <= TO_SVEC( c_max, g_in_dat_w);
121
    in_bi <= TO_SVEC( c_max, g_in_dat_w);
122
    WAIT UNTIL rising_edge(clk);
123
    in_ar <= TO_SVEC( c_min, g_in_dat_w);
124
    in_ai <= TO_SVEC( c_min, g_in_dat_w);
125
    in_br <= TO_SVEC( c_min, g_in_dat_w);
126
    in_bi <= TO_SVEC( c_min, g_in_dat_w);
127
    WAIT UNTIL rising_edge(clk);
128
    in_ar <= TO_SVEC( c_max, g_in_dat_w);
129
    in_ai <= TO_SVEC( c_max, g_in_dat_w);
130
    in_br <= TO_SVEC( c_min, g_in_dat_w);
131
    in_bi <= TO_SVEC( c_min, g_in_dat_w);
132
    WAIT UNTIL rising_edge(clk);
133
    in_ar <= TO_SVEC( c_max, g_in_dat_w);
134
    in_ai <= TO_SVEC( c_max, g_in_dat_w);
135
    in_br <= TO_SVEC(-c_max, g_in_dat_w);
136
    in_bi <= TO_SVEC(-c_max, g_in_dat_w);
137
    WAIT UNTIL rising_edge(clk);
138
    in_ar <= TO_SVEC( c_min, g_in_dat_w);
139
    in_ai <= TO_SVEC( c_min, g_in_dat_w);
140
    in_br <= TO_SVEC(-c_max, g_in_dat_w);
141
    in_bi <= TO_SVEC(-c_max, g_in_dat_w);
142
    WAIT UNTIL rising_edge(clk);
143
 
144
    FOR I IN 0 TO 49 LOOP
145
      WAIT UNTIL rising_edge(clk);
146
    END LOOP;
147
 
148
    -- All combinations
149
    FOR I IN -c_max TO c_max LOOP
150
      FOR J IN -c_max TO c_max LOOP
151
        FOR K IN -c_max TO c_max LOOP
152
          FOR L IN -c_max TO c_max LOOP
153
            in_ar <= TO_SVEC(I, g_in_dat_w);
154
            in_ai <= TO_SVEC(K, g_in_dat_w);
155
            in_br <= TO_SVEC(J, g_in_dat_w);
156
            in_bi <= TO_SVEC(L, g_in_dat_w);
157
            WAIT UNTIL rising_edge(clk);
158
          END LOOP;
159
        END LOOP;
160
      END LOOP;
161
    END LOOP;
162
 
163
    FOR I IN 0 TO 49 LOOP
164
      WAIT UNTIL rising_edge(clk);
165
    END LOOP;
166
 
167
    tb_end <= '1';
168
    WAIT;
169
  END PROCESS;
170
 
171
  -- Expected combinatorial complex multiply out_result
172
  out_result_re <= func_complex_multiply(in_ar, in_ai, in_br, in_bi, g_conjugate_b, "RE", g_out_dat_w);
173
  out_result_im <= func_complex_multiply(in_ar, in_ai, in_br, in_bi, g_conjugate_b, "IM", g_out_dat_w);
174
 
175
  u_result_re : ENTITY common_components_lib.common_pipeline
176
  GENERIC MAP (
177
    g_representation => "SIGNED",
178
    g_pipeline       => c_pipeline,
179
    g_reset_value    => 0,
180
    g_in_dat_w       => g_out_dat_w,
181
    g_out_dat_w      => g_out_dat_w
182
  )
183
  PORT MAP (
184
    rst     => rst,
185
    clk     => clk,
186
    clken   => '1',
187
    in_dat  => out_result_re,
188
    out_dat => result_re_expected
189
  );
190
 
191
  u_result_im : ENTITY common_components_lib.common_pipeline
192
  GENERIC MAP (
193
    g_representation => "SIGNED",
194
    g_pipeline       => c_pipeline,
195
    g_reset_value    => 0,
196
    g_in_dat_w       => g_out_dat_w,
197
    g_out_dat_w      => g_out_dat_w
198
  )
199
  PORT MAP (
200
    rst     => rst,
201
    clk     => clk,
202
    clken   => '1',
203
    in_dat  => out_result_im,
204
    out_dat => result_im_expected
205
  );
206
 
207
  u_result_val_expected : ENTITY common_components_lib.common_pipeline_sl
208
  GENERIC MAP (
209
    g_pipeline    => c_pipeline,
210
    g_reset_value => 0
211
  )
212
  PORT MAP (
213
    rst     => rst,
214
    clk     => clk,
215
    clken   => '1',
216
    in_dat  => in_val,
217
    out_dat => result_val_expected
218
  );
219
 
220
  u_dut_rtl : ENTITY work.common_complex_mult
221
  GENERIC MAP (
222
    g_technology       => c_technology,
223
    g_variant          => "RTL",
224
    g_in_a_w           => g_in_dat_w,
225
    g_in_b_w           => g_in_dat_w,
226
    g_out_p_w          => g_out_dat_w,
227
    g_conjugate_b      => g_conjugate_b,
228
    g_pipeline_input   => g_pipeline_input,
229
    g_pipeline_product => g_pipeline_product,
230
    g_pipeline_adder   => g_pipeline_adder,
231
    g_pipeline_output  => g_pipeline_output
232
  )
233
  PORT MAP (
234
    rst        => rst,
235
    clk        => clk,
236
    clken      => '1',
237
    in_ar      => in_ar,
238
    in_ai      => in_ai,
239
    in_br      => in_br,
240
    in_bi      => in_bi,
241
    in_val     => in_val,
242
    out_pr     => result_re_rtl,
243
    out_pi     => result_im_rtl,
244
    out_val    => result_val_rtl
245
  );
246
 
247
  u_dut_ip : ENTITY work.common_complex_mult
248
  GENERIC MAP (
249
    g_technology       => c_technology,
250
    g_variant          => "IP",
251
    g_in_a_w           => g_in_dat_w,
252
    g_in_b_w           => g_in_dat_w,
253
    g_out_p_w          => g_out_dat_w,
254
    g_conjugate_b      => g_conjugate_b,
255
    g_pipeline_input   => g_pipeline_input,
256
    g_pipeline_product => g_pipeline_product,
257
    g_pipeline_adder   => g_pipeline_adder,
258
    g_pipeline_output  => g_pipeline_output
259
  )
260
  PORT MAP (
261
    rst        => rst,
262
    clk        => clk,
263
    clken      => '1',
264
    in_ar      => in_ar,
265
    in_ai      => in_ai,
266
    in_br      => in_br,
267
    in_bi      => in_bi,
268
    in_val     => in_val,
269
    out_pr     => result_re_ip,
270
    out_pi     => result_im_ip,
271
    out_val    => result_val_ip
272
  );
273
 
274
  p_verify : PROCESS(rst, clk)
275
  BEGIN
276
    IF rst='0' THEN
277
      IF rising_edge(clk) THEN
278
        ASSERT result_re_rtl  = result_re_expected  REPORT "Error: RE wrong RTL result"  SEVERITY ERROR;
279
        ASSERT result_im_rtl  = result_im_expected  REPORT "Error: IM wrong RTL result"  SEVERITY ERROR;
280
        ASSERT result_val_rtl = result_val_expected REPORT "Error: VAL wrong RTL result" SEVERITY ERROR;
281
 
282
        ASSERT result_re_ip   = result_re_expected  REPORT "Error: RE wrong IP result"  SEVERITY ERROR;
283
        ASSERT result_im_ip   = result_im_expected  REPORT "Error: IM wrong IP result"  SEVERITY ERROR;
284
        ASSERT result_val_ip  = result_val_expected REPORT "Error: VAL wrong IP result" SEVERITY ERROR;
285
 
286
      END IF;
287
    END IF;
288
  END PROCESS;
289
 
290
END tb;

powered by: WebSVN 2.1.0

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