135d005dfSXuan Hupackage xiangshan.backend.fu.vector 235d005dfSXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 435d005dfSXuan Huimport chisel3._ 535d005dfSXuan Huimport chisel3.util._ 620f53972SsinceforYyimport xiangshan._ 79d3cebe7Schengguanghuiimport xiangshan.backend.fu.FuConfig.VialuCfg 835d005dfSXuan Huimport xiangshan.backend.fu.vector.Bundles.VConfig 942475509SXuan Huimport xiangshan.backend.fu.vector.utils.ScalaDupToVector 1035d005dfSXuan Huimport xiangshan.backend.fu.{FuConfig, FuncUnit, HasPipelineReg} 1135d005dfSXuan Huimport yunsuan.VialuFixType 1235d005dfSXuan Hu 1335d005dfSXuan Hutrait VecFuncUnitAlias { this: FuncUnit => 1435d005dfSXuan Hu protected val inCtrl = io.in.bits.ctrl 1535d005dfSXuan Hu protected val inData = io.in.bits.data 1635d005dfSXuan Hu protected val vecCtrl = inCtrl.vpu.get 1735d005dfSXuan Hu 1835d005dfSXuan Hu protected val vill = vecCtrl.vill 1935d005dfSXuan Hu protected val vma = vecCtrl.vma 2035d005dfSXuan Hu protected val vta = vecCtrl.vta 2135d005dfSXuan Hu protected val vsew = vecCtrl.vsew 2235d005dfSXuan Hu protected val vlmul = vecCtrl.vlmul 2335d005dfSXuan Hu protected val vm = vecCtrl.vm 2435d005dfSXuan Hu protected val vstart = vecCtrl.vstart 2535d005dfSXuan Hu 2620f53972SsinceforYy protected val frm = io.frm.getOrElse(0.U(3.W)) 2720f53972SsinceforYy protected val vxrm = io.vxrm.getOrElse(0.U(3.W)) 2820f53972SsinceforYy protected val instRm = inCtrl.fpu.getOrElse(0.U.asTypeOf(new FPUCtrlSignals)).rm 2920f53972SsinceforYy protected val rm = Mux(vecCtrl.fpu.isFpToVecInst && instRm =/= "b111".U, instRm, frm) 3035d005dfSXuan Hu protected val vuopIdx = vecCtrl.vuopIdx 3117985fbbSZiyue Zhang protected val nf = 0.U // No need to handle nf in vector arith unit 3235d005dfSXuan Hu 3335d005dfSXuan Hu protected val fuOpType = inCtrl.fuOpType 3435d005dfSXuan Hu protected val isNarrow = vecCtrl.isNarrow 3535d005dfSXuan Hu protected val isExt = vecCtrl.isExt 3635d005dfSXuan Hu protected val isMove = vecCtrl.isMove 37ffc8dae6SXuan Hu // swap vs1 and vs2, used by vrsub, etc 3835d005dfSXuan Hu protected val isReverse = vecCtrl.isReverse 3935d005dfSXuan Hu 40d16a780cSXuan Hu protected val allMaskTrue = VecInit(Seq.fill(VLEN)(true.B)).asUInt 41d16a780cSXuan Hu protected val allMaskFalse = VecInit(Seq.fill(VLEN)(false.B)).asUInt 42ffc8dae6SXuan Hu 43ffc8dae6SXuan Hu // vadc.vv, vsbc.vv need this 449d3cebe7Schengguanghui protected val needClearMask: Bool = if(cfg == VialuCfg) VialuFixType.needClearMask(inCtrl.fuOpType) else false.B 4570478f41SXuan Hu 4635d005dfSXuan Hu // There is no difference between control-dependency or data-dependency for function unit, 4770478f41SXuan Hu // but spliting these in ctrl or data bundles is easy to coding. 48ffc8dae6SXuan Hu protected val srcMask: UInt = if(!cfg.maskWakeUp) inCtrl.vpu.get.vmask else { 49ffc8dae6SXuan Hu MuxCase(inData.getSrcMask, Seq( 50ffc8dae6SXuan Hu needClearMask -> allMaskFalse, 51ffc8dae6SXuan Hu vm -> allMaskTrue 52ffc8dae6SXuan Hu )) 53ffc8dae6SXuan Hu } 54ffc8dae6SXuan Hu protected val srcVConfig: VConfig = if(!cfg.vconfigWakeUp) inCtrl.vpu.get.vconfig else inData.getSrcVConfig.asTypeOf(new VConfig) 552569173eSXuan Hu protected val vl = srcVConfig.vl 5635d005dfSXuan Hu} 5735d005dfSXuan Hu 5835d005dfSXuan Huclass VecPipedFuncUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) 5935d005dfSXuan Hu with HasPipelineReg 6035d005dfSXuan Hu with VecFuncUnitAlias 6135d005dfSXuan Hu{ 62395c8649SZiyue-Zhang private val src0 = inData.src(0) 6342475509SXuan Hu private val src1 = WireInit(inData.src(1)) // vs2 only 64d33803b9Slewislzh protected val vs2 = src1 65d33803b9Slewislzh protected val vs1 = src0 662569173eSXuan Hu protected val oldVd = inData.src(2) 6735d005dfSXuan Hu 68d16a780cSXuan Hu protected val outCtrl = ctrlVec.last 69d16a780cSXuan Hu protected val outData = dataVec.last 70d16a780cSXuan Hu 71d16a780cSXuan Hu protected val outVecCtrl = outCtrl.vpu.get 72d16a780cSXuan Hu protected val outVm = outVecCtrl.vm 73d16a780cSXuan Hu 74d16a780cSXuan Hu // vadc.vv, vsbc.vv need this 759d3cebe7Schengguanghui protected val outNeedClearMask: Bool = if(cfg == VialuCfg) VialuFixType.needClearMask(outCtrl.fuOpType) else false.B 76d16a780cSXuan Hu protected val outVConfig = if(!cfg.vconfigWakeUp) outCtrl.vpu.get.vconfig else outData.getSrcVConfig.asTypeOf(new VConfig) 77d16a780cSXuan Hu protected val outVl = outVConfig.vl 78daae8f22SZiyue Zhang protected val outVstart = outVecCtrl.vstart 79d16a780cSXuan Hu protected val outOldVd = outData.src(2) 80*0fbf39afSlewislzh protected val outVlmul = outCtrl.vpu.get.vlmul 81*0fbf39afSlewislzh protected val outLastUop = outCtrl.vpu.get.lastUop 82d16a780cSXuan Hu // There is no difference between control-dependency or data-dependency for function unit, 83d16a780cSXuan Hu // but spliting these in ctrl or data bundles is easy to coding. 84d16a780cSXuan Hu protected val outSrcMask: UInt = if (!cfg.maskWakeUp) outCtrl.vpu.get.vmask else { 85d16a780cSXuan Hu MuxCase( 86d16a780cSXuan Hu outData.getSrcMask, Seq( 87d16a780cSXuan Hu outNeedClearMask -> allMaskFalse, 88d16a780cSXuan Hu outVm -> allMaskTrue 89d16a780cSXuan Hu ) 90d16a780cSXuan Hu ) 91d16a780cSXuan Hu } 92d16a780cSXuan Hu 9335d005dfSXuan Hu override def latency: Int = cfg.latency.latencyVal.get 9435d005dfSXuan Hu 9535d005dfSXuan Hu} 96