1 # Proof of correctness for partitioned scalar shifter
2 # Copyright (C) 2020 Michael Nolan <mtnolan2640@gmail.com>
4 from nmigen
import Module
, Signal
, Elaboratable
, Mux
, Cat
5 from nmigen
.asserts
import Assert
, AnyConst
, Assume
6 from nmigen
.test
.utils
import FHDLTestCase
7 from nmigen
.cli
import rtlil
9 from ieee754
.part_mul_add
.partpoints
import PartitionPoints
10 from ieee754
.part_shift
.part_shift_scalar
import PartitionedScalarShift
14 # This defines a module to drive the device under test and assert
15 # properties about its outputs
16 class ShifterDriver(Elaboratable
):
21 def get_intervals(self
, signal
, points
):
24 keys
= list(points
.keys()) + [signal
.width
]
27 interval
.append(signal
[start
:end
])
31 def elaborate(self
, platform
):
38 # setup the inputs and outputs of the DUT as anyconst
41 shifter
= Signal(shifterwidth
)
42 points
= PartitionPoints()
43 gates
= Signal(mwidth
-1)
44 step
= int(width
/mwidth
)
45 for i
in range(mwidth
-1):
46 points
[(i
+1)*step
] = gates
[i
]
49 comb
+= [data
.eq(AnyConst(width
)),
50 shifter
.eq(AnyConst(shifterwidth
)),
51 gates
.eq(AnyConst(mwidth
-1))]
53 m
.submodules
.dut
= dut
= PartitionedScalarShift(width
, points
)
55 data_intervals
= self
.get_intervals(data
, points
)
56 out_intervals
= self
.get_intervals(out
, points
)
58 comb
+= [dut
.data
.eq(data
),
59 dut
.shifter
.eq(shifter
),
62 expected
= Signal(width
)
63 comb
+= expected
.eq(data
<< shifter
)
65 with m
.Switch(points
.as_sig()):
67 comb
+= Assert(out
[0:24] == (data
[0:24] << shifter
) & 0xffffff)
70 comb
+= Assert(out
[0:8] == expected
[0:8])
71 comb
+= Assert(out
[8:24] == (data
[8:24] << shifter
) & 0xffff)
74 comb
+= Assert(out
[16:24] == (data
[16:24] << shifter
) & 0xff)
75 comb
+= Assert(out
[0:16] == (data
[0:16] << shifter
) & 0xffff)
78 comb
+= Assert(out
[0:8] == expected
[0:8])
79 comb
+= Assert(out
[8:16] == (data
[8:16] << shifter
) & 0xff)
80 comb
+= Assert(out
[16:24] == (data
[16:24] << shifter
) & 0xff)
83 class PartitionedScalarShiftTestCase(FHDLTestCase
):
85 module
= ShifterDriver()
86 self
.assertFormal(module
, mode
="bmc", depth
=4)
88 if __name__
== "__main__":