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

Subversion Repositories encore

[/] [encore/] [trunk/] [fpmult/] [src/] [test_fpmult.vhdl] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 aloy.amber
library ieee;
2
use ieee.std_logic_1164.all;
3
use work.fp_generic.all;
4
use work.fpmult_comp.all;
5
 
6
entity test_fpmult is
7
end;
8
 
9
architecture testbench of test_fpmult is
10 8 aloy.amber
  type test_condition_type is record
11
    a:fp_type;
12
    b:fp_type;
13
    p:fp_type;
14
    msg:string(1 to 43);
15
  end record;
16
 
17
  type test_condition_array_type is array(positive range <>) of test_condition_type;
18
 
19 6 aloy.amber
        signal clk:std_logic:='0';
20
        signal d:fpmult_in_type;
21
        signal q:fpmult_out_type;
22 8 aloy.amber
 
23
  constant number_of_stages:integer:=25;
24
  constant clock_period:time:=20 ns;
25
  constant pipeline_delay:time:=number_of_stages*clock_period;
26
 
27
  constant plus_zero:fp_type:=x"00000000";
28
  constant minus_zero:fp_type:=x"80000000";
29
 
30
  constant plus_normal:fp_type:=x"3FB76CE1";
31
  constant minus_normal:fp_type:=x"BFB76CE1";
32
 
33
  constant plus_normal_squared:fp_type:=x"40036CD8";
34
  constant minus_normal_squared:fp_type:=x"C0036CD8";
35
 
36
  constant plus_subnormal:fp_type:=x"00051D75";
37
  constant minus_subnormal:fp_type:=x"80051D75";
38
 
39
  constant plus_infinite:fp_type:=x"7F800000";
40
  constant minus_infinite:fp_type:=x"FF800000";
41
 
42
  constant plus_qnan:fp_type:=x"7FC00000";
43
  constant minus_qnan:fp_type:=x"FFC00000";
44
 
45
  constant plus_snan:fp_type:=x"7FBFFFFF";
46
  constant minus_snan:fp_type:=x"FFBFFFFF";
47
 
48
  constant multiplier_testset:test_condition_array_type:=
