very weird: invert readable vector, cscore works
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 15 May 2019 06:48:51 +0000 (07:48 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 15 May 2019 06:48:51 +0000 (07:48 +0100)
src/experiment/compalu.py
src/experiment/cscore.py
src/regfile/regfile.py
src/scoreboard/fn_unit.py
src/scoreboard/global_pending.py

index d9e0108dfb8f82ba7cd2e9c08ba5155387ce5762..2edf65875541588562bb6efcdf9bcdc9ce4ffa8b 100644 (file)
@@ -10,6 +10,7 @@ class ComputationUnitNoDelay(Elaboratable):
         self.rwid = rwid
         self.alu = alu
 
+        self.counter = Signal(3)
         self.go_rd_i = Signal(reset_less=True) # go read in
         self.go_wr_i = Signal(reset_less=True) # go write in
         self.issue_i = Signal(reset_less=True) # fn issue in
@@ -51,7 +52,13 @@ class ComputationUnitNoDelay(Elaboratable):
 
         # outputs
         m.d.comb += self.busy_o.eq(opc_l.q) # busy out
-        m.d.comb += self.req_rel_o.eq(req_l.q & opc_l.q) # request release out
+
+        with m.If(self.go_rd_i):
+            m.d.sync += self.counter.eq(1)
+        with m.If(self.counter > 0):
+            m.d.sync += self.counter.eq(self.counter - 1)
+        with m.If(self.counter == 1):
+            m.d.comb += self.req_rel_o.eq(req_l.q & opc_l.q) # req release out
 
         # create a latch/register for src1/src2
         latchregister(m, self.src1_i, self.alu.a, src_l.q)
index 9a729be3207bb388f731e7fbd122441664eb8228..8003c54fa5bcfc2a9887c87160676d72d45588ff 100644 (file)
@@ -335,6 +335,8 @@ def scoreboard_sim(dut, alusim):
         for i in range(len(dut.int_insn_i)):
             yield dut.int_insn_i[i].eq(0)
         yield
+        yield
+        yield
         while True:
             issue_o = yield dut.issue_o
             if issue_o:
@@ -342,6 +344,10 @@ def scoreboard_sim(dut, alusim):
             yield
 
 
+    yield
+    yield from print_reg(dut, [3,4,5])
+    yield
+    yield from print_reg(dut, [3,4,5])
     yield
     yield from print_reg(dut, [3,4,5])
     yield
index 1d732ba87a78ad6bb37f4a731b39a5495e9335bd..29fbda65b14ad4546e264f3a57f31af06389c900 100644 (file)
@@ -10,7 +10,7 @@ import operator
 
 
 class Register(Elaboratable):
-    def __init__(self, width, writethru=True):
+    def __init__(self, width, writethru=False):
         self.width = width
         self.writethru = writethru
         self._rdports = []
index 1e597cda4dbd44a9830639a386ad05d4bcde21fc..af7b0ea29fca5d9e0b384475ae5f83d3761b0ee4 100644 (file)
@@ -126,6 +126,7 @@ class FnUnit(Elaboratable):
         for i in range(self.n_dests):
             m.d.comb += self.xx_pend_o[i].eq(0)  # initialise all array
             m.d.comb += self.writable_o[i].eq(0) # to zero
+            m.d.comb += self.readable_o[i].eq(0) # to zero
 
         # go_wr latch: reset on go_wr HI, set on issue
         m.d.comb += wr_l.s.eq(self.issue_i)
@@ -161,8 +162,10 @@ class FnUnit(Elaboratable):
 
         # readable output signal
         g_rd = Signal(self.reg_width, reset_less=True)
+        ro = Signal(reset_less=True)
         m.d.comb += g_rd.eq((~self.g_wr_pend_i) & self.rd_pend_o)
-        m.d.comb += self.readable_o.eq(g_rd.bool())
+        m.d.comb += ro.eq(g_rd.bool())
+        m.d.comb += self.readable_o.eq(ro)
 
         # writable output signal
         g_wr_v = Signal(self.reg_width, reset_less=True)
index eb9da598fb6c8006a42ec652b6a12627f72bbd3f..51a05d3adadeb55329fc1e59bf65754240f5bec8 100644 (file)
@@ -25,10 +25,11 @@ class GlobalPending(Elaboratable):
           on a particular register (extremely unusual), they must set a Const
           zero bit in the vector.
     """
-    def __init__(self, dep, fu_vecs):
+    def __init__(self, dep, fu_vecs, sync=False):
         self.reg_dep = dep
         # inputs
         self.fu_vecs = fu_vecs
+        self.sync = sync
         for v in fu_vecs:
             assert len(v) == dep, "FU Vector must be same width as regfile"
 
@@ -43,7 +44,10 @@ class GlobalPending(Elaboratable):
             for v in self.fu_vecs:
                 vec_bit_l.append(v[i])             # fu bit for same register
             pend_l.append(Cat(*vec_bit_l).bool())  # OR all bits for same reg
-        m.d.comb += self.g_pend_o.eq(Cat(*pend_l)) # merge all OR'd bits
+        if self.sync:
+            m.d.sync += self.g_pend_o.eq(Cat(*pend_l)) # merge all OR'd bits
+        else:
+            m.d.comb += self.g_pend_o.eq(Cat(*pend_l)) # merge all OR'd bits
 
         return m