1 from nmigen
.compat
.sim
import run_simulation
2 from nmigen
.cli
import verilog
, rtlil
3 from nmigen
import Module
, Signal
, Cat
, Elaboratable
4 from nmutil
.latch
import SRLatch
7 class ShadowFn(Elaboratable
):
8 """ implements shadowing 11.5.1, p55, just the individual shadow function
10 def __init__(self
, syncreset
=False):
12 self
.syncreset
= syncreset
15 self
.issue_i
= Signal(reset_less
=True)
16 self
.shadow_i
= Signal(reset_less
=True)
17 self
.reset_i
= Signal(reset_less
=True)
18 self
.s_fail_i
= Signal(reset_less
=True)
19 self
.s_good_i
= Signal(reset_less
=True)
22 self
.shadow_o
= Signal(reset_less
=True)
23 self
.recover_o
= Signal(reset_less
=True)
25 def elaborate(self
, platform
):
27 m
.submodules
.sl
= sl
= SRLatch(sync
=False)
31 m
.d
.comb
+= reset_r
.eq(self
.s_good_i | self
.s_fail_i | self
.reset_i
)
33 m
.d
.comb
+= reset_r
.eq(self
.s_good_i | self
.s_fail_i | self
.reset_i
)
35 m
.d
.comb
+= sl
.s
.eq(self
.shadow_i
& self
.issue_i
& \
36 ~self
.s_good_i
& ~reset_r
)
37 m
.d
.comb
+= sl
.r
.eq(self
.reset_i | reset_r | self
.s_good_i | \
38 (self
.issue_i
& ~self
.shadow_i
))
39 m
.d
.comb
+= self
.recover_o
.eq(sl
.qlq
& self
.s_fail_i
)
40 m
.d
.comb
+= self
.shadow_o
.eq(sl
.qlq
)
57 def shadow_fn_unit_sim(dut
):
58 yield dut
.dest_i
.eq(1)
59 yield dut
.issue_i
.eq(1)
61 yield dut
.issue_i
.eq(0)
63 yield dut
.src1_i
.eq(1)
64 yield dut
.issue_i
.eq(1)
68 yield dut
.issue_i
.eq(0)
70 yield dut
.go_rd_i
.eq(1)
72 yield dut
.go_rd_i
.eq(0)
74 yield dut
.go_wr_i
.eq(1)
76 yield dut
.go_wr_i
.eq(0)
80 def test_shadow_fn_unit():
82 vl
= rtlil
.convert(dut
, ports
=dut
.ports())
83 with
open("test_shadow_fn_unit.il", "w") as f
:
86 run_simulation(dut
, shadow_fn_unit_sim(dut
),
87 vcd_name
='test_shadow_fn_unit.vcd')
89 if __name__
== '__main__':