1 from random
import randint
2 from nmigen
import Module
, Signal
3 from nmigen
.compat
.sim
import run_simulation
5 from fpbase
import FPNum
7 class FPNumModShiftMulti
:
8 def __init__(self
, width
):
10 self
.ediff
= Signal((self
.a
.e_width
, True))
12 def get_fragment(self
, platform
=None):
15 #m.d.sync += self.a.decode(self.a.v)
16 m
.d
.sync
+= self
.a
.shift_down_multi(self
.ediff
)
20 def check_case(dut
, width
, e_width
, m
, e
, i
):
31 print (e
, bin(m
), out_e
, calc_e
, bin(out_m
), i
, ed
)
33 calc_m
= ((m
>> (i
+1)) << 1) |
(m
& 1)
38 assert out_e
== calc_e
, "Output e 0x%x != expected 0x%x" % (out_e
, calc_e
)
39 assert out_m
== calc_m
, "Output m 0x%x != expected 0x%x" % (out_m
, calc_m
)
42 m_width
= dut
.a
.m_width
43 e_width
= dut
.a
.e_width
46 m
= randint(0, (1<<m_width
)-1)
47 zeros
= randint(0, 31)
48 for i
in range(zeros
):
50 e
= randint(-e_max
, e_max
)
52 yield from check_case(dut
, m_width
, e_width
, m
, e
, i
)
54 if __name__
== '__main__':
55 dut
= FPNumModShiftMulti(width
=32)
56 run_simulation(dut
, testbench(dut
), vcd_name
="test_multishift.vcd")
58 #dut = MultiShiftModL(width=32)
59 #run_simulation(dut, testbench(dut), vcd_name="test_multishift.vcd")