1e69876fbSZiyue Zhangpackage xiangshan.backend.fu.vector 2e69876fbSZiyue Zhang 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4e69876fbSZiyue Zhangimport chisel3._ 5e69876fbSZiyue Zhangimport chisel3.util._ 6e69876fbSZiyue Zhangimport utility.DataHoldBypass 7e69876fbSZiyue Zhangimport xiangshan.backend.fu.vector.Bundles.VConfig 8e69876fbSZiyue Zhangimport xiangshan.backend.fu.vector.utils.ScalaDupToVector 9e69876fbSZiyue Zhangimport xiangshan.backend.fu.{FuConfig, FuncUnit} 109a46f19dSsinsanctionimport xiangshan.ExceptionNO.illegalInstr 11e69876fbSZiyue Zhangimport yunsuan.VialuFixType 12e69876fbSZiyue Zhang 13e69876fbSZiyue Zhangclass VecNonPipedFuncUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) 14e69876fbSZiyue Zhang with VecFuncUnitAlias 15e69876fbSZiyue Zhang{ 16395c8649SZiyue-Zhang private val src0 = inData.src(0) 17e69876fbSZiyue Zhang private val src1 = WireInit(inData.src(1)) // vs2 only 18e69876fbSZiyue Zhang 19*d33803b9Slewislzh protected val vs2 = src1 20*d33803b9Slewislzh protected val vs1 = src0 21e69876fbSZiyue Zhang protected val oldVd = inData.src(2) 22e69876fbSZiyue Zhang 23e69876fbSZiyue Zhang protected val outCtrl = DataHoldBypass(io.in.bits.ctrl, io.in.fire) 24e69876fbSZiyue Zhang protected val outData = DataHoldBypass(io.in.bits.data, io.in.fire) 25e69876fbSZiyue Zhang 26e69876fbSZiyue Zhang protected val outVecCtrl = outCtrl.vpu.get 27e69876fbSZiyue Zhang protected val outVm = outVecCtrl.vm 28e69876fbSZiyue Zhang 29e69876fbSZiyue Zhang // vadc.vv, vsbc.vv need this 30e69876fbSZiyue Zhang protected val outNeedClearMask: Bool = VialuFixType.needClearMask(outCtrl.fuOpType) 31e69876fbSZiyue Zhang 32e69876fbSZiyue Zhang protected val outVConfig = if(!cfg.vconfigWakeUp) outCtrl.vpu.get.vconfig else outData.getSrcVConfig.asTypeOf(new VConfig) 33e69876fbSZiyue Zhang protected val outVl = outVConfig.vl 34daae8f22SZiyue Zhang protected val outVstart = outVecCtrl.vstart 35e69876fbSZiyue Zhang protected val outOldVd = outData.src(2) 36e69876fbSZiyue Zhang // There is no difference between control-dependency or data-dependency for function unit, 37e69876fbSZiyue Zhang // but spliting these in ctrl or data bundles is easy to coding. 38e69876fbSZiyue Zhang protected val outSrcMask: UInt = if (!cfg.maskWakeUp) outCtrl.vpu.get.vmask else { 39e69876fbSZiyue Zhang MuxCase( 40e69876fbSZiyue Zhang outData.getSrcMask, Seq( 41e69876fbSZiyue Zhang outNeedClearMask -> allMaskFalse, 42e69876fbSZiyue Zhang outVm -> allMaskTrue 43e69876fbSZiyue Zhang ) 44e69876fbSZiyue Zhang ) 45e69876fbSZiyue Zhang } 46e69876fbSZiyue Zhang 479a46f19dSsinsanction // vstart illegal 489a46f19dSsinsanction if (cfg.exceptionOut.nonEmpty) { 499a46f19dSsinsanction val outVstart = outCtrl.vpu.get.vstart 509a46f19dSsinsanction val vstartIllegal = outVstart =/= 0.U 519a46f19dSsinsanction io.out.bits.ctrl.exceptionVec.get := 0.U.asTypeOf(io.out.bits.ctrl.exceptionVec.get) 529a46f19dSsinsanction io.out.bits.ctrl.exceptionVec.get(illegalInstr) := vstartIllegal 539a46f19dSsinsanction } 549a46f19dSsinsanction 55e69876fbSZiyue Zhang connectNonPipedCtrlSingal 56e69876fbSZiyue Zhang} 57