1 from random
import randint
2 from random
import seed
5 from sfpy
import Float16
11 return ((x
& 0xf800) >> 11) - 15
14 return ((x
& 0x8000) >> 15)
17 return get_exponent(x
) == 16 and get_mantissa(x
) != 0
20 return get_exponent(x
) == 16 and get_mantissa(x
) == 0
23 return is_inf(x
) and not get_sign(x
)
26 return is_inf(x
) and get_sign(x
)
30 (is_pos_inf(x
) and is_pos_inf(y
)) or
31 (is_neg_inf(x
) and is_neg_inf(y
)) or
32 (is_nan(x
) and is_nan(y
)) or
36 def get_case(dut
, a
, b
):
37 yield dut
.in_a
.v
.eq(a
)
38 yield dut
.in_a
.stb
.eq(1)
41 a_ack
= (yield dut
.in_a
.ack
)
43 yield dut
.in_b
.v
.eq(b
)
44 yield dut
.in_b
.stb
.eq(1)
45 b_ack
= (yield dut
.in_b
.ack
)
50 out_z_stb
= (yield dut
.out_z
.stb
)
53 yield dut
.in_a
.stb
.eq(0)
54 yield dut
.in_b
.stb
.eq(0)
55 yield dut
.out_z
.ack
.eq(1)
57 yield dut
.out_z
.ack
.eq(0)
62 out_z
= yield dut
.out_z
.v
65 def check_case(dut
, a
, b
, z
):
66 out_z
= yield from get_case(dut
, a
, b
)
67 assert out_z
== z
, "Output z 0x%x not equal to expected 0x%x" % (out_z
, z
)
70 def run_test(dut
, stimulus_a
, stimulus_b
, op
):
72 expected_responses
= []
74 for a
, b
in zip(stimulus_a
, stimulus_b
):
75 af
= Float16
.from_bits(a
)
76 bf
= Float16
.from_bits(b
)
78 expected_responses
.append(z
.get_bits())
80 actual
= yield from get_case(dut
, a
, b
)
81 actual_responses
.append(actual
)
83 if len(actual_responses
) < len(expected_responses
):
84 print ("Fail ... not enough results")
87 for expected
, actual
, a
, b
in zip(expected_responses
, actual_responses
,
88 stimulus_a
, stimulus_b
):
89 passed
= match(expected
, actual
)
93 print ("Fail ... expected:", hex(expected
), "actual:", hex(actual
))
96 print ("a mantissa:", get_mantissa(a
))
97 print ("a exponent:", get_exponent(a
))
98 print ("a sign:", get_sign(a
))
101 print ("b mantissa:", get_mantissa(b
))
102 print ("b exponent:", get_exponent(b
))
103 print ("b sign:", get_sign(b
))
105 print (hex(expected
))
106 print ("expected mantissa:", get_mantissa(expected
))
107 print ("expected exponent:", get_exponent(expected
))
108 print ("expected sign:", get_sign(expected
))
111 print ("actual mantissa:", get_mantissa(actual
))
112 print ("actual exponent:", get_exponent(actual
))
113 print ("actual sign:", get_sign(actual
))
117 def run_corner_cases(dut
, count
, op
):
119 corners
= [0x8000, 0x0000, 0x7800, 0xf800, 0x7c00, 0xfc00]
120 from itertools
import permutations
121 stimulus_a
= [i
[0] for i
in permutations(corners
, 2)]
122 stimulus_b
= [i
[1] for i
in permutations(corners
, 2)]
123 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
124 count
+= len(stimulus_a
)
125 print (count
, "vectors passed")
128 def run_edge_cases(dut
, count
, op
):
132 stimulus_a
= [0x8000 for i
in range(maxcount
)]
133 stimulus_b
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
134 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
135 count
+= len(stimulus_a
)
136 print (count
, "vectors passed")
138 stimulus_a
= [0x0000 for i
in range(maxcount
)]
139 stimulus_b
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
140 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
141 count
+= len(stimulus_a
)
142 print (count
, "vectors passed")
144 stimulus_b
= [0x8000 for i
in range(maxcount
)]
145 stimulus_a
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
146 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
147 count
+= len(stimulus_a
)
148 print (count
, "vectors passed")
150 stimulus_b
= [0x0000 for i
in range(maxcount
)]
151 stimulus_a
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
152 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
153 count
+= len(stimulus_a
)
154 print (count
, "vectors passed")
156 stimulus_a
= [0x7800 for i
in range(maxcount
)]
157 stimulus_b
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
158 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
159 count
+= len(stimulus_a
)
160 print (count
, "vectors passed")
162 stimulus_a
= [0xF800 for i
in range(maxcount
)]
163 stimulus_b
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
164 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
165 count
+= len(stimulus_a
)
166 print (count
, "vectors passed")
168 stimulus_b
= [0x7800 for i
in range(maxcount
)]
169 stimulus_a
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
170 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
171 count
+= len(stimulus_a
)
172 print (count
, "vectors passed")
174 stimulus_b
= [0xF800 for i
in range(maxcount
)]
175 stimulus_a
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
176 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
177 count
+= len(stimulus_a
)
178 print (count
, "vectors passed")
180 stimulus_a
= [0x7C00 for i
in range(maxcount
)]
181 stimulus_b
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
182 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
183 count
+= len(stimulus_a
)
184 print (count
, "vectors passed")
186 stimulus_a
= [0xFC00 for i
in range(maxcount
)]
187 stimulus_b
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
188 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
189 count
+= len(stimulus_a
)
190 print (count
, "vectors passed")
192 stimulus_b
= [0x7C00 for i
in range(maxcount
)]
193 stimulus_a
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
194 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
195 count
+= len(stimulus_a
)
196 print (count
, "vectors passed")
198 stimulus_b
= [0xFC00 for i
in range(maxcount
)]
199 stimulus_a
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
200 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
201 count
+= len(stimulus_a
)
202 print (count
, "vectors passed")
205 for i
in range(100000):
206 stimulus_a
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
207 stimulus_b
= [randint(0, maxint16
-1) for i
in range(maxcount
)]
208 yield from run_test(dut
, stimulus_a
, stimulus_b
, op
)
210 print (count
, "random vectors passed")