class SRLatch(Elaboratable):
- def __init__(self):
+ def __init__(self, sync=True):
+ self.sync = sync
self.s = Signal(reset_less=True)
self.r = Signal(reset_less=True)
self.q = Signal(reset_less=True)
m = Module()
q_int = Signal(reset_less=True)
- with m.If(self.s):
- m.d.sync += q_int.eq(1)
- with m.Elif(self.r):
- m.d.sync += q_int.eq(0)
-
- m.d.comb += self.q.eq(q_int)
- m.d.comb += self.qn.eq(~q_int)
+ if self.sync:
+ with m.If(self.s):
+ m.d.sync += q_int.eq(1)
+ with m.Elif(self.r):
+ m.d.sync += q_int.eq(0)
+ m.d.comb += self.q.eq(q_int)
+ m.d.comb += self.qn.eq(~q_int)
+ else:
+ with m.If(self.s):
+ m.d.sync += q_int.eq(1)
+ m.d.comb += self.q.eq(1)
+ m.d.comb += self.qn.eq(0)
+ with m.Elif(self.r):
+ m.d.sync += q_int.eq(0)
+ m.d.comb += self.q.eq(0)
+ m.d.comb += self.qn.eq(1)
+ with m.Else():
+ m.d.comb += self.q.eq(q_int)
+ m.d.comb += self.qn.eq(~q_int)
return m
def elaborate(self, platform):
m = Module()
- m.submodules.rd_l = rd_l = SRLatch()
- m.submodules.wr_l = wr_l = SRLatch()
+ m.submodules.rd_l = rd_l = SRLatch(sync=False)
+ m.submodules.wr_l = wr_l = SRLatch(sync=False)
m.submodules.dest_d = dest_d = Decoder(self.reg_width)
m.submodules.src1_d = src1_d = Decoder(self.reg_width)
m.submodules.src2_d = src2_d = Decoder(self.reg_width)