1package xiangshan.backend.fu.vector 2 3import chipsalliance.rocketchip.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import xiangshan.backend.fu.vector.Bundles.VConfig 7import xiangshan.backend.fu.vector.utils.ScalaDupToVector 8import xiangshan.backend.fu.{FuConfig, FuncUnit, HasPipelineReg} 9import yunsuan.VialuFixType 10 11trait VecFuncUnitAlias { this: FuncUnit => 12 protected val inCtrl = io.in.bits.ctrl 13 protected val inData = io.in.bits.data 14 protected val vecCtrl = inCtrl.vpu.get 15 16 protected val vill = vecCtrl.vill 17 protected val vma = vecCtrl.vma 18 protected val vta = vecCtrl.vta 19 protected val vsew = vecCtrl.vsew 20 protected val vlmul = vecCtrl.vlmul 21 protected val vm = vecCtrl.vm 22 protected val vstart = vecCtrl.vstart 23 24 protected val frm = vecCtrl.frm 25 protected val vxrm = vecCtrl.vxrm 26 protected val vuopIdx = vecCtrl.vuopIdx 27 protected val nf = vecCtrl.frm 28 29 protected val fuOpType = inCtrl.fuOpType 30 protected val isNarrow = vecCtrl.isNarrow 31 protected val isExt = vecCtrl.isExt 32 protected val isMove = vecCtrl.isMove 33 // swap vs1 and vs2, used by vrsub, etc 34 protected val isReverse = vecCtrl.isReverse 35 36 protected val allMaskTrue = VecInit(Seq.fill(VLEN)(true.B)).asUInt 37 protected val allMaskFalse = VecInit(Seq.fill(VLEN)(false.B)).asUInt 38 39 // vadc.vv, vsbc.vv need this 40 protected val needClearMask: Bool = VialuFixType.needClearMask(inCtrl.fuOpType) 41 42 // There is no difference between control-dependency or data-dependency for function unit, 43 // but spliting these in ctrl or data bundles is easy to coding. 44 protected val srcMask: UInt = if(!cfg.maskWakeUp) inCtrl.vpu.get.vmask else { 45 MuxCase(inData.getSrcMask, Seq( 46 needClearMask -> allMaskFalse, 47 vm -> allMaskTrue 48 )) 49 } 50 protected val srcVConfig: VConfig = if(!cfg.vconfigWakeUp) inCtrl.vpu.get.vconfig else inData.getSrcVConfig.asTypeOf(new VConfig) 51 protected val vl = srcVConfig.vl 52} 53 54class VecPipedFuncUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) 55 with HasPipelineReg 56 with VecFuncUnitAlias 57{ 58 private val extedVs1 = Wire(UInt(VLEN.W)) 59 60 // modules 61 private val scalaDupToVector = Module(new ScalaDupToVector(VLEN)) 62 63 scalaDupToVector.io.in.scalaData := inData.src(0) 64 scalaDupToVector.io.in.vsew := vsew 65 extedVs1 := scalaDupToVector.io.out.vecData 66 67 private val src0 = Mux(vecCtrl.needScalaSrc, extedVs1, inData.src(0)) // vs1, rs1, fs1, imm 68 private val src1 = WireInit(inData.src(1)) // vs2 only 69 if(cfg == FuConfig.VfaluCfg){ 70 val vs2Fold = Wire(UInt(VLEN.W)) 71 vs2Fold := Mux1H( 72 Seq( 73 vecCtrl.fpu.isFoldTo1_2 -> inData.src(1)(VLEN/1-1, VLEN/2), 74 vecCtrl.fpu.isFoldTo1_4 -> inData.src(1)(VLEN/2-1, VLEN/4), 75 vecCtrl.fpu.isFoldTo1_8 -> inData.src(1)(VLEN/4-1, VLEN/8), 76 ) 77 ) 78 src1 := Mux(vecCtrl.fpu.isFoldTo1_2 || vecCtrl.fpu.isFoldTo1_4 || vecCtrl.fpu.isFoldTo1_8, vs2Fold, inData.src(1)) 79 } 80 protected val vs2 = Mux(isReverse, src0, src1) 81 protected val vs1 = Mux(isReverse, src1, src0) 82 protected val oldVd = inData.src(2) 83 84 protected val outCtrl = ctrlVec.last 85 protected val outData = dataVec.last 86 87 protected val outVecCtrl = outCtrl.vpu.get 88 protected val outVm = outVecCtrl.vm 89 90 // vadc.vv, vsbc.vv need this 91 protected val outNeedClearMask: Bool = VialuFixType.needClearMask(outCtrl.fuOpType) 92 93 protected val outVConfig = if(!cfg.vconfigWakeUp) outCtrl.vpu.get.vconfig else outData.getSrcVConfig.asTypeOf(new VConfig) 94 protected val outVl = outVConfig.vl 95 protected val outOldVd = outData.src(2) 96 // There is no difference between control-dependency or data-dependency for function unit, 97 // but spliting these in ctrl or data bundles is easy to coding. 98 protected val outSrcMask: UInt = if (!cfg.maskWakeUp) outCtrl.vpu.get.vmask else { 99 MuxCase( 100 outData.getSrcMask, Seq( 101 outNeedClearMask -> allMaskFalse, 102 outVm -> allMaskTrue 103 ) 104 ) 105 } 106 107 override def latency: Int = cfg.latency.latencyVal.get 108 109} 110