49
  (
50
    ----------------------------------------------------------------------------
51
    -- zero * zero
52
    ----------------------------------------------------------------------------
53
    (       plus_zero,       plus_zero,            plus_zero, "+0 * +0 != +0                              " ),
54
    (       plus_zero,      minus_zero,           minus_zero, "+0 * -0 != -0                              " ),
55
    (      minus_zero,       plus_zero,           minus_zero, "-0 * +0 != -0                              " ),
56
    (      minus_zero,      minus_zero,            plus_zero, "-0 * -0 != +0                              " ),
57
 
58
    ----------------------------------------------------------------------------
59
    -- zero * normal
60
    ----------------------------------------------------------------------------
61
    (       plus_zero,     plus_normal,            plus_zero, "+0 * +normal != +0                         " ),
62
    (       plus_zero,    minus_normal,           minus_zero, "+0 * -normal != -0                         " ),
63
    (      minus_zero,     plus_normal,           minus_zero, "-0 * +normal != -0                         " ),
64
    (      minus_zero,    minus_normal,            plus_zero, "-0 * -normal != +0                         " ),
65
 
66
    ----------------------------------------------------------------------------
67
    -- normal * zero
68
    ----------------------------------------------------------------------------
69
    (     plus_normal,       plus_zero,            plus_zero, "+normal * +0 != +0                         " ),
70
    (     plus_normal,      minus_zero,           minus_zero, "+normal * -0 != -0                         " ),
71
    (    minus_normal,       plus_zero,           minus_zero, "-normal * +0 != -0                         " ),
72
    (    minus_normal,      minus_zero,            plus_zero, "-normal * -0 != +0                         " ),
73
 
74
    ----------------------------------------------------------------------------
75
    -- zero * subnormal
76
    ----------------------------------------------------------------------------
77
    (       plus_zero,  plus_subnormal,            plus_zero, "+0 * +subnormal != +0                      " ),
78
    (       plus_zero, minus_subnormal,           minus_zero, "+0 * -subnormal != -0                      " ),
79
    (      minus_zero,  plus_subnormal,           minus_zero, "-0 * +subnormal != -0                      " ),
80
    (      minus_zero, minus_subnormal,            plus_zero, "-0 * -subnormal != +0                      " ),
81
 
82
    ----------------------------------------------------------------------------
83
    -- subnormal * zero
84
    ----------------------------------------------------------------------------
85
    (  plus_subnormal,       plus_zero,            plus_zero, "+subnormal * +0 != +0                      " ),
86
    (  plus_subnormal,      minus_zero,           minus_zero, "+subnormal * -0 != -0                      " ),
87
    ( minus_subnormal,       plus_zero,           minus_zero, "-subnormal * +0 != -0                      " ),
88
    ( minus_subnormal,      minus_zero,            plus_zero, "-subnormal * -0 != +0                      " ),
89
 
90
    ----------------------------------------------------------------------------
91
    -- zero * infinite
92
    ----------------------------------------------------------------------------
93
    (       plus_zero,   plus_infinite,            plus_qnan, "+0 * +infinite != +qnan                    " ),
94
    (       plus_zero,  minus_infinite,           minus_qnan, "+0 * -infinite != -qnan                    " ),
95
    (      minus_zero,   plus_infinite,           minus_qnan, "-0 * +infinite != -qnan                    " ),
96
    (      minus_zero,  minus_infinite,            plus_qnan, "-0 * -infinite != +qnan                    " ),
97
 
98
    ----------------------------------------------------------------------------
99
    -- infinite * zero
100
    ----------------------------------------------------------------------------
101
    (   plus_infinite,       plus_zero,            plus_qnan, "+infinite * +0 != +qnan                    " ),
102
    (   plus_infinite,      minus_zero,           minus_qnan, "+infinite * -0 != -qnan                    " ),
103
    (  minus_infinite,       plus_zero,           minus_qnan, "-infinite * +0 != -qnan                    " ),
104
    (  minus_infinite,      minus_zero,            plus_qnan, "-infinite * -0 != +qnan                    " ),
105
 
106
    ----------------------------------------------------------------------------
107
    -- zero * qnan
108
    ----------------------------------------------------------------------------
109
    (       plus_zero,       plus_qnan,            plus_qnan, "+0 * +qnan != +qnan                        " ),
110
    (       plus_zero,      minus_qnan,           minus_qnan, "+0 * -qnan != -qnan                        " ),
111
    (      minus_zero,       plus_qnan,           minus_qnan, "-0 * +qnan != -qnan                        " ),
112
    (      minus_zero,      minus_qnan,            plus_qnan, "-0 * -qnan != +qnan                        " ),
113
 
114
    ----------------------------------------------------------------------------
115
    -- qnan * zero
116
    ----------------------------------------------------------------------------
117
    (       plus_qnan,       plus_zero,            plus_qnan, "+qnan * +0 != +qnan                        " ),
118
    (       plus_qnan,      minus_zero,           minus_qnan, "+qnan * -0 != -qnan                        " ),
119
    (      minus_qnan,       plus_zero,           minus_qnan, "-qnan * +0 != -qnan                        " ),
120
    (      minus_qnan,      minus_zero,            plus_qnan, "-qnan * -0 != +qnan                        " ),
121
 
122
    ----------------------------------------------------------------------------
123
    -- zero * snan
124
    ----------------------------------------------------------------------------
125
    (       plus_zero,       plus_snan,            plus_qnan, "+0 * +snan != +qnan                        " ),
126
    (       plus_zero,      minus_snan,           minus_qnan, "+0 * -snan != -qnan                        " ),
127
    (      minus_zero,       plus_snan,           minus_qnan, "-0 * +snan != -qnan                        " ),
128
    (      minus_zero,      minus_snan,            plus_qnan, "-0 * -snan != +qnan                        " ),
129
 
130
    ----------------------------------------------------------------------------
131
    -- snan * zero
132
    ----------------------------------------------------------------------------
133
    (       plus_snan,       plus_zero,            plus_qnan, "+snan * +0 != +qnan                        " ),
134
    (       plus_snan,      minus_zero,           minus_qnan, "+snan * -0 != -qnan                        " ),
135
    (      minus_snan,       plus_zero,           minus_qnan, "-snan * +0 != -qnan                        " ),
136
    (      minus_snan,      minus_zero,            plus_qnan, "-snan * -0 != +qnan                        " ),
137
 
138
    ----------------------------------------------------------------------------
139
    -- normal * normal
140
    ----------------------------------------------------------------------------
141
    (     plus_normal,     plus_normal,  plus_normal_squared, "+normal * +normal != +normal               " ),
142
    (     plus_normal,    minus_normal, minus_normal_squared, "+normal * -normal != -normal               " ),
143
    (    minus_normal,     plus_normal, minus_normal_squared, "-normal * +normal != -normal               " ),
144
    (    minus_normal,    minus_normal,  plus_normal_squared, "-normal * -normal != +normal               " ),
145
 
146
    ----------------------------------------------------------------------------
147
    -- normal * subnormal
148
    ----------------------------------------------------------------------------
149
    (     plus_normal,  plus_subnormal,            plus_zero, "+normal * +subnormal != +0                 " ),
150
    (     plus_normal, minus_subnormal,           minus_zero, "+normal * -subnormal != -0                 " ),
151
    (    minus_normal,  plus_subnormal,           minus_zero, "-normal * +subnormal != -0                 " ),
152
    (    minus_normal, minus_subnormal,            plus_zero, "-normal * -subnormal != +0                 " ),
153
 
154
    ----------------------------------------------------------------------------
155
    -- subnormal * normal
156
    ----------------------------------------------------------------------------
157
    (  plus_subnormal,     plus_normal,            plus_zero, "+subnormal * +normal != +0                 " ),
158
    (  plus_subnormal,    minus_normal,           minus_zero, "+subnormal * -normal != -0                 " ),
159
    ( minus_subnormal,     plus_normal,           minus_zero, "-subnormal * +normal != -0                 " ),
160
    ( minus_subnormal,    minus_normal,            plus_zero, "-subnormal * -normal != +0                 " ),
161
 
162
    ----------------------------------------------------------------------------
163
    -- normal * infinite
164
    ----------------------------------------------------------------------------
165
    (     plus_normal,   plus_infinite,        plus_infinite, "+normal * +infinite != +infinite           " ),
166
    (     plus_normal,  minus_infinite,       minus_infinite, "+normal * -infinite != -infinite           " ),
167
    (    minus_normal,   plus_infinite,       minus_infinite, "-normal * +infinite != -infinite           " ),
168
    (    minus_normal,  minus_infinite,        plus_infinite, "-normal * -infinite != +infinite           " ),
169
 
170
    ----------------------------------------------------------------------------
171
    -- infinite * normal
172
    ----------------------------------------------------------------------------
173
    (   plus_infinite,     plus_normal,        plus_infinite, "+infinite * +normal != +infinite           " ),
174
    (   plus_infinite,    minus_normal,       minus_infinite, "+infinite * -normal != -infinite           " ),
175
    (  minus_infinite,     plus_normal,       minus_infinite, "-infinite * +normal != -infinite           " ),
176
    (  minus_infinite,    minus_normal,        plus_infinite, "-infinite * -normal != +infinite           " ),
177
 
178
    ----------------------------------------------------------------------------
179
    -- normal * qnan
180
    ----------------------------------------------------------------------------
181
    (     plus_normal,       plus_qnan,            plus_qnan, "+normal * +qnan != +qnan                   " ),
182
    (     plus_normal,      minus_qnan,           minus_qnan, "+normal * -qnan != -qnan                   " ),
183
    (    minus_normal,       plus_qnan,           minus_qnan, "-normal * +qnan != -qnan                   " ),
184
    (    minus_normal,      minus_qnan,            plus_qnan, "-normal * -qnan != +qnan                   " ),
185
 
186
    ----------------------------------------------------------------------------
187
    -- qnan * normal
188
    ----------------------------------------------------------------------------
189
    (       plus_qnan,     plus_normal,            plus_qnan, "+qnan * +normal != +qnan                   " ),
190
    (       plus_qnan,    minus_normal,           minus_qnan, "+qnan * -normal != -qnan                   " ),
191
    (      minus_qnan,     plus_normal,           minus_qnan, "-qnan * +normal != -qnan                   " ),
192
    (      minus_qnan,    minus_normal,            plus_qnan, "-qnan * -normal != +qnan                   " ),
193
 
194
    ----------------------------------------------------------------------------
195
    -- normal * snan
196
    ----------------------------------------------------------------------------
197
    (     plus_normal,       plus_snan,            plus_qnan, "+normal * +snan != +qnan                   " ),
198
    (     plus_normal,      minus_snan,           minus_qnan, "+normal * -snan != -qnan                   " ),
199
    (    minus_normal,       plus_snan,           minus_qnan, "-normal * +snan != -qnan                   " ),
200
    (    minus_normal,      minus_snan,            plus_qnan, "-normal * -snan != +qnan                   " ),
201
 
202
    ----------------------------------------------------------------------------
203
    -- snan * normal
204
    ----------------------------------------------------------------------------
205
    (       plus_snan,     plus_normal,            plus_qnan, "+snan * +normal != +qnan                   " ),
206
    (       plus_snan,    minus_normal,           minus_qnan, "+snan * -normal != -qnan                   " ),
207
    (      minus_snan,     plus_normal,           minus_qnan, "-snan * +normal != -qnan                   " ),
208
    (      minus_snan,    minus_normal,            plus_qnan, "-snan * -normal != +qnan                   " ),
209
 
210
    ----------------------------------------------------------------------------
211
    -- subnormal * subnormal
212
    ----------------------------------------------------------------------------
213
    (  plus_subnormal,  plus_subnormal,            plus_zero, "+subnormal * +subnormal != +0              " ),
214
    (  plus_subnormal, minus_subnormal,           minus_zero, "+subnormal * -subnormal != -0              " ),
215
    ( minus_subnormal,  plus_subnormal,           minus_zero, "-subnormal * +subnormal != -0              " ),
216
    ( minus_subnormal, minus_subnormal,            plus_zero, "-subnormal * -subnormal != +0              " ),
217
 
218
    ----------------------------------------------------------------------------
219
    -- subnormal * infinite
220
    ----------------------------------------------------------------------------
221
    (  plus_subnormal,   plus_infinite,            plus_qnan, "+subnormal * +infinite != +qnan            " ),
222
    (  plus_subnormal,  minus_infinite,           minus_qnan, "+subnormal * -infinite != -qnan            " ),
223
    ( minus_subnormal,   plus_infinite,           minus_qnan, "-subnormal * +infinite != -qnan            " ),
224
    ( minus_subnormal,  minus_infinite,            plus_qnan, "-subnormal * -infinite != +qnan            " ),
225
 
226
    ----------------------------------------------------------------------------
227
    -- infinite * subnormal
228
    ----------------------------------------------------------------------------
229
    (   plus_infinite,  plus_subnormal,            plus_qnan, "+infinite * +subnormal != +qnan            " ),
230
    (   plus_infinite, minus_subnormal,           minus_qnan, "+infinite * -subnormal != -qnan            " ),
231
    (  minus_infinite,  plus_subnormal,           minus_qnan, "-infinite * +subnormal != -qnan            " ),
232
    (  minus_infinite, minus_subnormal,            plus_qnan, "-infinite * -subnormal != +qnan            " ),
233
 
234
    ----------------------------------------------------------------------------
235
    -- subnormal * qnan
236
    ----------------------------------------------------------------------------
237
    (  plus_subnormal,       plus_qnan,            plus_qnan, "+subnormal * +qnan != +qnan                " ),
238
    (  plus_subnormal,      minus_qnan,           minus_qnan, "+subnormal * -qnan != -qnan                " ),
239
    ( minus_subnormal,       plus_qnan,           minus_qnan, "-subnormal * +qnan != -qnan                " ),
240
    ( minus_subnormal,      minus_qnan,            plus_qnan, "-subnormal * -qnan != +qnan                " ),
241
 
242
    ----------------------------------------------------------------------------
243
    -- qnan * subnormal
244
    ----------------------------------------------------------------------------
245
    (       plus_qnan,  plus_subnormal,            plus_qnan, "+qnan * +subnormal != +qnan                " ),
246
    (       plus_qnan, minus_subnormal,           minus_qnan, "+qnan * -subnormal != -qnan                " ),
247
    (      minus_qnan,  plus_subnormal,           minus_qnan, "-qnan * +subnormal != -qnan                " ),
248
    (      minus_qnan, minus_subnormal,            plus_qnan, "-qnan * -subnormal != +qnan                " ),
249
 
250
    ----------------------------------------------------------------------------
251
    -- subnormal * snan
252
    ----------------------------------------------------------------------------
253
    (  plus_subnormal,       plus_snan,            plus_qnan, "+subnormal * +snan != +qnan                " ),
254
    (  plus_subnormal,      minus_snan,           minus_qnan, "+subnormal * -snan != -qnan                " ),
255
    ( minus_subnormal,       plus_snan,           minus_qnan, "-subnormal * +snan != -qnan                " ),
256
    ( minus_subnormal,      minus_snan,            plus_qnan, "-subnormal * -snan != +qnan                " ),
257
 
258
    ----------------------------------------------------------------------------
259
    -- snan * subnormal
260
    ----------------------------------------------------------------------------
261
    (       plus_snan,  plus_subnormal,            plus_qnan, "+snan * +subnormal != +qnan                " ),
262
    (       plus_snan, minus_subnormal,           minus_qnan, "+snan * -subnormal != -qnan                " ),
263
    (      minus_snan,  plus_subnormal,           minus_qnan, "-snan * +subnormal != -qnan                " ),
264
    (      minus_snan, minus_subnormal,            plus_qnan, "-snan * -subnormal != +qnan                " ),
265
 
266
    ----------------------------------------------------------------------------
267
    -- infinite * infinite
268
    ----------------------------------------------------------------------------
269
    (   plus_infinite,   plus_infinite,        plus_infinite, "+infinite * +infinite != +infinite         " ),
270
    (   plus_infinite,  minus_infinite,       minus_infinite, "+infinite * -infinite != -infinite         " ),
271
    (  minus_infinite,   plus_infinite,       minus_infinite, "-infinite * +infinite != -infinite         " ),
272
    (  minus_infinite,  minus_infinite,        plus_infinite, "-infinite * -infinite != +infinite         " ),
273
 
274
    ----------------------------------------------------------------------------
275
    -- infinite * qnan
276
    ----------------------------------------------------------------------------
277
    (   plus_infinite,       plus_qnan,            plus_qnan, "+infinite * +qnan != +qnan                 " ),
278
    (   plus_infinite,      minus_qnan,           minus_qnan, "+infinite * -qnan != -qnan                 " ),
279
    (  minus_infinite,       plus_qnan,           minus_qnan, "-infinite * +qnan != -qnan                 " ),
280
    (  minus_infinite,      minus_qnan,            plus_qnan, "-infinite * -qnan != +qnan                 " ),
281
 
282
    ----------------------------------------------------------------------------
283
    -- qnan * infinite
284
    ----------------------------------------------------------------------------
285
    (       plus_qnan,   plus_infinite,            plus_qnan, "+qnan * +infinite != +qnan                 " ),
286
    (       plus_qnan,  minus_infinite,           minus_qnan, "+qnan * -infinite != -qnan                 " ),
287
    (      minus_qnan,   plus_infinite,           minus_qnan, "-qnan * +infinite != -qnan                 " ),
288
    (      minus_qnan,  minus_infinite,            plus_qnan, "-qnan * -infinite != +qnan                 " ),
289
 
290
    ----------------------------------------------------------------------------
291
    -- infinite * snan
292
    ----------------------------------------------------------------------------
293
    (   plus_infinite,       plus_snan,            plus_qnan, "+infinite * +snan != +qnan                 " ),
294
    (   plus_infinite,      minus_snan,           minus_qnan, "+infinite * -snan != -qnan                 " ),
295
    (  minus_infinite,       plus_snan,           minus_qnan, "-infinite * +snan != -qnan                 " ),
296
    (  minus_infinite,      minus_snan,            plus_qnan, "-infinite * -snan != +qnan                 " ),
297
 
298
    ----------------------------------------------------------------------------
299
    -- snan * infinite
300
    ----------------------------------------------------------------------------
301
    (       plus_snan,   plus_infinite,            plus_qnan, "+snan * +infinite != +qnan                 " ),
302
    (       plus_snan,  minus_infinite,           minus_qnan, "+snan * -infinite != -qnan                 " ),
303
    (      minus_snan,   plus_infinite,           minus_qnan, "-snan * +infinite != -qnan                 " ),
304
    (      minus_snan,  minus_infinite,            plus_qnan, "-snan * -infinite != +qnan                 " ),
305
 
306
    ----------------------------------------------------------------------------
307
    -- qnan * qnan
308
    ----------------------------------------------------------------------------
309
    (       plus_qnan,       plus_qnan,            plus_qnan, "+qnan * +qnan != +qnan                     " ),
310
    (       plus_qnan,      minus_qnan,           minus_qnan, "+qnan * -qnan != -qnan                     " ),
311
    (      minus_qnan,       plus_qnan,           minus_qnan, "-qnan * +qnan != -qnan                     " ),
312
    (      minus_qnan,      minus_qnan,            plus_qnan, "-qnan * -qnan != +qnan                     " ),
313
 
314
    ----------------------------------------------------------------------------
315
    -- qnan * snan
316
    ----------------------------------------------------------------------------
317
    (       plus_qnan,       plus_snan,            plus_qnan, "+qnan * +snan != +qnan                     " ),
318
    (       plus_qnan,      minus_snan,           minus_qnan, "+qnan * -snan != -qnan                     " ),
319
    (      minus_qnan,       plus_snan,           minus_qnan, "-qnan * +snan != -qnan                     " ),
320
    (      minus_qnan,      minus_snan,            plus_qnan, "-qnan * -snan != +qnan                     " ),
321
 
322
    ----------------------------------------------------------------------------
323
    -- snan * qnan
324
    ----------------------------------------------------------------------------
325
    (       plus_snan,       plus_qnan,            plus_qnan, "+snan * +qnan != +qnan                     " ),
326
    (       plus_snan,      minus_qnan,           minus_qnan, "+snan * -qnan != -qnan                     " ),
327
    (      minus_snan,       plus_qnan,           minus_qnan, "-snan * +qnan != -qnan                     " ),
328
    (      minus_snan,      minus_qnan,            plus_qnan, "-snan * -qnan != +qnan                     " ),
329
 
330
    ----------------------------------------------------------------------------
331
    -- snan * snan
332
    ----------------------------------------------------------------------------
333
    (       plus_snan,       plus_snan,            plus_qnan, "+snan * +snan != +qnan                     " ),
334
    (       plus_snan,      minus_snan,           minus_qnan, "+snan * -snan != -qnan                     " ),
335
    (      minus_snan,       plus_snan,           minus_qnan, "-snan * +snan != -qnan                     " ),
336
    (      minus_snan,      minus_snan,            plus_qnan, "-snan * -snan != +qnan                     " )
337
  );
