1package xiangshan.backend.datapath 2 3import org.chipsalliance.cde.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import xiangshan._ 7import xiangshan.backend.Bundles.{ExuOutput, MemExuOutput} 8import xiangshan.backend.exu.ExeUnitParams 9import xiangshan.backend.fu.vector.{ByteMaskTailGen, Mgu, VecInfo} 10import yunsuan.vector.SewOH 11 12class VldMergeUnit(val params: ExeUnitParams)(implicit p: Parameters) extends XSModule { 13 val io = IO(new VldMergeUnitIO(params)) 14 15 io.writeback.ready := io.writebackAfterMerge.ready 16 io.oldVdReadAddr := io.writeback.bits.vls.get.oldVdPsrc 17 val wbReg = Reg(Valid(new ExuOutput(params))) 18 val mgu = Module(new Mgu(VLEN)) 19 val vdAfterMerge = Wire(UInt(VLEN.W)) 20 21 val wbFire = !io.writeback.bits.robIdx.needFlush(io.flush) && io.writeback.fire 22 wbReg.bits := Mux(wbFire, io.writeback.bits, wbReg.bits) 23 wbReg.valid := wbFire 24 mgu.io.in.vd := wbReg.bits.data 25 mgu.io.in.oldVd := io.oldVdReadData 26 mgu.io.in.mask := wbReg.bits.vls.get.vpu.vmask 27 mgu.io.in.info.valid := wbReg.valid 28 mgu.io.in.info.ta := wbReg.bits.vls.get.vpu.vta 29 mgu.io.in.info.ma := wbReg.bits.vls.get.vpu.vma 30 mgu.io.in.info.vl := wbReg.bits.vls.get.vpu.vl 31 mgu.io.in.info.vstart := wbReg.bits.vls.get.vpu.vstart 32 mgu.io.in.info.eew := wbReg.bits.vls.get.vpu.veew 33 mgu.io.in.info.vsew := wbReg.bits.vls.get.vpu.vsew 34 mgu.io.in.info.vdIdx := wbReg.bits.vls.get.vdIdx 35 mgu.io.in.info.vlmul := wbReg.bits.vls.get.vpu.vlmul 36 mgu.io.in.info.narrow := false.B // never narrow 37 mgu.io.in.info.dstMask := false.B // vlm need not mask 38 39 vdAfterMerge := mgu.io.out.vd 40 41 io.writebackAfterMerge.valid := wbReg.valid 42 io.writebackAfterMerge.bits := wbReg.bits 43 io.writebackAfterMerge.bits.vecWen.foreach(_ := true.B) 44 io.writebackAfterMerge.bits.data := vdAfterMerge 45} 46 47class VldMergeUnitIO(param: ExeUnitParams)(implicit p: Parameters) extends XSBundle { 48 val flush = Flipped(ValidIO(new Redirect)) 49 val writeback = Flipped(DecoupledIO(new ExuOutput(param))) 50 val oldVdReadData = Input(UInt(VLEN.W)) 51 val oldVdReadAddr = Output(UInt(PhyRegIdxWidth.W)) 52 val writebackAfterMerge = DecoupledIO(new ExuOutput(param)) 53}