add immediate arg to instr
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 2 Jun 2019 13:47:24 +0000 (14:47 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 2 Jun 2019 13:47:24 +0000 (14:47 +0100)
src/experiment/score6600.py
src/scoreboard/instruction_q.py
src/scoreboard/test_iq.py

index 47101d1e90f68b6ab4fa15308a53349bcf1c0ad8..9afdf0652bc351eaf2fd951a770d453f9f0ab0f0 100644 (file)
@@ -190,7 +190,8 @@ class CompUnitALUs(CompUnitsBase):
 
         units = []
         for alu in [add, sub, mul, shf]:
-            units.append(ComputationUnitNoDelay(rwid, 2, alu))
+            aluopwid = 3 # extra bit for immediate mode
+            units.append(ComputationUnitNoDelay(rwid, aluopwid, alu))
 
         CompUnitsBase.__init__(self, rwid, units)
 
@@ -198,9 +199,9 @@ class CompUnitALUs(CompUnitsBase):
         m = CompUnitsBase.elaborate(self, platform)
         comb = m.d.comb
 
-        # hand the same operation to all units
+        # hand the same operation to all units, only lower 2 bits though
         for alu in self.units:
-            comb += alu.oper_i.eq(self.oper_i)
+            comb += alu.oper_i[0:2].eq(self.oper_i)
 
         return m
 
@@ -372,7 +373,7 @@ class Scoreboard(Elaboratable):
 
         # Int ALUs and Comp Units
         n_int_alus = 5
-        cua = CompUnitALUs(self.rwid, 2)
+        cua = CompUnitALUs(self.rwid, 3)
         cub = CompUnitBR(self.rwid, 2)
         m.submodules.cu = cu = CompUnitsBase(self.rwid, [cua, cub])
         bgt = cub.bgt # get at the branch computation unit
@@ -653,6 +654,7 @@ class IssueToScoreboard(Elaboratable):
             src1 = iq.data_o[0].src1_i
             src2 = iq.data_o[0].src2_i
             op = iq.data_o[0].oper_i
+            opi = iq.data_o[0].opim_i # immediate set
 
             # set the src/dest regs
             comb += sc.int_dest_i.eq(dest)
@@ -667,7 +669,7 @@ class IssueToScoreboard(Elaboratable):
                 comb += wait_issue_br.eq(1)
             with m.Else():                   # alu
                 comb += sc.aluissue.insn_i.eq(1)
-                comb += sc.alu_oper_i.eq(op & 0x3)
+                comb += sc.alu_oper_i.eq(Cat(op & 0x3, opi))
                 comb += wait_issue_alu.eq(1)
 
             # XXX TODO
index 1f582b74ebf5defa02fed51ba7c623696a85348d..65496a6a8f1c0407faf4a6b50e2722d88a7494f3 100644 (file)
@@ -12,6 +12,7 @@ class Instruction(RecordObject):
         RecordObject.__init__(self, name=name)
         self.oper_i = Signal(opwid, reset_less=True)
         self.opim_i = Signal(1, reset_less=True) # src2 is an immediate
+        self.imm_i = Signal(wid, reset_less=True)
         self.dest_i = Signal(wid, reset_less=True)
         self.src1_i = Signal(wid, reset_less=True)
         self.src2_i = Signal(wid, reset_less=True)
index 5a0598315159b9f12fe7c17d4b145d23adcd2e1c..94ceac7ec4c873e144092fd1d6eb3ed46922058c 100644 (file)
@@ -96,7 +96,9 @@ def mk_insns(n_insns, wid, opwid):
         op2 = randint(0, (1<<wid)-1)
         dst = randint(0, (1<<wid)-1)
         oper = randint(0, (1<<opwid)-1)
-        res.append({'oper_i': oper, 'opim_i': opi, 'dest_i': dst,
+        imm = randint(0, (1<<wid)-1)
+        res.append({'oper_i': oper, 'opim_i': opi, 
+                    'imm_i': imm, 'dest_i': dst,
                     'src1_i': op1, 'src2_i': op2})
     return res