1 from nmigen
.compat
.sim
import run_simulation
2 from nmigen
.cli
import verilog
, rtlil
3 from nmigen
import Module
, Signal
, Elaboratable
4 from nmutil
.latch
import SRLatch
7 class DepCell(Elaboratable
):
10 def __init__(self
, llen
=1):
13 self
.pend_i
= Signal(llen
, reset_less
=True) # pending bit in (left)
14 self
.issue_i
= Signal(llen
, reset_less
=True) # Issue in (top)
15 self
.go_i
= Signal(llen
, reset_less
=True) # Go read/write in (left)
16 self
.die_i
= Signal(llen
, reset_less
=True) # Go die in (left)
19 self
.wait_o
= Signal(llen
, reset_less
=True) # wait out (right)
21 def elaborate(self
, platform
):
23 m
.submodules
.l
= l
= SRLatch(sync
=False, llen
=self
.llen
) # async latch
25 # reset on go HI, set on dest and issue
26 m
.d
.comb
+= l
.s
.eq(self
.issue_i
& self
.pend_i
)
27 m
.d
.comb
+= l
.r
.eq(self
.go_i | self
.die_i
)
30 m
.d
.comb
+= self
.wait_o
.eq(l
.qlq
& ~self
.issue_i
)
45 class FUDependenceCell(Elaboratable
):
46 """ implements 11.4.7 mitch alsup dependence cell, p27
48 def __init__(self
, n_fu
=1):
51 self
.rd_pend_i
= Signal(n_fu
, reset_less
=True) # read pend in (left)
52 self
.wr_pend_i
= Signal(n_fu
, reset_less
=True) # write pend in (left)
53 self
.issue_i
= Signal(n_fu
, reset_less
=True) # Issue in (top)
55 self
.go_wr_i
= Signal(n_fu
, reset_less
=True) # Go Write in (left)
56 self
.go_rd_i
= Signal(n_fu
, reset_less
=True) # Go Read in (left)
57 self
.go_die_i
= Signal(n_fu
, reset_less
=True) # Go Die in (left)
59 # outputs (latched rd/wr wait)
60 self
.rd_wait_o
= Signal(n_fu
, reset_less
=True) # read wait out (right)
61 self
.wr_wait_o
= Signal(n_fu
, reset_less
=True) # write wait out (right)
63 def elaborate(self
, platform
):
65 m
.submodules
.rd_c
= rd_c
= DepCell(self
.n_fu
)
66 m
.submodules
.wr_c
= wr_c
= DepCell(self
.n_fu
)
69 for c
in [rd_c
, wr_c
]:
70 m
.d
.comb
+= c
.issue_i
.eq(self
.issue_i
)
71 m
.d
.comb
+= c
.die_i
.eq(self
.go_die_i
)
73 # connect go_rd / go_wr
74 m
.d
.comb
+= wr_c
.go_i
.eq(self
.go_wr_i
)
75 m
.d
.comb
+= rd_c
.go_i
.eq(self
.go_rd_i
)
78 m
.d
.comb
+= wr_c
.pend_i
.eq(self
.wr_pend_i
)
79 m
.d
.comb
+= rd_c
.pend_i
.eq(self
.rd_pend_i
)
82 m
.d
.comb
+= self
.wr_wait_o
.eq(wr_c
.wait_o
)
83 m
.d
.comb
+= self
.rd_wait_o
.eq(rd_c
.wait_o
)
102 yield dut
.dest_i
.eq(1)
103 yield dut
.issue_i
.eq(1)
105 yield dut
.issue_i
.eq(0)
107 yield dut
.src1_i
.eq(1)
108 yield dut
.issue_i
.eq(1)
110 yield dut
.issue_i
.eq(0)
112 yield dut
.go_rd_i
.eq(1)
114 yield dut
.go_rd_i
.eq(0)
116 yield dut
.go_wr_i
.eq(1)
118 yield dut
.go_wr_i
.eq(0)
122 dut
= FUDependenceCell()
123 vl
= rtlil
.convert(dut
, ports
=dut
.ports())
124 with
open("test_fu_dcell.il", "w") as f
:
127 run_simulation(dut
, dcell_sim(dut
), vcd_name
='test_fu_dcell.vcd')
129 if __name__
== '__main__':