ignore self-to-self read and write pending hazards
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 22 May 2019 12:24:01 +0000 (13:24 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 22 May 2019 12:24:01 +0000 (13:24 +0100)
src/experiment/score6600.py
src/scoreboard/dependence_cell.py
src/scoreboard/fu_fu_matrix.py

index 1c0caca0a74acf1f3139fd823bbcc18bcce78440..4df31746b29eafb8db3278e2216584c518006199 100644 (file)
@@ -381,7 +381,7 @@ def scoreboard_sim(dut, alusim):
 
     yield dut.int_store_i.eq(0)
 
-    for i in range(1):
+    for i in range(100):
 
         # set random values in the registers
         for i in range(1, dut.n_regs):
@@ -390,8 +390,8 @@ def scoreboard_sim(dut, alusim):
 
         # create some instructions (some random, some regression tests)
         instrs = []
-        if False:
-            for i in range(10):
+        if True:
+            for i in range(20):
                 src1 = randint(1, dut.n_regs-1)
                 src2 = randint(1, dut.n_regs-1)
                 while True:
@@ -456,17 +456,11 @@ def scoreboard_sim(dut, alusim):
             instrs.append((1, 1, 1, 1))
             instrs.append((1, 5, 3, 0))
 
-        if True:
-            instrs.append( (7, 1, 2, 0) )
-            instrs.append( (1, 1, 4, 2) )
-            instrs.append( (2, 3, 2, 2) )
-            instrs.append( (5, 3, 1, 0) )
-            instrs.append( (7, 3, 5, 2) )
-            instrs.append( (1, 2, 6, 2) )
+        if False:
+            # very weird failure
             instrs.append( (5, 2, 5, 2) )
-            instrs.append( (2, 2, 3, 0) )
+            instrs.append( (2, 6, 3, 0) )
             instrs.append( (4, 2, 2, 1) )
-            instrs.append( (2, 4, 6, 1) )
 
         # issue instruction(s), wait for issue to be free before proceeding
         for i, (src1, src2, dest, op) in enumerate(instrs):
index 9e3d8e92b48c76777dce2c2caa7f39ff6a268e1c..b137f7aed8b37f056559f977a55c558cec37802b 100644 (file)
@@ -130,9 +130,8 @@ class DependenceCell(Elaboratable):
 
         # connect up hazard checks: read-after-write and write-after-read
         m.d.comb += dest_c.hazard_i.eq(self.rd_pend_i) # read-after-write
-        with m.If(~selfhazard):
-            m.d.comb += src1_c.hazard_i.eq(self.wr_pend_i) # write-after-read
-            m.d.comb += src2_c.hazard_i.eq(self.wr_pend_i) # write-after-read
+        m.d.comb += src1_c.hazard_i.eq(self.wr_pend_i) # write-after-read
+        m.d.comb += src2_c.hazard_i.eq(self.wr_pend_i) # write-after-read
 
         # connect fwd / reg-sel outputs
         for c, fwd, rsel in [(dest_c, self.dest_fwd_o, self.dest_rsel_o),
index 1f868081eb0e7861bbf1a9ef5918621113336b77..d40f70fa8e3e15d2e1a9b671105016d87917cea2 100644 (file)
@@ -1,6 +1,6 @@
 from nmigen.compat.sim import run_simulation
 from nmigen.cli import verilog, rtlil
-from nmigen import Module, Signal, Elaboratable, Array, Cat
+from nmigen import Module, Signal, Elaboratable, Array, Cat, Const
 
 #from nmutil.latch import SRLatch
 from .fu_dep_cell import FUDependenceCell
@@ -115,6 +115,12 @@ class FUFUDepMatrix(Elaboratable):
             rd_pend_i = []
             wr_pend_i = []
             for x in range(self.n_fu_col):
+                if x == y: # ignore hazards on the diagonal: self-against-self
+                    dummyrd = Signal(reset_less=True)
+                    dummywr = Signal(reset_less=True)
+                    rd_pend_i.append(dummyrd)
+                    wr_pend_i.append(dummywr)
+                    continue
                 dc = dm[x][y]
                 # accumulate cell rd_pend/wr_pend/go_rd/go_wr
                 rd_pend_i.append(dc.rd_pend_i)