xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/VldMergeUnit.scala (revision 7531c765d87d92e3c772b0d55aa810c2041ba3e3)
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}