338
 
339
  constant pipeline_testset:test_condition_array_type:=
340
  (
341
    (     x"2923be84",     x"e16cd6ae",          x"cb177cf2", " 3.63585e-14 * -2.73056e+20 != -9.92792e+06" ),
342
    (     x"529049f1",     x"f1bbe9eb",          x"ff800000", " 3.09858e+11 * -1.86101e+30 !=    -infinite" ),
343
    (     x"b3a6db3c",     x"870c3e99",          x"000016da", "-7.76986e-08 * -1.05508e-34 !=   +subnormal" ),
344
    (     x"245e0d1c",     x"06b747de",          x"00000000", " 4.81497e-17 *  6.89425e-35 !=        +zero" ),
345
    (     x"b3124dc8",     x"43bb8ba6",          x"b7565d40", "-3.40640e-08 *  3.75091e+02 != -1.27771e-05" ),
346
    (     x"1f035a7d",     x"0938251f",          x"00000000", " 2.78152e-20 *  2.21656e-33 !=        +zero" ),
347
    (     x"5dd4cbfc",     x"96f5453b",          x"b54be0c4", " 1.91670e+18 * -3.96256e-25 != -7.59505e-07" ),
348
    (     x"130d890a",     x"1cdbae32",          x"00000000", " 1.78643e-27 *  1.45372e-21 !=        +zero" ),
349
    (     x"209a50ee",     x"407836fd",          x"21959f8c", " 2.61422e-19 *  3.87836e+00 !=  1.01389e-18" ),
350
    (     x"124932f6",     x"9e7d49dc",          x"80000000", " 6.34872e-28 * -1.34090e-20 !=        -zero" ),
351
    (     x"ad4f14f2",     x"444066d0",          x"b21ba2e0", "-1.17712e-11 *  7.69606e+02 != -9.05922e-09" ),
352
    (     x"6bc430b7",     x"323ba122",          x"5e8fcb12", " 4.74359e+26 *  1.09215e-08 !=  5.18070e+18" ),
353
    (     x"f622919d",     x"e18b1fda",          x"7f800000", "-8.24322e+32 * -3.20799e+20 !=    +infinite" ),
354
    (     x"b0ca9902",     x"b9729d49",          x"2ac0011d", "-1.47409e-09 * -2.31375e-04 !=  3.41068e-13" ),
355
    (     x"2c807ec5",     x"99d5e980",          x"86d6bd5b", " 3.65205e-12 * -2.21180e-23 != -8.07761e-35" ),
356
    (     x"b2eac9cc",     x"53bf67d6",          x"c72f8bcb", "-2.73330e-08 *  1.64416e+12 != -4.49398e+04" ),
357
    (     x"bf14d67e",     x"2ddc8e66",          x"ad803b1f", "-5.81398e-01 *  2.50743e-11 != -1.45782e-11" ),
358
    (     x"83ef5749",     x"61ff698f",          x"a66ecaa2", "-1.40672e-36 *  5.88941e+20 != -8.28475e-16" ),
359
    (     x"61cdd11e",     x"9d9c1672",          x"bffafaf4", " 4.74581e+20 * -4.13161e-21 != -1.96078e+00" ),
360
    (     x"72e61df0",     x"844f4a77",          x"b7ba5525", " 9.11587e+30 * -2.43669e-36 != -2.22126e-05" ),
361
    (     x"02d7e839",     x"2c53cbc9",          x"00000000", " 3.17247e-37 *  3.00980e-12 !=        +zero" ),
362
    (     x"121e3374",     x"9e0cf4d5",          x"80000000", " 4.99194e-28 * -7.46217e-21 !=        -zero" ),
363
    (     x"d49fd4a4",     x"597e35cf",          x"ee9eb693", "-5.49174e+12 *  4.47211e+15 != -2.45597e+28" ),
364
    (     x"3222f4cc",     x"cfd3902d",          x"c286ab8a", " 9.48530e-09 * -7.09888e+09 != -6.73350e+01" ),
365
    (     x"48d38f75",     x"e6d91d2a",          x"f0336cb4", " 4.33276e+05 * -5.12646e+23 != -2.22117e+29" ),
366
    (     x"e5c0f72b",     x"78818744",          x"ff800000", "-1.13907e+23 *  2.10172e+34 !=    -infinite" ),
367
    (     x"0e5f5000",     x"d4618dbe",          x"a344c0f5", " 2.75254e-30 * -3.87498e+12 != -1.06660e-17" ),
368
    (     x"7b051507",     x"3b33821f",          x"76baa2b1", " 6.91002e+35 *  2.73908e-03 !=  1.89271e+33" ),
369
    (     x"187092da",     x"6454ceb1",          x"3d47fbd9", " 3.10934e-24 *  1.57024e+22 !=  4.88242e-02" ),
370
    (     x"853e6915",     x"f8466a04",          x"3e139421", "-8.95306e-36 * -1.60973e+34 !=  1.44120e-01" ),
371
    (     x"96730ed9",     x"162f6768",          x"80000000", "-1.96341e-25 *  1.41690e-25 !=        -zero" ),
372
    (     x"d4f74a4a",     x"d0576876",          x"65d0144c", "-8.49683e+12 * -1.44558e+10 !=  1.22828e+23" ),
373
    (     x"fa16bb11",     x"adae2488",          x"684d1150", "-1.95660e+35 * -1.97977e-11 !=  3.87362e+24" ),
374
    (     x"79fe52db",     x"2543e53c",          x"5fc29cd9", " 1.65065e+35 *  1.69912e-16 !=  2.80466e+19" ),
375
    (     x"f445d3d8",     x"28ce0bf5",          x"dd9f39b5", "-6.26940e+31 *  2.28758e-14 != -1.43418e+18" ),
376
    (     x"c560593d",     x"97278a59",          x"1d12d375", "-3.58958e+03 * -5.41352e-25 !=  1.94323e-21" ),
377
    (     x"762dd0c2",     x"c9cd68d4",          x"ff800000", " 8.81349e+32 * -1.68271e+06 !=    -infinite" ),
378
    (     x"496a7925",     x"08614014",          x"124e4f2a", " 9.60402e+05 *  6.77838e-34 !=  6.50997e-28" ),
379
    (     x"b13b6aa5",     x"1128c18c",          x"82f7175c", "-2.72727e-09 *  1.33125e-28 != -3.63068e-37" ),
380
    (     x"d6a90b87",     x"978c2ff1",          x"2eb923ec", "-9.29335e+13 * -9.05939e-25 !=  8.41921e-11" ),
381
    (     x"151d9a95",     x"c19be1c0",          x"973fef27", " 3.18278e-26 * -1.94852e+01 != -6.20173e-25" ),
382
    (     x"7ee9a89a",     x"a786c2b5",          x"e6f5ffef", " 1.55293e+38 * -3.74036e-15 != -5.80850e+23" ),
383
    (     x"54bf9ae7",     x"d923d155",          x"ee75389c", " 6.58350e+12 * -2.88191e+15 != -1.89731e+28" ),
384
    (     x"903828d1",     x"d96ca166",          x"2a2a39bc", "-3.63190e-29 * -4.16285e+15 !=  1.51191e-13" ),
385
    (     x"5e4ee130",     x"9cfed971",          x"bbcdf326", " 3.72681e+18 * -1.68645e-21 != -6.28509e-03" ),
386
    (     x"9fe2a5e2",     x"0c9bb447",          x"80000000", "-9.59892e-20 *  2.39900e-31 !=        -zero" ),
387
    (     x"65382a46",     x"89a98279",          x"af73e389", " 5.43560e+22 * -4.08080e-33 != -2.21816e-10" ),
388
    (     x"7a7678c2",     x"63b126df",          x"7f800000", " 3.19939e+35 *  6.53575e+21 !=    +infinite" ),
389
    (     x"da296d3e",     x"62e09612",          x"fd94a2e8", "-1.19223e+16 *  2.07144e+21 != -2.46965e+37" ),
390
    (     x"34bf39a6",     x"3f895ef1",          x"34cd398a", " 3.56185e-07 *  1.07321e+00 !=  3.82261e-07" ),
391
    (     x"6d0ee36c",     x"28a11e20",          x"5633dbaf", " 2.76386e+27 *  1.78877e-14 !=  4.94390e+13" ),
392
    (     x"1dcbc203",     x"3f410784",          x"1d99a340", " 5.39343e-21 *  7.54021e-01 !=  4.06676e-21" ),
393
    (     x"0f140565",     x"1b2861c9",          x"00000000", " 7.29800e-30 *  1.39282e-22 !=        +zero" ),
394
    (     x"c5e72c8e",     x"463608dc",          x"cca461ad", "-7.39757e+03 *  1.16502e+04 != -8.61833e+07" ),
395
    (     x"f3a88dfe",     x"bef2eb71",          x"731ff13f", "-2.67086e+31 * -4.74453e-01 !=  1.26719e+31" ),
396
    (     x"ffa0d03b",     x"75068c7e",          x"ffe0d03b", "       -qnan *  1.70561e+32 !=        -snan" ),
397
    (     x"8778734d",     x"d0be82be",          x"18b8e476", "-1.86913e-34 * -2.55699e+10 !=  4.77936e-24" ),
398
    (     x"dbc24641",     x"2b8cfa30",          x"c7d5f891", "-1.09367e+17 *  1.00170e-12 != -1.09553e+05" ),
399
    (     x"7f70f0a7",     x"54863295",          x"7f800000", " 3.20264e+38 *  4.61099e+12 !=    +infinite" ),
400
    (     x"aa5b6813",     x"0be6fcf5",          x"8000000c", "-1.94872e-13 *  8.89734e-32 !=   -subnormal" ),
401
    (     x"cabe7d9f",     x"898a411b",          x"14cdc053", "-6.24200e+06 * -3.32835e-33 !=  2.07756e-26" ),
402
    (     x"fdb84f68",     x"f6727b14",          x"7f800000", "-3.06238e+37 * -1.22952e+33 !=    +infinite" ),
403
    (     x"99cdd30d",     x"f0443ab4",          x"4a9dc4c8", "-2.12817e-23 * -2.42920e+29 !=  5.16976e+06" ),
404
    (     x"a6665333",     x"0bcba110",          x"80000000", "-7.99100e-16 *  7.84351e-32 !=        -zero" )
405
  );
