1package xiangshan.backend.fu.vector 2 3import org.chipsalliance.cde.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import utility.DataHoldBypass 7import xiangshan.backend.fu.vector.Bundles.VConfig 8import xiangshan.backend.fu.vector.utils.ScalaDupToVector 9import xiangshan.backend.fu.{FuConfig, FuncUnit} 10import xiangshan.ExceptionNO.illegalInstr 11import yunsuan.VialuFixType 12 13class VecNonPipedFuncUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) 14 with VecFuncUnitAlias 15{ 16 private val extedVs1 = Wire(UInt(VLEN.W)) 17 18 // modules 19 private val scalaDupToVector = Module(new ScalaDupToVector(VLEN)) 20 21 scalaDupToVector.io.in.scalaData := inData.src(0) 22 scalaDupToVector.io.in.vsew := vsew 23 extedVs1 := scalaDupToVector.io.out.vecData 24 25 private val src0 = Mux(vecCtrl.needScalaSrc, extedVs1, inData.src(0)) // vs1, rs1, fs1, imm 26 private val src1 = WireInit(inData.src(1)) // vs2 only 27 28 protected val vs2 = Mux(isReverse, src0, src1) 29 protected val vs1 = Mux(isReverse, src1, src0) 30 protected val oldVd = inData.src(2) 31 32 protected val outCtrl = DataHoldBypass(io.in.bits.ctrl, io.in.fire) 33 protected val outData = DataHoldBypass(io.in.bits.data, io.in.fire) 34 35 protected val outVecCtrl = outCtrl.vpu.get 36 protected val outVm = outVecCtrl.vm 37 38 // vadc.vv, vsbc.vv need this 39 protected val outNeedClearMask: Bool = VialuFixType.needClearMask(outCtrl.fuOpType) 40 41 protected val outVConfig = if(!cfg.vconfigWakeUp) outCtrl.vpu.get.vconfig else outData.getSrcVConfig.asTypeOf(new VConfig) 42 protected val outVl = outVConfig.vl 43 protected val outVstart = outVecCtrl.vstart 44 protected val outOldVd = outData.src(2) 45 // There is no difference between control-dependency or data-dependency for function unit, 46 // but spliting these in ctrl or data bundles is easy to coding. 47 protected val outSrcMask: UInt = if (!cfg.maskWakeUp) outCtrl.vpu.get.vmask else { 48 MuxCase( 49 outData.getSrcMask, Seq( 50 outNeedClearMask -> allMaskFalse, 51 outVm -> allMaskTrue 52 ) 53 ) 54 } 55 56 // vstart illegal 57 if (cfg.exceptionOut.nonEmpty) { 58 val outVstart = outCtrl.vpu.get.vstart 59 val vstartIllegal = outVstart =/= 0.U 60 io.out.bits.ctrl.exceptionVec.get := 0.U.asTypeOf(io.out.bits.ctrl.exceptionVec.get) 61 io.out.bits.ctrl.exceptionVec.get(illegalInstr) := vstartIllegal 62 } 63 64 connectNonPipedCtrlSingal 65} 66