Remove TAR input, create fixed input for CTR and input for other
authorMichael Nolan <mtnolan2640@gmail.com>
Fri, 15 May 2020 20:08:00 +0000 (16:08 -0400)
committerMichael Nolan <mtnolan2640@gmail.com>
Fri, 15 May 2020 20:08:00 +0000 (16:08 -0400)
Other SPR input will be used for CTR, LR, or TAR for op_bcreg

src/soc/branch/main_stage.py
src/soc/branch/pipe_data.py
src/soc/branch/test/test_pipe_caller.py

index ebfe5c893952f8254e5871fbc6cda6d240e98b03..7d21be6a0dcae2993c837a799fa0324fb8454c51 100644 (file)
@@ -73,7 +73,7 @@ class BranchMainStage(PipeModBase):
         with m.Else():
             # Yes, the CTR only counts 32 bits
             ctr = Signal(64, reset_less=True)
-            comb += ctr.eq(self.i.spr - 1)
+            comb += ctr.eq(self.i.ctr - 1)
             comb += self.o.spr.data.eq(ctr)
             comb += self.o.spr.ok.eq(1)
             ctr_eq_zero = Signal(reset_less=True)
index 6d97102c0c5a1c625b3b1e8b3a18079343ea7d04..710e5e1e85743ff5c43682d88767f3af0c63001f 100644 (file)
@@ -19,26 +19,22 @@ class IntegerData:
 class BranchInputData(IntegerData):
     def __init__(self, pspec):
         super().__init__(pspec)
-        # We need both lr and spr for bclr and bcctrl. Bclr can read
-        # from both ctr and lr, and bcctrl can write to both ctr and
-        # lr.
-        self.lr = Signal(64, reset_less=True)  # Link Register
-        self.spr = Signal(64, reset_less=True) # CTR
-        self.cr = Signal(32, reset_less=True)  # Condition Register(s) CR0-7
-        self.cia = Signal(64, reset_less=True) # Current Instruction Address
-        self.tar = Signal(64, reset_less=True) # Target Address Register
+        # For OP_BCREG, this will either be CTR, LR, or TAR
+        self.spr = Signal(64, reset_less=True)
+        self.ctr = Signal(64, reset_less=True)  # CTR
+        self.cr = Signal(32, reset_less=True)   # Condition Register(s) CR0-7
+        self.cia = Signal(64, reset_less=True)  # Current Instruction Address
 
     def __iter__(self):
         yield from super().__iter__()
-        yield self.lr
+        yield self.ctr
         yield self.spr
         yield self.cr
         yield self.cia
-        yield self.tar
 
     def eq(self, i):
         lst = super().eq(i)
-        return lst + [self.lr.eq(i.lr), self.spr.eq(i.spr), self.tar.eq(i.tar),
+        return lst + [self.ctr.eq(i.ctr), self.spr.eq(i.spr),
                       self.cr.eq(i.cr), self.cia.eq(i.cia)]
 
 
index fdb4edbeda295f7abe313c121b63e60749668c3a..d582e75694d63c7b2f73a3565326954a5141ef09 100644 (file)
@@ -159,8 +159,7 @@ class TestRunner(FHDLTestCase):
                     yield instruction.eq(ins)          # raw binary instr.
                     yield branch.p.data_i.cia.eq(simulator.pc.CIA.value)
                     yield branch.p.data_i.cr.eq(simulator.cr.get_range().value)
-                    yield branch.p.data_i.spr.eq(simulator.spr['CTR'].value)
-                    yield branch.p.data_i.lr.eq(simulator.spr['LR'].value)
+                    yield branch.p.data_i.ctr.eq(simulator.spr['CTR'].value)
                     print(f"cr0: {simulator.crl[0].get_range()}")
                     yield Settle()
                     fn_unit = yield pdecode2.e.fn_unit