1 from random
import randint
2 from random
import seed
5 from sfpy
import Float32
13 return ((x
& 0x7f800000) >> 23) - 127
15 def set_exponent(x
, e
):
16 return (x
& ~
0x7f800000) |
((e
+127) << 23)
19 return ((x
& 0x80000000) >> 31)
22 return get_exponent(x
) == 128 and get_mantissa(x
) != 0
25 return get_exponent(x
) == 128 and get_mantissa(x
) == 0
28 return is_inf(x
) and not get_sign(x
)
31 return is_inf(x
) and get_sign(x
)
35 (is_pos_inf(x
) and is_pos_inf(y
)) or
36 (is_neg_inf(x
) and is_neg_inf(y
)) or
37 (is_nan(x
) and is_nan(y
)) or
42 return set_exponent((s
<<31) | m
, e
)
45 return create(s
, 128, 0)
48 return create(s
, 128, 1<<22)
54 def get_rs_case(dut
, a
, b
, mid
):
55 in_a
, in_b
= dut
.rs
[0]
57 yield dut
.ids
.in_mid
.eq(mid
)
59 yield in_a
.valid_i
.eq(1)
64 a_ack
= (yield in_a
.ready_o
)
67 yield in_a
.valid_i
.eq(0)
70 yield in_b
.valid_i
.eq(1)
73 b_ack
= (yield in_b
.ready_o
)
76 yield in_b
.valid_i
.eq(0)
78 yield out_z
.ready_i
.eq(1)
81 out_z_stb
= (yield out_z
.valid_o
)
85 vout_z
= yield out_z
.v
86 #out_mid = yield dut.ids.out_mid
87 yield out_z
.ready_i
.eq(0)
93 def check_rs_case(dut
, a
, b
, z
, mid
=None):
97 out_z
, out_mid
= yield from get_rs_case(dut
, a
, b
, mid
)
98 assert out_z
== z
, "Output z 0x%x not equal to expected 0x%x" % (out_z
, z
)
99 assert out_mid
== mid
, "Output mid 0x%x != expected 0x%x" % (out_mid
, mid
)
102 def get_case(dut
, a
, b
, mid
):
103 #yield dut.in_mid.eq(mid)
104 yield dut
.in_a
.v
.eq(a
)
105 yield dut
.in_a
.valid_i_test
.eq(1)
110 a_ack
= (yield dut
.in_a
.ready_o
)
113 yield dut
.in_a
.valid_i
.eq(0)
115 yield dut
.in_b
.v
.eq(b
)
116 yield dut
.in_b
.valid_i
.eq(1)
119 b_ack
= (yield dut
.in_b
.ready_o
)
122 yield dut
.in_b
.valid_i
.eq(0)
124 yield dut
.out_z
.ready_i
.eq(1)
127 out_z_stb
= (yield dut
.out_z
.valid_o
)
131 out_z
= yield dut
.out_z
.v
132 #out_mid = yield dut.out_mid
133 yield dut
.out_z
.ready_i
.eq(0)
137 return out_z
, mid
# TODO: mid
139 def check_case(dut
, a
, b
, z
, mid
=None):
143 out_z
, out_mid
= yield from get_case(dut
, a
, b
, mid
)
144 assert out_z
== z
, "Output z 0x%x not equal to expected 0x%x" % (out_z
, z
)
145 assert out_mid
== mid
, "Output mid 0x%x != expected 0x%x" % (out_mid
, mid
)
148 def run_fpunit(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
):
150 expected_responses
= []
151 actual_responses
= []
152 for a
, b
in zip(stimulus_a
, stimulus_b
):
155 af
= Float32
.from_bits(a
)
156 bf
= Float32
.from_bits(b
)
158 expected_responses
.append((z
.get_bits(), mid
))
159 actual
= yield from get_case_fn(dut
, a
, b
, mid
)
160 actual_responses
.append(actual
)
162 if len(actual_responses
) < len(expected_responses
):
163 print ("Fail ... not enough results")
166 for expected
, actual
, a
, b
in zip(expected_responses
, actual_responses
,
167 stimulus_a
, stimulus_b
):
168 passed
= match(expected
[0], actual
[0])
169 if expected
[1] != actual
[1]: # check mid
170 print ("MID failed", expected
[1], actual
[1])
175 expected
= expected
[0]
177 print ("Fail ... expected:", hex(expected
), "actual:", hex(actual
))
180 print ("a mantissa:", a
& 0x7fffff)
181 print ("a exponent:", ((a
& 0x7f800000) >> 23) - 127)
182 print ("a sign:", ((a
& 0x80000000) >> 31))
185 print ("b mantissa:", b
& 0x7fffff)
186 print ("b exponent:", ((b
& 0x7f800000) >> 23) - 127)
187 print ("b sign:", ((b
& 0x80000000) >> 31))
189 print (hex(expected
))
190 print ("expected mantissa:", expected
& 0x7fffff)
191 print ("expected exponent:", ((expected
& 0x7f800000) >> 23) - 127)
192 print ("expected sign:", ((expected
& 0x80000000) >> 31))
195 print ("actual mantissa:", actual
& 0x7fffff)
196 print ("actual exponent:", ((actual
& 0x7f800000) >> 23) - 127)
197 print ("actual sign:", ((actual
& 0x80000000) >> 31))
201 corner_cases
= [0x80000000, 0x00000000, 0x7f800000, 0xff800000,
202 0x7fc00000, 0xffc00000]
204 def run_corner_cases(dut
, count
, op
, get_case_fn
):
206 from itertools
import permutations
207 stimulus_a
= [i
[0] for i
in permutations(corner_cases
, 2)]
208 stimulus_b
= [i
[1] for i
in permutations(corner_cases
, 2)]
209 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
)
210 count
+= len(stimulus_a
)
211 print (count
, "vectors passed")
213 def run_fpunit_2(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
):
214 yield from run_fpunit(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
)
215 yield from run_fpunit(dut
, stimulus_b
, stimulus_a
, op
, get_case_fn
)
217 def run_cases(dut
, count
, op
, fixed_num
, maxcount
, get_case_fn
):
218 if isinstance(fixed_num
, int):
219 stimulus_a
= [fixed_num
for i
in range(maxcount
)]
220 report
= hex(fixed_num
)
222 stimulus_a
= fixed_num
225 stimulus_b
= [randint(0, 1<<32) for i
in range(maxcount
)]
226 yield from run_fpunit_2(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
)
227 count
+= len(stimulus_a
)
228 print (count
, "vectors passed 2^32", report
)
230 # non-canonical NaNs.
231 stimulus_b
= [set_exponent(randint(0, 1<<32), 128) \
232 for i
in range(maxcount
)]
233 yield from run_fpunit_2(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
)
234 count
+= len(stimulus_a
)
235 print (count
, "vectors passed Non-Canonical NaN", report
)
238 stimulus_b
= [set_exponent(randint(0, 1<<32), -127) \
239 for i
in range(maxcount
)]
240 yield from run_fpunit_2(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
)
241 count
+= len(stimulus_a
)
242 print (count
, "vectors passed exp=-127", report
)
245 stimulus_b
= [set_exponent(randint(0, 1<<32), -126) \
246 for i
in range(maxcount
)]
247 yield from run_fpunit_2(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
)
248 count
+= len(stimulus_a
)
249 print (count
, "vectors passed exp=-126", report
)
252 stimulus_b
= [set_exponent(randint(0, 1<<32), 127) \
253 for i
in range(maxcount
)]
254 yield from run_fpunit_2(dut
, stimulus_a
, stimulus_b
, op
, get_case_fn
)
255 count
+= len(stimulus_a
)
256 print (count
, "vectors passed exp=127", report
)
260 def run_edge_cases(dut
, count
, op
, get_case_fn
, maxcount
=10, num_loops
=1000):
262 for testme
in corner_cases
:
263 count
= yield from run_cases(dut
, count
, op
, testme
,
264 maxcount
, get_case_fn
)
266 for i
in range(num_loops
):
267 stimulus_a
= [randint(0, 1<<32) for i
in range(maxcount
)]
268 count
= yield from run_cases(dut
, count
, op
, stimulus_a
, 10,