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}