406 6 aloy.amber
begin
407
 
408
        dut:fpmult port map(clk,d,q);
409
 
410
        clock:process
411
        begin
412 8 aloy.amber
           wait for (clock_period/2);
413
           clk<=not clk;
414 6 aloy.amber
        end process clock;
415
 
416
        stimulus:process
417 8 aloy.amber
         variable test_condition:test_condition_type;
418 6 aloy.amber
        begin
419 8 aloy.amber
          -----------------------------------------------------------------------------
420
          -- Check qualifying functions and constants
421
          -----------------------------------------------------------------------------
422
    assert not fp_is_normal(plus_zero)                report "Bad +0" severity error;
423
    assert     fp_is_zero(plus_zero)                  report "Bad +0" severity error;
424
    assert not fp_is_subnormal(plus_zero)             report "Bad +0" severity error;
425
    assert not fp_is_infinite(plus_zero)              report "Bad +0" severity error;
426
    assert not fp_is_nan(plus_zero)                   report "Bad +0" severity error;
427
    assert not fp_is_signalling(plus_zero)            report "Bad +0" severity error;
428
    assert not fp_is_quiet(plus_zero)                 report "Bad +0" severity error;
429
    assert     fp_is_positive(plus_zero)              report "Bad +0" severity error;
430
    assert not fp_is_negative(plus_zero)              report "Bad +0" severity error;
