Only hold the decoder signals for one cycle, along with issue_i
authorCesar Strauss <cestrauss@gmail.com>
Thu, 31 Dec 2020 10:22:04 +0000 (10:22 +0000)
committerCesar Strauss <cestrauss@gmail.com>
Thu, 31 Dec 2020 10:22:04 +0000 (10:22 +0000)
The exception is rdmaskn, which is not latched, and must be held valid
for the entire instrucion cycle.

src/soc/experiment/test/test_compalu_multi.py

index 302f00d7a76d2336f134fe19cb82dcc95acbdf78..5624b56c14c5761a0eac6a8667dd840d1ef63a8f 100644 (file)
@@ -361,11 +361,28 @@ class OpSim:
         yield dut.issue_i.eq(1)
         yield
         yield dut.issue_i.eq(0)
+        # deactivate decoder inputs along with issue_i, so we can be sure they
+        # were latched at the correct cycle
+        # note: rdmaskn is not latched, and must be held as long as
+        # busy_o is active
+        # todo: is the above restriction on rdmaskn intentional?
+        # todo: shouldn't it be latched by issue_i, like the others?
+        yield self.dut.oper_i.insn_type.eq(0)
+        if hasattr(dut.oper_i, "invert_in"):
+            yield self.dut.oper_i.invert_in.eq(0)
+        if hasattr(dut.oper_i, "imm_data"):
+            yield self.dut.oper_i.imm_data.data.eq(0)
+            yield self.dut.oper_i.imm_data.ok.eq(0)
+        if hasattr(dut.oper_i, "zero_a"):
+            yield self.dut.oper_i.zero_a.eq(0)
         # wait for busy to be negated
         yield Settle()
         while (yield dut.busy_o):
             yield
             yield Settle()
+        # now, deactivate rdmaskn
+        if hasattr(dut, "rdmaskn"):
+            yield dut.rdmaskn.eq(0)
         # update the operation count
         self.op_count = (self.op_count + 1) & 255
         # On zero_a, imm_ok and rdmaskn executions, the producer counters will