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