431
 
432
    assert not fp_is_normal(minus_zero)               report "Bad -0" severity error;
433
    assert     fp_is_zero(minus_zero)                 report "Bad -0" severity error;
434
    assert not fp_is_subnormal(minus_zero)            report "Bad -0" severity error;
435
    assert not fp_is_infinite(minus_zero)             report "Bad -0" severity error;
436
    assert not fp_is_nan(minus_zero)                  report "Bad -0" severity error;
437
    assert not fp_is_signalling(minus_zero)           report "Bad -0" severity error;
438
    assert not fp_is_quiet(minus_zero)                report "Bad -0" severity error;
439
    assert not fp_is_positive(minus_zero)             report "Bad -0" severity error;
440
    assert     fp_is_negative(minus_zero)             report "Bad -0" severity error;
441
 
442
    assert     fp_is_normal(plus_normal)              report "Bad +normal" severity error;
443
    assert not fp_is_zero(plus_normal)                report "Bad +normal" severity error;
444
    assert not fp_is_subnormal(plus_normal)           report "Bad +normal" severity error;
445
    assert not fp_is_infinite(plus_normal)            report "Bad +normal" severity error;
446
    assert not fp_is_nan(plus_normal)                 report "Bad +normal" severity error;
447
    assert not fp_is_signalling(plus_normal)          report "Bad +normal" severity error;
