add div unit tests
[ieee754fpu.git] / src / add / test_div.py
1 import sys
2 from random import randint
3 from random import seed
4
5 from nmigen import Module, Signal
6 from nmigen.compat.sim import run_simulation
7
8 from nmigen_div_experiment import FPDIV
9
10 from unit_test_single import (get_mantissa, get_exponent, get_sign, is_nan,
11 is_inf, is_pos_inf, is_neg_inf,
12 match, get_case, check_case, run_test)
13
14
15 def testbench(dut):
16 yield from check_case(dut, 0x40000000, 0x3F800000, 0x40000000)
17 yield from check_case(dut, 0x3F800000, 0x40000000, 0x3F000000)
18 yield from check_case(dut, 0x3F800000, 0x40400000, 0x3EAAAAAB)
19 yield from check_case(dut, 0x40400000, 0x41F80000, 0x3DC6318C)
20 yield from check_case(dut, 0x41F9EB4D, 0x429A4C70, 0x3ECF52B2)
21 yield from check_case(dut, 0x7F7FFFFE, 0x70033181, 0x4EF9C4C8)
22 yield from check_case(dut, 0x7F7FFFFE, 0x70000001, 0x4EFFFFFC)
23 yield from check_case(dut, 0x7F7FFCFF, 0x70200201, 0x4ECCC7D5)
24 yield from check_case(dut, 0x70200201, 0x7F7FFCFF, 0x302003E2)
25
26 count = 0
27
28 #regression tests
29 stimulus_a = [0xbf9b1e94, 0x34082401, 0x5e8ef81, 0x5c75da81, 0x2b017]
30 stimulus_b = [0xc038ed3a, 0xb328cd45, 0x114f3db, 0x2f642a39, 0xff3807ab]
31 yield from run_test(dut, stimulus_a, stimulus_b)
32 count += len(stimulus_a)
33 print (count, "vectors passed")
34
35 #corner cases
36 from itertools import permutations
37 stimulus_a = [i[0] for i in permutations([0x80000000, 0x00000000, 0x7f800000, 0xff800000, 0x7fc00000, 0xffc00000], 2)]
38 stimulus_b = [i[1] for i in permutations([0x80000000, 0x00000000, 0x7f800000, 0xff800000, 0x7fc00000, 0xffc00000], 2)]
39 yield from run_test(dut, stimulus_a, stimulus_b)
40 count += len(stimulus_a)
41 print (count, "vectors passed")
42
43 #edge cases
44 stimulus_a = [0x80000000 for i in xrange(1000)]
45 stimulus_b = [randint(0, 1<<32) for i in xrange(1000)]
46 yield from run_test(dut, stimulus_a, stimulus_b)
47 count += len(stimulus_a)
48 print (count, "vectors passed")
49
50 stimulus_a = [0x00000000 for i in xrange(1000)]
51 stimulus_b = [randint(0, 1<<32) for i in xrange(1000)]
52 yield from run_test(dut, stimulus_a, stimulus_b)
53 count += len(stimulus_a)
54 print (count, "vectors passed")
55
56 stimulus_b = [0x80000000 for i in xrange(1000)]
57 stimulus_a = [randint(0, 1<<32) for i in xrange(1000)]
58 yield from run_test(dut, stimulus_a, stimulus_b)
59 count += len(stimulus_a)
60 print (count, "vectors passed")
61
62 stimulus_b = [0x00000000 for i in xrange(1000)]
63 stimulus_a = [randint(0, 1<<32) for i in xrange(1000)]
64 yield from run_test(dut, stimulus_a, stimulus_b)
65 count += len(stimulus_a)
66 print (count, "vectors passed")
67
68 stimulus_a = [0x7F800000 for i in xrange(1000)]
69 stimulus_b = [randint(0, 1<<32) for i in xrange(1000)]
70 yield from run_test(dut, stimulus_a, stimulus_b)
71 count += len(stimulus_a)
72 print (count, "vectors passed")
73
74 stimulus_a = [0xFF800000 for i in xrange(1000)]
75 stimulus_b = [randint(0, 1<<32) for i in xrange(1000)]
76 yield from run_test(dut, stimulus_a, stimulus_b)
77 count += len(stimulus_a)
78 print (count, "vectors passed")
79
80 stimulus_b = [0x7F800000 for i in xrange(1000)]
81 stimulus_a = [randint(0, 1<<32) for i in xrange(1000)]
82 yield from run_test(dut, stimulus_a, stimulus_b)
83 count += len(stimulus_a)
84 print (count, "vectors passed")
85
86 stimulus_b = [0xFF800000 for i in xrange(1000)]
87 stimulus_a = [randint(0, 1<<32) for i in xrange(1000)]
88 yield from run_test(dut, stimulus_a, stimulus_b)
89 count += len(stimulus_a)
90 print (count, "vectors passed")
91
92 stimulus_a = [0x7FC00000 for i in xrange(1000)]
93 stimulus_b = [randint(0, 1<<32) for i in xrange(1000)]
94 yield from run_test(dut, stimulus_a, stimulus_b)
95 count += len(stimulus_a)
96 print (count, "vectors passed")
97
98 stimulus_a = [0xFFC00000 for i in xrange(1000)]
99 stimulus_b = [randint(0, 1<<32) for i in xrange(1000)]
100 yield from run_test(dut, stimulus_a, stimulus_b)
101 count += len(stimulus_a)
102 print (count, "vectors passed")
103
104 stimulus_b = [0x7FC00000 for i in xrange(1000)]
105 stimulus_a = [randint(0, 1<<32) for i in xrange(1000)]
106 yield from run_test(dut, stimulus_a, stimulus_b)
107 count += len(stimulus_a)
108 print (count, "vectors passed")
109
110 stimulus_b = [0xFFC00000 for i in xrange(1000)]
111 stimulus_a = [randint(0, 1<<32) for i in xrange(1000)]
112 yield from run_test(dut, stimulus_a, stimulus_b)
113 count += len(stimulus_a)
114 print (count, "vectors passed")
115
116 #seed(0)
117 for i in xrange(100000):
118 stimulus_a = [randint(0, 1<<32) for i in xrange(1000)]
119 stimulus_b = [randint(0, 1<<32) for i in xrange(1000)]
120 yield from run_test(dut, stimulus_a, stimulus_b)
121 count += 1000
122 print (count, "random vectors passed")
123
124
125 if __name__ == '__main__':
126 dut = FPDIV(width=32)
127 run_simulation(dut, testbench(dut), vcd_name="test_div.vcd")
128