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
13 self
.issue_i
= Signal(reset_less
=True)
14 self
.shadow_i
= Signal(reset_less
=True)
15 self
.s_fail_i
= Signal(reset_less
=True)
16 self
.s_good_i
= Signal(reset_less
=True)
19 self
.shadow_o
= Signal(reset_less
=True)
20 self
.recover_o
= Signal(reset_less
=True)
22 def elaborate(self
, platform
):
24 m
.submodules
.sl
= sl
= SRLatch(sync
=False)
26 m
.d
.comb
+= sl
.s
.eq(self
.shadow_i
& self
.issue_i
)
27 m
.d
.comb
+= sl
.r
.eq(self
.s_good_i
)
28 m
.d
.comb
+= self
.recover_o
.eq(sl
.q
& self
.s_fail_i
)
29 m
.d
.comb
+= self
.shadow_o
.eq(sl
.q
)
45 def shadow_fn_unit_sim(dut
):
46 yield dut
.dest_i
.eq(1)
47 yield dut
.issue_i
.eq(1)
49 yield dut
.issue_i
.eq(0)
51 yield dut
.src1_i
.eq(1)
52 yield dut
.issue_i
.eq(1)
56 yield dut
.issue_i
.eq(0)
58 yield dut
.go_rd_i
.eq(1)
60 yield dut
.go_rd_i
.eq(0)
62 yield dut
.go_wr_i
.eq(1)
64 yield dut
.go_wr_i
.eq(0)
68 def test_shadow_fn_unit():
70 vl
= rtlil
.convert(dut
, ports
=dut
.ports())
71 with
open("test_shadow_fn_unit.il", "w") as f
:
74 run_simulation(dut
, shadow_fn_unit_sim(dut
),
75 vcd_name
='test_shadow_fn_unit.vcd')
77 if __name__
== '__main__':