yippee got dual add chained together
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 23 Feb 2019 12:33:31 +0000 (12:33 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 23 Feb 2019 12:33:31 +0000 (12:33 +0000)
src/add/dual_add_experiment.py
src/add/test_dual.py

index 136294d3c69a1eb6458d58d666701864cc2eabc3..de07e7782a276d450fb98270612927c949abc94f 100644 (file)
@@ -45,28 +45,26 @@ class ALU:
         m.submodules.add1 = self.add1
         m.submodules.add2 = self.add2
         m.d.comb += [
-            # join add1 a to a
+            # join add1 a to a: add1.in_a = a
             self.add1.in_a.v.eq(self.a.v),
             self.add1.in_a.stb.eq(self.a.stb),
-            # join add1 b to b
+            self.a.ack.eq(self.add1.in_a.ack),
+            # join add1 b to b: add1.in_b = b
             self.add1.in_b.v.eq(self.b.v),
             self.add1.in_b.stb.eq(self.b.stb),
-            # join add2 a to c
+            self.b.ack.eq(self.add1.in_b.ack),
+            # join add2 a to c: add2.in_a = c
             self.add2.in_a.v.eq(self.c.v),
             self.add2.in_a.stb.eq(self.c.stb),
-            # join add2 b to add1 z
+            self.c.ack.eq(self.add2.in_a.ack),
+            # join add2 b to add1 z: add2.in_b = add1.out_z
             self.add2.in_b.v.eq(self.add1.out_z.v),
             self.add2.in_b.stb.eq(self.add1.out_z.stb),
-        ]
-        m.d.sync += [
-            # join add1 a to a
-            self.add1.in_a.ack.eq(self.a.ack),
-            # join add1 b to b
-            self.add1.in_b.ack.eq(self.b.ack),
-            # join add2 a to c
-            self.add2.in_a.ack.eq(self.c.ack),
-            # join add2 b to add1 z
-            self.add2.in_b.ack.eq(self.add1.out_z.ack),
+            self.add1.out_z.ack.eq(self.add2.in_b.ack),
+            # join output from add2 to z: z = add2.out_z
+            self.z.v.eq(self.add2.out_z.v),
+            self.z.stb.eq(self.add2.out_z.stb),
+            self.add2.out_z.ack.eq(self.z.ack),
         ]
         #with m.If(self.op):
         #    m.d.comb += self.o.eq(self.sub.o)
index 43f28404a438136e890bed8b9b6c4e17a9eb0865..410aba911350313c528eb59e49f23745b956b61b 100644 (file)
@@ -20,6 +20,8 @@ def get_case(dut, a, b, c):
 
     yield dut.b.v.eq(b)
     yield dut.b.stb.eq(1)
+    yield
+    yield
     b_ack = (yield dut.b.ack)
     assert b_ack == 0
 
@@ -28,6 +30,9 @@ def get_case(dut, a, b, c):
         out_z_stb = (yield dut.z.stb)
         if not out_z_stb:
             continue
+
+        out_z = yield dut.z.v
+
         yield dut.a.stb.eq(0)
         yield dut.b.stb.eq(0)
         yield dut.c.stb.eq(0)
@@ -38,7 +43,6 @@ def get_case(dut, a, b, c):
         yield
         break
 
-    out_z = yield dut.z.v
     return out_z
 
 def check_case(dut, a, b, c, z):