xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/VecPipedFuncUnit.scala (revision 0fbf39af97167850145834e7d63bfe43c66c41e8)
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