connect up Function Unit operand subsets
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 4 Jun 2020 00:18:34 +0000 (01:18 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 4 Jun 2020 00:18:34 +0000 (01:18 +0100)
src/soc/fu/compunits/compunits.py
src/soc/simple/core.py

index c8e4a2bcafcc834aa403177a2a70c5daed7c6c01..abca7a00d55fcb9720fef47c4d965e5872af06c7 100644 (file)
@@ -45,6 +45,7 @@ see:
 from nmigen import Elaboratable, Module
 from nmigen.cli import rtlil
 from soc.experiment.compalu_multi import MultiCompUnit
+from soc.decoder.power_enums import Function
 
 # pipeline / spec imports
 
@@ -105,18 +106,23 @@ class FunctionUnitBaseMulti:
 ###### actual Function Units: these are "single" stage pipelines #####
 
 class ALUFunctionUnit(FunctionUnitBaseSingle):
+    fnunit = Function.ALU
     def __init__(self): super().__init__(ALUPipeSpec, ALUBasePipe)
 
 class LogicalFunctionUnit(FunctionUnitBaseSingle):
+    fnunit = Function.LOGICAL
     def __init__(self): super().__init__(LogicalPipeSpec, LogicalBasePipe)
 
 class CRFunctionUnit(FunctionUnitBaseSingle):
+    fnunit = Function.CR
     def __init__(self): super().__init__(CRPipeSpec, CRBasePipe)
 
 class BranchFunctionUnit(FunctionUnitBaseSingle):
+    fnunit = Function.BRANCH
     def __init__(self): super().__init__(BranchPipeSpec, BranchBasePipe)
 
 class ShiftRotFunctionUnit(FunctionUnitBaseSingle):
+    fnunit = Function.SHIFT_ROT
     def __init__(self): super().__init__(ShiftRotPipeSpec, ShiftRotBasePipe)
 
 
index 6423f61d5ca56384c4bd07bc065affdfe29fab8b..54e60864502fdd2e30cc335eb6ac61cc616cf6da 100644 (file)
@@ -39,6 +39,14 @@ class NonProductionCore(Elaboratable):
         regs = self.regs
         fus = self.fus.fus
 
+        # connect up instructions
+        for funame, fu in fus.items():
+            fnunit = fu.fnunit.value
+            enable = Signal(name="en_%s" % funame, reset_less=True)
+            comb += enable.eq(self.ivalid_i & (dec2.e.fn_unit & fnunit != 0))
+            with m.If(enable):
+                comb += fu.oper_i.eq_from_execute1(dec2.e)
+
         # enable-signals for each FU, get one bit for each FU (by name)
         fu_enable = Signal(len(fus), reset_less=True)
         fu_bitdict = {}