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