448
    assert not fp_is_quiet(plus_normal)               report "Bad +normal" severity error;
449
    assert     fp_is_positive(plus_normal)            report "Bad +normal" severity error;
450
    assert not fp_is_negative(plus_normal)            report "Bad +normal" severity error;
451
 
452
    assert     fp_is_normal(minus_normal)             report "Bad -normal" severity error;
453
    assert not fp_is_zero(minus_normal)               report "Bad -normal" severity error;
454
    assert not fp_is_subnormal(minus_normal)          report "Bad -normal" severity error;
455
    assert not fp_is_infinite(minus_normal)           report "Bad -normal" severity error;
456
    assert not fp_is_nan(minus_normal)                report "Bad -normal" severity error;
457
    assert not fp_is_signalling(minus_normal)         report "Bad -normal" severity error;
458
    assert not fp_is_quiet(minus_normal)              report "Bad -normal" severity error;
459
    assert not fp_is_positive(minus_normal)           report "Bad -normal" severity error;
460
    assert     fp_is_negative(minus_normal)           report "Bad -normal" severity error;
461
 
462
    assert     fp_is_normal(plus_normal_squared)      report "Bad +normal^2" severity error;
463
    assert not fp_is_zero(plus_normal_squared)        report "Bad +normal^2" severity error;
