from nmigen.compat.sim import run_simulation
from nmigen.cli import verilog, rtlil
from nmigen import Module, Signal, Elaboratable
from nmigen.compat.sim import run_simulation
from nmigen.cli import verilog, rtlil
from nmigen import Module, Signal, Elaboratable
class LDSTDepCell(Elaboratable):
""" implements 11.4.12 mitch alsup load/store dependence cell, p45
class LDSTDepCell(Elaboratable):
""" implements 11.4.12 mitch alsup load/store dependence cell, p45
self.load_hit_i = Signal(reset_less=True) # load hit in (right)
self.stwd_hit_i = Signal(reset_less=True) # store w/ data hit in (right)
self.load_hit_i = Signal(reset_less=True) # load hit in (right)
self.stwd_hit_i = Signal(reset_less=True) # store w/ data hit in (right)
# outputs (latched rd/wr pend)
self.ld_hold_st_o = Signal(reset_less=True) # load holds st out (left)
# outputs (latched rd/wr pend)
self.ld_hold_st_o = Signal(reset_less=True) # load holds st out (left)
- m.submodules.war_l = war_l = SRLatch() # Write After Read Latch
- m.submodules.raw_l = raw_l = SRLatch() # Read After Write Latch
+ m.submodules.war_l = war_l = SRLatch(sync=False) # WriteAfterRead Latch
+ m.submodules.raw_l = raw_l = SRLatch(sync=False) # ReadAfterWrite Latch
m.d.comb += raw_l.r.eq(self.stor_i) # reset on ST
# Hold results (read out horizontally, accumulate in OR fashion)
m.d.comb += raw_l.r.eq(self.stor_i) # reset on ST
# Hold results (read out horizontally, accumulate in OR fashion)
- lhs = war_l.qn & self.load_hit_i
- shl = raw_l.qn & self.stwd_hit_i
- m.d.comb += self.ld_hold_st_o.eq(self.ld_hold_st_i | lhs)
- m.d.comb += self.st_hold_ld_o.eq(self.st_hold_ld_i | shl)
+ m.d.comb += self.ld_hold_st_o.eq(war_l.qn & self.load_hit_i)
+ m.d.comb += self.st_hold_ld_o.eq(raw_l.qn & self.stwd_hit_i)