WaW needs to stall
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 22 May 2019 10:10:13 +0000 (11:10 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 22 May 2019 10:10:13 +0000 (11:10 +0100)
src/experiment/score6600.py
src/scoreboard/issue_unit.py

index e906199d03bc0e29221b7624b5e7300b9047890c..b0a78ebc1b1086f3cec423760ae3b6763a09d925 100644 (file)
@@ -240,8 +240,8 @@ class Scoreboard(Elaboratable):
                     ]
         self.int_insn_i = issueunit.i.insn_i # enabled by instruction decode
 
-        # connect global rd/wr pending vectors
-        m.d.comb += issueunit.i.g_wr_pend_i.eq(intfus.g_int_wr_pend_o)
+        # connect global rd/wr pending vector (for WaW detection)
+        m.d.sync += issueunit.i.g_wr_pend_i.eq(intfus.g_int_wr_pend_o)
         # TODO: issueunit.f (FP)
 
         # and int function issue / busy arrays, and dest/src1/src2
@@ -385,7 +385,7 @@ def scoreboard_sim(dut, alusim):
         alusim.setval(i, 31+i*3)
 
     instrs = []
-    if True:
+    if False:
         for i in range(50):
             src1 = randint(1, dut.n_regs-1)
             src2 = randint(1, dut.n_regs-1)
@@ -429,9 +429,14 @@ def scoreboard_sim(dut, alusim):
         instrs.append((1, 1, 4, 1))
         instrs.append((6, 5, 3, 0))
 
+    if True:
+        # Write-after-Write Hazard
+        instrs.append( (3, 6, 7, 2) )
+        instrs.append( (4, 4, 7, 1) )
+
     for i, (src1, src2, dest, op) in enumerate(instrs):
 
-        print ("instr %d: %d %d %d %d\n" % (i, op, src1, src2, dest))
+        print ("instr %d: (%d, %d, %d, %d)" % (i, src1, src2, dest, op))
         yield from int_instr(dut, alusim, op, src1, src2, dest)
         yield
         while True:
@@ -441,10 +446,10 @@ def scoreboard_sim(dut, alusim):
                     yield dut.int_insn_i[i].eq(0)
                     yield dut.reg_enable_i.eq(0)
                 break
-            print ("busy",)
-            yield from print_reg(dut, [1,2,3])
+            #print ("busy",)
+            #yield from print_reg(dut, [1,2,3])
             yield
-        yield from print_reg(dut, [1,2,3])
+        #yield from print_reg(dut, [1,2,3])
 
     yield
     while True:
index 4f010b4bf4c16f14c4b79a6bdac07ec671540066..cf466490cae3ec16768af9881c33112ca98fa4fc 100644 (file)
@@ -93,8 +93,8 @@ class IssueUnit(Elaboratable):
         pend = Signal(self.reg_width, reset_less=True)
 
         # dest decoder: write-pending
-        m.d.comb += pend.eq(self.dest_i & self.g_wr_pend_i & (~self.store_i))
-        m.d.comb += waw_stall.eq(pend.bool())
+        m.d.comb += pend.eq(self.dest_i & self.g_wr_pend_i)
+        m.d.comb += waw_stall.eq(pend.bool() & (~self.store_i))
 
         ib_l = []
         for i in range(self.n_insns):