464
    assert not fp_is_subnormal(plus_normal_squared)   report "Bad +normal^2" severity error;
465
    assert not fp_is_infinite(plus_normal_squared)    report "Bad +normal^2" severity error;
466
    assert not fp_is_nan(plus_normal_squared)         report "Bad +normal^2" severity error;
467
    assert not fp_is_signalling(plus_normal_squared)  report "Bad +normal^2" severity error;
468
    assert not fp_is_quiet(plus_normal_squared)       report "Bad +normal^2" severity error;
469
    assert     fp_is_positive(plus_normal_squared)    report "Bad +normal^2" severity error;
470
    assert not fp_is_negative(plus_normal_squared)    report "Bad +normal^2" severity error;
471
 
472
    assert     fp_is_normal(minus_normal_squared)     report "Bad -normal^2" severity error;
473
    assert not fp_is_zero(minus_normal_squared)       report "Bad -normal^2" severity error;
474
    assert not fp_is_subnormal(minus_normal_squared)  report "Bad -normal^2" severity error;
475
    assert not fp_is_infinite(minus_normal_squared)   report "Bad -normal^2" severity error;
476
    assert not fp_is_nan(minus_normal_squared)        report "Bad -normal^2" severity error;
477
    assert not fp_is_signalling(minus_normal_squared) report "Bad -normal^2" severity error;
478
    assert not fp_is_quiet(minus_normal_squared)      report "Bad -normal^2" severity error;
479
    assert not fp_is_positive(minus_normal_squared)   report "Bad -normal^2" severity error;
480
    assert     fp_is_negative(minus_normal_squared)   report "Bad -normal^2" severity error;
481
 
482
    assert not fp_is_normal(plus_subnormal)           report "Bad +subnormal" severity error;
483
    assert not fp_is_zero(plus_subnormal)             report "Bad +subnormal" severity error;
484
    assert     fp_is_subnormal(plus_subnormal)        report "Bad +subnormal" severity error;
485
    assert not fp_is_infinite(plus_subnormal)         report "Bad +subnormal" severity error;
486
    assert not fp_is_nan(plus_subnormal)              report "Bad +subnormal" severity error;
487
    assert not fp_is_signalling(plus_subnormal)       report "Bad +subnormal" severity error;
488
    assert not fp_is_quiet(plus_subnormal)            report "Bad +subnormal" severity error;
489
    assert     fp_is_positive(plus_subnormal)         report "Bad +subnormal" severity error;
490
    assert not fp_is_negative(plus_subnormal)         report "Bad +subnormal" severity error;
491
 
492
    assert not fp_is_normal(minus_subnormal)          report "Bad -subnormal" severity error;
493
    assert not fp_is_zero(minus_subnormal)            report "Bad -subnormal" severity error;
494
    assert     fp_is_subnormal(minus_subnormal)       report "Bad -subnormal" severity error;
495
    assert not fp_is_infinite(minus_subnormal)        report "Bad -subnormal" severity error;
496
    assert not fp_is_nan(minus_subnormal)             report "Bad -subnormal" severity error;
497
    assert not fp_is_signalling(minus_subnormal)      report "Bad -subnormal" severity error;
498
    assert not fp_is_quiet(minus_subnormal)           report "Bad -subnormal" severity error;
499
    assert not fp_is_positive(minus_subnormal)        report "Bad -subnormal" severity error;
500
    assert     fp_is_negative(minus_subnormal)        report "Bad -subnormal" severity error;
501
 
502
    assert not fp_is_normal(plus_infinite)            report "Bad +infinite" severity error;
503
    assert not fp_is_zero(plus_infinite)              report "Bad +infinite" severity error;
504
    assert not fp_is_subnormal(plus_infinite)         report "Bad +infinite" severity error;
505
    assert     fp_is_infinite(plus_infinite)          report "Bad +infinite" severity error;
506
    assert not fp_is_nan(plus_infinite)               report "Bad +infinite" severity error;
507
    assert not fp_is_signalling(plus_infinite)        report "Bad +infinite" severity error;
508
    assert not fp_is_quiet(plus_infinite)             report "Bad +infinite" severity error;
509
    assert     fp_is_positive(plus_infinite)          report "Bad +infinite" severity error;
510
    assert not fp_is_negative(plus_infinite)          report "Bad +infinite" severity error;
511
 
512
    assert not fp_is_normal(minus_infinite)           report "Bad -infinite" severity error;
513
    assert not fp_is_zero(minus_infinite)             report "Bad -infinite" severity error;
514
    assert not fp_is_subnormal(minus_infinite)        report "Bad -infinite" severity error;
515
    assert     fp_is_infinite(minus_infinite)         report "Bad -infinite" severity error;
516
    assert not fp_is_nan(minus_infinite)              report "Bad -infinite" severity error;
517
    assert not fp_is_signalling(minus_infinite)       report "Bad -infinite" severity error;
518
    assert not fp_is_quiet(minus_infinite)            report "Bad -infinite" severity error;
519
    assert not fp_is_positive(minus_infinite)         report "Bad -infinite" severity error;
520
    assert     fp_is_negative(minus_infinite)         report "Bad -infinite" severity error;
521
 
522
    assert not fp_is_normal(plus_qnan)                report "Bad +qnan" severity error;
523
    assert not fp_is_zero(plus_qnan)                  report "Bad +qnan" severity error;
