Implement ctr decrementing
authorMichael Nolan <mtnolan2640@gmail.com>
Fri, 15 May 2020 19:36:35 +0000 (15:36 -0400)
committerMichael Nolan <mtnolan2640@gmail.com>
Fri, 15 May 2020 20:01:37 +0000 (16:01 -0400)
src/soc/branch/main_stage.py

index f2a9370c28a36eb7eed8f84757b8188c131571db..341d141bc20a8d675fabe7a08c445bb855729a3d 100644 (file)
@@ -70,9 +70,21 @@ class BranchMainStage(PipeModBase):
         bc_taken = Signal(reset_less=True)
         with m.If(bo[2]):
             comb += bc_taken.eq((cr_bit == bo[3]) | bo[4])
-
-        ######## main switch statement ########
-
+        with m.Else():
+            # Yes, the CTR only counts 32 bits
+            ctr = Signal(64, reset_less=True)
+            comb += ctr.eq(self.i.spr - 1)
+            comb += self.o.spr.data.eq(ctr)
+            comb += self.o.spr.ok.eq(1)
+            ctr_eq_zero = Signal(reset_less=True)
+            with m.If(bo[3:4] == 0b00):
+                comb += bc_taken.eq(~cr_bit & (ctr_eq_zero == bo[1]))
+            with m.Elif(bo[3:4] == 0b01):
+                comb += bc_taken.eq(cr_bit & (ctr_eq_zero == bo[1]))
+            with m.Elif(bo[4] == 1):
+                comb += bc_taken.eq(ctr_eq_zero == bo[1])
+
+        ### Main Switch Statement ###
         with m.Switch(op.insn_type):
             #### branch ####
             with m.Case(InternalOp.OP_B):