xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/VldMergeUnit.scala (revision 37dc33949b1b3bf955b414e5ed3f9da727650b48)
1e703da02SzhanglyGitpackage xiangshan.backend.datapath
2e703da02SzhanglyGit
31f3d1b4dSXuan Huimport org.chipsalliance.cde.config.Parameters
4e703da02SzhanglyGitimport chisel3._
5e703da02SzhanglyGitimport chisel3.util._
6e703da02SzhanglyGitimport xiangshan._
798d3cb16SXuan Huimport xiangshan.backend.Bundles.{ExuOutput, MemExuOutput}
8e703da02SzhanglyGitimport xiangshan.backend.exu.ExeUnitParams
984286fdbSAnzoooooimport xiangshan.backend.fu.vector.{ByteMaskTailGen, Mgu, VldMgu, VecInfo}
10c90e3eacSZiyue Zhangimport xiangshan.mem.GenUSMaskRegVL
1198d3cb16SXuan Huimport yunsuan.vector.SewOH
12e703da02SzhanglyGit
13e703da02SzhanglyGitclass VldMergeUnit(val params: ExeUnitParams)(implicit p: Parameters) extends XSModule {
14e703da02SzhanglyGit  val io = IO(new VldMergeUnitIO(params))
15e703da02SzhanglyGit
16e703da02SzhanglyGit  io.writeback.ready := io.writebackAfterMerge.ready
1781535d7bSsinsanction
18e703da02SzhanglyGit  val wbReg = Reg(Valid(new ExuOutput(params)))
1984286fdbSAnzooooo  val mgu = Module(new VldMgu(VLEN))
20e703da02SzhanglyGit  val vdAfterMerge = Wire(UInt(VLEN.W))
21e703da02SzhanglyGit
2298d3cb16SXuan Hu  val wbFire = !io.writeback.bits.robIdx.needFlush(io.flush) && io.writeback.fire
23*37dc3394Sxiaofeibao  wbReg.bits := Mux(io.writeback.fire, io.writeback.bits, wbReg.bits)
2498d3cb16SXuan Hu  wbReg.valid := wbFire
25618b89e6Slewislzh  mgu.io.in.vd := wbReg.bits.data(0)
26382346a1Szhanglinjuan  // oldVd is contained in data and is already masked with new data
27618b89e6Slewislzh  mgu.io.in.oldVd := wbReg.bits.data(0)
28140150aaSXuan Hu  mgu.io.in.mask := Mux(wbReg.bits.vls.get.vpu.vm, Fill(VLEN, 1.U(1.W)), wbReg.bits.vls.get.vpu.vmask)
29caa6eb92SXuan Hu  mgu.io.in.info.valid := wbReg.valid
30c90e3eacSZiyue Zhang  mgu.io.in.info.ta := wbReg.bits.vls.get.isMasked || wbReg.bits.vls.get.vpu.vta
31caa6eb92SXuan Hu  mgu.io.in.info.ma := wbReg.bits.vls.get.vpu.vma
3278d8a599SZiyue Zhang  mgu.io.in.info.vl := wbReg.bits.vls.get.vpu.vl
33caa6eb92SXuan Hu  mgu.io.in.info.vstart := wbReg.bits.vls.get.vpu.vstart
34caa6eb92SXuan Hu  mgu.io.in.info.eew := wbReg.bits.vls.get.vpu.veew
35caa6eb92SXuan Hu  mgu.io.in.info.vsew := wbReg.bits.vls.get.vpu.vsew
36dbc1c7fcSzhanglinjuan  mgu.io.in.info.vdIdx := wbReg.bits.vls.get.vdIdxInField
37caa6eb92SXuan Hu  mgu.io.in.info.vlmul := wbReg.bits.vls.get.vpu.vlmul
3898d3cb16SXuan Hu  mgu.io.in.info.narrow := false.B  // never narrow
3998d3cb16SXuan Hu  mgu.io.in.info.dstMask := false.B // vlm need not mask
4092c6b7edSzhanglinjuan  mgu.io.in.isIndexedVls := wbReg.bits.vls.get.isIndexed
4198d3cb16SXuan Hu
4264446756SAnzooooo  //For the uop whose vl is modified by first-only-fault, the data written back can be used directly
4364446756SAnzooooo  vdAfterMerge := Mux(wbReg.bits.vlWen.getOrElse(false.B), wbReg.bits.data(0), mgu.io.out.vd)
44e703da02SzhanglyGit
45e703da02SzhanglyGit  io.writebackAfterMerge.valid := wbReg.valid
46e703da02SzhanglyGit  io.writebackAfterMerge.bits := wbReg.bits
4746908ecfSXuan Hu  io.writebackAfterMerge.bits.vecWen.foreach(_ := wbReg.bits.vecWen.get)
4845d40ce7Ssinsanction  io.writebackAfterMerge.bits.v0Wen.foreach(_ := wbReg.bits.v0Wen.get)
49618b89e6Slewislzh  io.writebackAfterMerge.bits.data := VecInit(Seq.fill(params.wbPathNum)(vdAfterMerge))
50e703da02SzhanglyGit}
51e703da02SzhanglyGit
5298d3cb16SXuan Huclass VldMergeUnitIO(param: ExeUnitParams)(implicit p: Parameters) extends XSBundle {
53e703da02SzhanglyGit  val flush = Flipped(ValidIO(new Redirect))
5498d3cb16SXuan Hu  val writeback = Flipped(DecoupledIO(new ExuOutput(param)))
5598d3cb16SXuan Hu  val writebackAfterMerge = DecoupledIO(new ExuOutput(param))
56e703da02SzhanglyGit}