Reset req_l latch on system reset
authorCesar Strauss <cestrauss@gmail.com>
Wed, 26 Oct 2022 22:02:21 +0000 (19:02 -0300)
committerCesar Strauss <cestrauss@gmail.com>
Wed, 26 Oct 2022 22:03:07 +0000 (19:03 -0300)
Even if the holding register of SRLatch is really reset-less, it is still
reset at startup, because the latch reset port has reset=1. But, this only
works if the latch reset port is driven by the sync domain. In case of
req_l, it's driven by the comb domain, so the latch is not reset on system
reset.

Generate a pulse on system reset, and combine it with the latch reset.

src/soc/experiment/compalu_multi.py

index 7eef2047bdab661879f67dba538e3f35afd02f3d..23ef36ea03077bef1b73e75c1d4b169b454ee99b 100644 (file)
@@ -182,6 +182,10 @@ class MultiCompUnit(RegSpecALUAPI, Elaboratable):
             rw_domain = m.d.sync
         else:
             rw_domain = m.d.comb
+        # generate a pulse on system reset, to reset any latches, if needed
+        system_reset = Signal(reset=1)
+        m.d.sync += system_reset.eq(0)
+
         # add the ALU to the MultiCompUnit only if it is a "real" ALU
         # see AllFunctionUnits as to why: a FunctionUnitBaseMulti
         # only has one "real" ALU but multiple pseudo front-ends,
@@ -263,7 +267,8 @@ class MultiCompUnit(RegSpecALUAPI, Elaboratable):
 
         # dest operand latch (not using issue_i)
         rw_domain += req_l.s.eq(alu_pulsem & self.wrmask)
-        m.d.comb += req_l.r.eq(reset_w | prev_wr_go)
+        m.d.comb += req_l.r.eq(reset_w | prev_wr_go |
+                               Repl(system_reset, self.n_dst))
 
         # pass operation to the ALU (sync: plenty time to wait for src reads)
         op = self.get_op()