524
    assert not fp_is_subnormal(plus_qnan)             report "Bad +qnan" severity error;
525
    assert not fp_is_infinite(plus_qnan)              report "Bad +qnan" severity error;
526
    assert     fp_is_nan(plus_qnan)                   report "Bad +qnan" severity error;
527
    assert not fp_is_signalling(plus_qnan)            report "Bad +qnan" severity error;
528
    assert     fp_is_quiet(plus_qnan)                 report "Bad +qnan" severity error;
529
    assert     fp_is_positive(plus_qnan)              report "Bad +qnan" severity error;
530
    assert not fp_is_negative(plus_qnan)              report "Bad +qnan" severity error;
531
 
532
    assert not fp_is_normal(minus_qnan)               report "Bad -qnan" severity error;
533
    assert not fp_is_zero(minus_qnan)                 report "Bad -qnan" severity error;
534
    assert not fp_is_subnormal(minus_qnan)            report "Bad -qnan" severity error;
535
    assert not fp_is_infinite(minus_qnan)             report "Bad -qnan" severity error;
536
    assert     fp_is_nan(minus_qnan)                  report "Bad -qnan" severity error;
537
    assert not fp_is_signalling(minus_qnan)           report "Bad -qnan" severity error;
538
    assert     fp_is_quiet(minus_qnan)                report "Bad -qnan" severity error;
539
    assert not fp_is_positive(minus_qnan)             report "Bad -qnan" severity error;
540
    assert     fp_is_negative(minus_qnan)             report "Bad -qnan" severity error;
541
 
542
    assert not fp_is_normal(plus_snan)                report "Bad +snan" severity error;
543
    assert not fp_is_zero(plus_snan)                  report "Bad +snan" severity error;
544
    assert not fp_is_subnormal(plus_snan)             report "Bad +snan" severity error;
545
    assert not fp_is_infinite(plus_snan)              report "Bad +snan" severity error;
546
    assert     fp_is_nan(plus_snan)                   report "Bad +snan" severity error;
547
    assert     fp_is_signalling(plus_snan)            report "Bad +snan" severity error;
548
    assert not fp_is_quiet(plus_snan)                 report "Bad +snan" severity error;
549
    assert     fp_is_positive(plus_snan)              report "Bad +snan" severity error;
550
    assert not fp_is_negative(plus_snan)              report "Bad +snan" severity error;
551
 
552
    assert not fp_is_normal(minus_snan)               report "Bad -snan" severity error;
553
    assert not fp_is_zero(minus_snan)                 report "Bad -snan" severity error;
554
    assert not fp_is_subnormal(minus_snan)            report "Bad -snan" severity error;
555
    assert not fp_is_infinite(minus_snan)             report "Bad -snan" severity error;
556
    assert     fp_is_nan(minus_snan)                  report "Bad -snan" severity error;
557
    assert     fp_is_signalling(minus_snan)           report "Bad -snan" severity error;
558
    assert not fp_is_quiet(minus_snan)                report "Bad -snan" severity error;
559
    assert not fp_is_positive(minus_snan)             report "Bad -snan" severity error;
560
    assert     fp_is_negative(minus_snan)             report "Bad -snan" severity error;
561
 
562
          -----------------------------------------------------------------------------
563
          -- Check multiplier
564
          -----------------------------------------------------------------------------
565
    for i in multiplier_testset'range loop
566
      test_condition:=multiplier_testset(i);
567
      d.a<=test_condition.a;
568
      d.b<=test_condition.b;
569
      wait for pipeline_delay;
570
            assert q.p = test_condition.p report test_condition.msg severity error;
571
          end loop;
572
 
573
          -----------------------------------------------------------------------------
574
          -- Check pipeline
575
          -----------------------------------------------------------------------------
576
    for i in pipeline_testset'range loop
577
      test_condition:=pipeline_testset(i);
578
      d.a<=test_condition.a;
579
      d.b<=test_condition.b;
580
      wait for clock_period;
581
      if i>=number_of_stages then
582
        assert q.p = pipeline_testset(i-number_of_stages+1).p report pipeline_testset(i-number_of_stages+1).msg severity error;
583
      end if;
584
          end loop;
585
 
586
          d.a<="0"&"01111111"&"10110010100011101010101";  -- 0x3FD94755 -> +1.69748938083648681640625E0
587
          d.b<="0"&"01111111"&"01101110110110011100001";  -- 0x3FB76CE1 -> +1.43301022052764892578125E0
588
          --    0   01111111 100110111010111001100110110100101000110110110101
589
          --    0   10000000  100110111010111001100110110100101000110110110101
590
          --    0   10000000   00110111010111001100111       0x401bae67 -> +2.4325196743011474609375E0
591
          --    |-----||--||-----||--||--||--||--||--|
592
    wait for 20 ns;
593
 
594
          d.a<="1"&"10000000"&"10010010000111111011011";  -- 0xC0490FDB -> -3.1415927410125732421875E0
595
          d.b<="0"&"10000010"&"00001011110001011101010";  -- 0x4105E2EA -> +8.3678989410400390625E0
596
          --    1   10000011 011010010010011101110100100011101101010000101110
597
          --    1   10000011  11010010010011101110100100011101101010000101110
598
          --    1   10000011   10100100100111011101001       0xC1D24EE9 -> -2.62885303497314453125E1 
599
          --    |-----||--||-----||--||--||--||--||--|
600
    wait for 20 ns;
601
 
602
          d.a<="1"&"10000101"&"01110011100001000111010";  -- 0xC2B9C23A -> -9.28793487548828125E1
603
          d.b<="1"&"10000111"&"11010001001111000001110";  -- 0xC3E89E0E -> -4.6523480224609375E2
604
          --    0   10001101 101010001100101010110100100110000110101100101100
605
          --    0   10001110  101010001100101010110100100110000110101100101100
606
          --    0   10001110   01010001100101010110101       0x4728CAB5 -> +4.321070703125E4  
607
          --    |-----||--||-----||--||--||--||--||--|
608
    wait for 20 ns;
609
 
610
    wait for 1 us;
611 6 aloy.amber
        end process stimulus;
612
 
613
end testbench;
614
 

powered by: WebSVN 2.1.0

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