xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/VecNonPipedFuncUnit.scala (revision d33803b9eb9827a38aef3e2450b0189665c9d94f)
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 src0 = inData.src(0)
17  private val src1 = WireInit(inData.src(1)) // vs2 only
18
19  protected val vs2 = src1
20  protected val vs1 = src0
21  protected val oldVd = inData.src(2)
22
23  protected val outCtrl     = DataHoldBypass(io.in.bits.ctrl, io.in.fire)
24  protected val outData     = DataHoldBypass(io.in.bits.data, io.in.fire)
25
26  protected val outVecCtrl  = outCtrl.vpu.get
27  protected val outVm       = outVecCtrl.vm
28
29  // vadc.vv, vsbc.vv need this
30  protected val outNeedClearMask: Bool = VialuFixType.needClearMask(outCtrl.fuOpType)
31
32  protected val outVConfig  = if(!cfg.vconfigWakeUp) outCtrl.vpu.get.vconfig else outData.getSrcVConfig.asTypeOf(new VConfig)
33  protected val outVl       = outVConfig.vl
34  protected val outVstart   = outVecCtrl.vstart
35  protected val outOldVd    = outData.src(2)
36  // There is no difference between control-dependency or data-dependency for function unit,
37  // but spliting these in ctrl or data bundles is easy to coding.
38  protected val outSrcMask: UInt = if (!cfg.maskWakeUp) outCtrl.vpu.get.vmask else {
39    MuxCase(
40      outData.getSrcMask, Seq(
41        outNeedClearMask -> allMaskFalse,
42        outVm -> allMaskTrue
43      )
44    )
45  }
46
47  // vstart illegal
48  if (cfg.exceptionOut.nonEmpty) {
49    val outVstart = outCtrl.vpu.get.vstart
50    val vstartIllegal = outVstart =/= 0.U
51    io.out.bits.ctrl.exceptionVec.get := 0.U.asTypeOf(io.out.bits.ctrl.exceptionVec.get)
52    io.out.bits.ctrl.exceptionVec.get(illegalInstr) := vstartIllegal
53  }
54
55  connectNonPipedCtrlSingal
56}
57