invert stb/ack between add1 and add2
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 25 Feb 2019 08:15:57 +0000 (08:15 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 25 Feb 2019 08:15:57 +0000 (08:15 +0000)
src/add/dual_add_experiment.py
src/add/fpbase.py
src/add/test_dual.py

index 815192c4f37ae601df346bb5f2abcdd008077dfd..7ec479f5affe95dfb5b4e6bd650b9dec248246ed 100644 (file)
@@ -52,7 +52,7 @@ class ALU:
         # join add2 a to c: add2.in_a = c
         m.d.comb += self.add2.in_a.chain_from(self.c)
         # join add2 b to add1 z: add2.in_b = add1.out_z
-        m.d.comb += self.add2.in_b.chain_from(self.add1.out_z)
+        m.d.comb += self.add2.in_b.chain_inv(self.add1.out_z)
         # join output from add2 to z: z = add2.out_z
         m.d.comb += self.z.chain_from(self.add2.out_z)
         # get at add1's stb signal
index 5bf8e8c46573806ad32201d5d5d5f42c756e3652..26528f62e185f1bb42df64e2559140981783ee6b 100644 (file)
@@ -342,6 +342,15 @@ class FPOp:
         self.stb = Signal(reset=0)
         self.ack = Signal()
 
+    def chain_inv(self, in_op, extra=None):
+        stb = in_op.stb
+        if extra is not None:
+            stb = stb & extra
+        return [self.v.eq(in_op.v),          # receive value
+                self.stb.eq(~stb),      # receive STB
+                in_op.ack.eq(~self.ack), # send ACK
+               ]
+
     def chain_from(self, in_op, extra=None):
         stb = in_op.stb
         if extra is not None:
index 8e3a9d84753ef73039a7b02e424de413294dc668..7d412c86477fa54bd857d0ced91b19b5e5783e8b 100644 (file)
@@ -33,9 +33,9 @@ def get_case(dut, a, b, c):
     assert c_ack == 0
 
     while True:
-        yield
         out_z_stb = (yield dut.z.stb)
         if not out_z_stb:
+            yield
             continue
 
         out_z = yield dut.z.v
@@ -45,16 +45,8 @@ def get_case(dut, a, b, c):
         yield dut.b.stb.eq(0)
         yield dut.c.stb.eq(0)
         yield
-        yield
-        yield
-        yield
-        yield
-        yield
         yield dut.z.ack.eq(1)
         yield
-        yield
-        yield
-        yield
         break
 
     return out_z