xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision b9631a81484b7ee88324e617c25b5e48c6ee09a4)
15db4956bSzhanglyGitpackage xiangshan.backend.issue
25db4956bSzhanglyGit
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
45db4956bSzhanglyGitimport chisel3._
55db4956bSzhanglyGitimport chisel3.util._
65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper
7a6938b17Ssinsanctionimport utils._
84fa640e4Ssinsanctionimport utility._
95db4956bSzhanglyGitimport xiangshan._
105db4956bSzhanglyGitimport xiangshan.backend.Bundles._
115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData
125db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource
135db4956bSzhanglyGitimport xiangshan.backend.fu.FuType
145db4956bSzhanglyGitimport xiangshan.backend.fu.vector.Utils.NOnes
155db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr
16aa2bcc31SzhanglyGitimport xiangshan.mem.{LqPtr, MemWaitUpdateReq, SqPtr}
17aa2bcc31SzhanglyGitimport xiangshan.backend.issue.EntryBundles._
185db4956bSzhanglyGit
195db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
200721d1aaSXuan Hu  override def desiredName: String = params.getEntryName
210721d1aaSXuan Hu
2227811ea4SXuan Hu  require(params.numEnq <= 2, "number of enq should be no more than 2")
2327811ea4SXuan Hu
245db4956bSzhanglyGit  private val EnqEntryNum         = params.numEnq
255db4956bSzhanglyGit  private val OthersEntryNum      = params.numEntries - params.numEnq
2628607074Ssinsanction  private val SimpEntryNum        = params.numSimp
2728607074Ssinsanction  private val CompEntryNum        = params.numComp
285db4956bSzhanglyGit  val io = IO(new EntriesIO)
295db4956bSzhanglyGit
30c838dea1SXuan Hu  // only memAddrIQ use it
317e471bf8SXuan Hu  val memEtyResps: Seq[ValidIO[EntryDeqRespBundle]] = {
327e471bf8SXuan Hu    val resps =
33d3372210SzhanglyGit      if (params.isLdAddrIQ && !params.isStAddrIQ)                                                    //LDU
34dd40a82bSsinsanction        Seq(io.fromLoad.get.finalIssueResp, io.fromLoad.get.memAddrIssueResp)
35d3372210SzhanglyGit      else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ)                           //HYU
36dd40a82bSsinsanction        Seq(io.fromLoad.get.finalIssueResp, io.fromLoad.get.memAddrIssueResp, io.fromMem.get.fastResp, io.fromMem.get.slowResp)
377e471bf8SXuan Hu      else if (params.isStAddrIQ)                                                                     //STU
38dd40a82bSsinsanction        Seq(io.fromMem.get.slowResp)
398f3cbbcfSXuan Hu      else if (params.isVecLduIQ && params.isVecStuIQ) // Vector store IQ need no vecLdIn.resp, but for now vector store share the vector load IQ
40dd40a82bSsinsanction        Seq(io.vecLdIn.get.resp, io.fromMem.get.slowResp)
418f3cbbcfSXuan Hu      else if (params.isVecLduIQ)
42dd40a82bSsinsanction        Seq(io.vecLdIn.get.resp)
437e471bf8SXuan Hu      else if (params.isVecStuIQ)
44dd40a82bSsinsanction        Seq(io.fromMem.get.slowResp)
457e471bf8SXuan Hu      else Seq()
467e471bf8SXuan Hu    if (params.isMemAddrIQ) {
477e471bf8SXuan Hu      println(s"[${this.desiredName}] resp: {" +
487e471bf8SXuan Hu        s"og0Resp: ${resps.contains(io.og0Resp)}, " +
497e471bf8SXuan Hu        s"og1Resp: ${resps.contains(io.og1Resp)}, " +
507e471bf8SXuan Hu        s"finalResp: ${io.fromLoad.nonEmpty && resps.contains(io.fromLoad.get.finalIssueResp)}, " +
517e471bf8SXuan Hu        s"loadBorderResp: ${io.fromLoad.nonEmpty && resps.contains(io.fromLoad.get.memAddrIssueResp)}, " +
527e471bf8SXuan Hu        s"memFastResp: ${io.fromMem.nonEmpty && resps.contains(io.fromMem.get.fastResp)}, " +
537e471bf8SXuan Hu        s"memSlowResp: ${io.fromMem.nonEmpty && resps.contains(io.fromMem.get.slowResp)}, " +
547e471bf8SXuan Hu        s"vecLoadBorderResp: ${io.vecLdIn.nonEmpty && resps.contains(io.vecLdIn.get.resp)}, " +
557e471bf8SXuan Hu        s"}"
567e471bf8SXuan Hu      )
577e471bf8SXuan Hu    }
587e471bf8SXuan Hu    resps.flatten
59c838dea1SXuan Hu  }
60c838dea1SXuan Hu
61c38df446SzhanglyGit  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = {
62c38df446SzhanglyGit    if (params.inVfSchd)
63c38df446SzhanglyGit      VecInit(io.og0Resp, io.og1Resp, io.og2Resp.get, 0.U.asTypeOf(io.og0Resp))
64c38df446SzhanglyGit    else
65c38df446SzhanglyGit      VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp))
66c38df446SzhanglyGit  }
675db4956bSzhanglyGit
687e471bf8SXuan Hu
697e471bf8SXuan Hu
705db4956bSzhanglyGit  //Module
71df26db8aSsinsanction  val enqEntries          = Seq.fill(EnqEntryNum)(Module(EnqEntry(isComp = true)(p, params)))
7228607074Ssinsanction  val othersEntriesSimp   = Seq.fill(SimpEntryNum)(Module(OthersEntry(isComp = false)(p, params)))
7328607074Ssinsanction  val othersEntriesComp   = Seq.fill(CompEntryNum)(Module(OthersEntry(isComp = true)(p, params)))
7428607074Ssinsanction  val othersEntries       = othersEntriesSimp ++ othersEntriesComp
7528607074Ssinsanction  val othersTransPolicy   = OptionWrapper(params.isAllComp || params.isAllSimp, Module(new EnqPolicy))
7628607074Ssinsanction  val simpTransPolicy     = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy))
7728607074Ssinsanction  val compTransPolicy     = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy))
785db4956bSzhanglyGit
795db4956bSzhanglyGit  //Wire
80aa2bcc31SzhanglyGit  //entries status
815db4956bSzhanglyGit  val entries             = Wire(Vec(params.numEntries, ValidIO(new EntryBundle)))
82aa2bcc31SzhanglyGit  val robIdxVec           = Wire(Vec(params.numEntries, new RobPtr))
835db4956bSzhanglyGit  val validVec            = Wire(Vec(params.numEntries, Bool()))
845db4956bSzhanglyGit  val canIssueVec         = Wire(Vec(params.numEntries, Bool()))
855db4956bSzhanglyGit  val fuTypeVec           = Wire(Vec(params.numEntries, FuType()))
865db4956bSzhanglyGit  val isFirstIssueVec     = Wire(Vec(params.numEntries, Bool()))
875db4956bSzhanglyGit  val issueTimerVec       = Wire(Vec(params.numEntries, UInt(2.W)))
8899944b79Ssinsanction  val uopIdxVec           = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx())))
89aa2bcc31SzhanglyGit  //src status
90aa2bcc31SzhanglyGit  val dataSourceVec       = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
91ec49b127Ssinsanction  val loadDependencyVec   = Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))))
92aa2bcc31SzhanglyGit  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec()))))
93aa2bcc31SzhanglyGit  //deq sel
94aa2bcc31SzhanglyGit  val deqSelVec           = Wire(Vec(params.numEntries, Bool()))
95aa2bcc31SzhanglyGit  val issueRespVec        = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
965db4956bSzhanglyGit  val deqPortIdxWriteVec  = Wire(Vec(params.numEntries, UInt(1.W)))
975db4956bSzhanglyGit  val deqPortIdxReadVec   = Wire(Vec(params.numEntries, UInt(1.W)))
98aa2bcc31SzhanglyGit  //trans sel
9928607074Ssinsanction  val othersEntryEnqReadyVec = Wire(Vec(OthersEntryNum, Bool()))
10028607074Ssinsanction  val othersEntryEnqVec      = Wire(Vec(OthersEntryNum, Valid(new EntryBundle)))
10128607074Ssinsanction  val enqEntryTransVec       = Wire(Vec(EnqEntryNum, Valid(new EntryBundle)))
10228607074Ssinsanction  val simpEntryTransVec      = OptionWrapper(params.hasCompAndSimp, Wire(Vec(SimpEntryNum, Valid(new EntryBundle))))
10328607074Ssinsanction  val compEnqVec             = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(new EntryBundle))))
10428607074Ssinsanction
10528607074Ssinsanction  val enqCanTrans2Simp       = OptionWrapper(params.hasCompAndSimp, Wire(Bool()))
10628607074Ssinsanction  val enqCanTrans2Comp       = OptionWrapper(params.hasCompAndSimp, Wire(Bool()))
10728607074Ssinsanction  val simpCanTrans2Comp      = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Bool())))
10828607074Ssinsanction  val simpTransSelVec        = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(SimpEntryNum.W)))))
10928607074Ssinsanction  val compTransSelVec        = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(CompEntryNum.W)))))
11028607074Ssinsanction  val finalSimpTransSelVec   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(SimpEntryNum.W))))
11128607074Ssinsanction  val finalCompTransSelVec   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(CompEntryNum.W))))
11228607074Ssinsanction
11328607074Ssinsanction  val enqCanTrans2Others     = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Bool()))
11428607074Ssinsanction  val othersTransSelVec      = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W)))))
11528607074Ssinsanction  val finalOthersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, UInt(OthersEntryNum.W))))
11628607074Ssinsanction
11728607074Ssinsanction  val simpEntryEnqReadyVec   = othersEntryEnqReadyVec.take(SimpEntryNum)
11828607074Ssinsanction  val compEntryEnqReadyVec   = othersEntryEnqReadyVec.takeRight(CompEntryNum)
11928607074Ssinsanction  val simpEntryEnqVec        = othersEntryEnqVec.take(SimpEntryNum)
12028607074Ssinsanction  val compEntryEnqVec        = othersEntryEnqVec.takeRight(CompEntryNum)
121aa2bcc31SzhanglyGit  //debug
122a6938b17Ssinsanction  val entryInValidVec        = Wire(Vec(params.numEntries, Bool()))
123a6938b17Ssinsanction  val entryOutDeqValidVec    = Wire(Vec(params.numEntries, Bool()))
124a6938b17Ssinsanction  val entryOutTransValidVec  = Wire(Vec(params.numEntries, Bool()))
125e3ef3537Ssinsanction  val perfLdCancelVec        = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))))
126e3ef3537Ssinsanction  val perfOg0CancelVec       = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))))
127e3ef3537Ssinsanction  val perfWakeupByWBVec      = Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))
128e3ef3537Ssinsanction  val perfWakeupByIQVec      = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))))
129a4d38a63SzhanglyGit  //cancel bypass
130eea4a3caSzhanglyGit  val cancelBypassVec        = Wire(Vec(params.numEntries, Bool()))
1315db4956bSzhanglyGit
1325db4956bSzhanglyGit
1335db4956bSzhanglyGit  //enqEntries
1345db4956bSzhanglyGit  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
135aa2bcc31SzhanglyGit    enqEntry.io.commonIn.enq                  := io.enq(entryIdx)
13628607074Ssinsanction    enqEntry.io.commonIn.transSel             := (if (params.isAllComp || params.isAllSimp) enqCanTrans2Others.get && othersTransSelVec.get(entryIdx).valid
13728607074Ssinsanction                                                  else enqCanTrans2Simp.get && simpTransSelVec.get(entryIdx).valid || enqCanTrans2Comp.get && compTransSelVec.get(entryIdx).valid)
138aa2bcc31SzhanglyGit    EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx)
1394fa640e4Ssinsanction    enqEntry.io.enqDelayIn1.wakeUpFromWB      := RegEnable(io.wakeUpFromWB, io.enq(entryIdx).valid)
1404fa640e4Ssinsanction    enqEntry.io.enqDelayIn1.wakeUpFromIQ      := RegEnable(io.wakeUpFromIQ, io.enq(entryIdx).valid)
14191f31488Sxiaofeibao-xjtu    enqEntry.io.enqDelayIn1.srcLoadDependency := RegEnable(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), io.enq(entryIdx).valid)
1424fa640e4Ssinsanction    enqEntry.io.enqDelayIn1.og0Cancel         := RegNext(io.og0Cancel.asUInt)
1434fa640e4Ssinsanction    enqEntry.io.enqDelayIn1.ldCancel          := RegNext(io.ldCancel)
1444fa640e4Ssinsanction    // note: these signals with 2 cycle delay should not be enabled by io.enq.valid
1454fa640e4Ssinsanction    enqEntry.io.enqDelayIn2.wakeUpFromWB      := DelayN(io.wakeUpFromWB, 2)
1464fa640e4Ssinsanction    enqEntry.io.enqDelayIn2.wakeUpFromIQ      := DelayN(io.wakeUpFromIQ, 2)
14791f31488Sxiaofeibao-xjtu    enqEntry.io.enqDelayIn2.srcLoadDependency := DelayN(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), 2)
1484fa640e4Ssinsanction    enqEntry.io.enqDelayIn2.og0Cancel         := DelayN(io.og0Cancel.asUInt, 2)
1494fa640e4Ssinsanction    enqEntry.io.enqDelayIn2.ldCancel          := DelayN(io.ldCancel, 2)
15028607074Ssinsanction    enqEntryTransVec(entryIdx)                := enqEntry.io.commonOut.transEntry
1515db4956bSzhanglyGit  }
1525db4956bSzhanglyGit  //othersEntries
1535db4956bSzhanglyGit  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
15428607074Ssinsanction    othersEntry.io.commonIn.enq               := othersEntryEnqVec(entryIdx)
15528607074Ssinsanction    othersEntry.io.commonIn.transSel          := (if (params.hasCompAndSimp && (entryIdx < SimpEntryNum))
15628607074Ssinsanction                                                    io.simpEntryDeqSelVec.get.zip(simpCanTrans2Comp.get).map(x => x._1(entryIdx) && x._2).reduce(_ | _)
15728607074Ssinsanction                                                  else false.B)
158aa2bcc31SzhanglyGit    EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum)
15928607074Ssinsanction    othersEntryEnqReadyVec(entryIdx)          := othersEntry.io.commonOut.enqReady
16028607074Ssinsanction    if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) {
16128607074Ssinsanction      simpEntryTransVec.get(entryIdx)         := othersEntry.io.commonOut.transEntry
16228607074Ssinsanction    }
1635db4956bSzhanglyGit  }
1645db4956bSzhanglyGit
1655db4956bSzhanglyGit
1665db4956bSzhanglyGit  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
167aa2bcc31SzhanglyGit    val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2)
1685db4956bSzhanglyGit    deqPortIdxWrite := OHToUInt(deqVec)
1695db4956bSzhanglyGit    deqSel := deqVec.reduce(_ | _)
1705db4956bSzhanglyGit  }
1715db4956bSzhanglyGit
1725db4956bSzhanglyGit
17328607074Ssinsanction  if (params.isAllComp || params.isAllSimp) {
1745db4956bSzhanglyGit    //transPolicy
175*b9631a81Sxiaofeibao-xjtu    othersTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(OthersEntryNum).map(!_)).asUInt
176b43488b9Ssinsanction
177b43488b9Ssinsanction    // we only allow all or none of the enq entries transfering to others entries.
178*b9631a81Sxiaofeibao-xjtu    enqCanTrans2Others.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(OthersEntryNum).map(!_))
179b43488b9Ssinsanction    // othersTransSelVec(i) is the target others entry for enq entry [i].
180b43488b9Ssinsanction    // note that dispatch does not guarantee the validity of enq entries with low index.
181b43488b9Ssinsanction    // that means in some cases enq entry [0] is invalid while enq entry [1] is valid.
182b43488b9Ssinsanction    // in this case, enq entry [1] should use result [0] of TransPolicy.
18328607074Ssinsanction    othersTransSelVec.get(0).valid := othersTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0)
18428607074Ssinsanction    othersTransSelVec.get(0).bits  := othersTransPolicy.get.io.enqSelOHVec(0).bits
1858321ef33Ssinsanction    if (params.numEnq == 2) {
18628607074Ssinsanction      othersTransSelVec.get(1).valid := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid)
18728607074Ssinsanction      othersTransSelVec.get(1).bits  := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).bits,  othersTransPolicy.get.io.enqSelOHVec(1).bits)
1888321ef33Ssinsanction    }
1898321ef33Ssinsanction
19028607074Ssinsanction    finalOthersTransSelVec.get.zip(othersTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) =>
19128607074Ssinsanction      finalOH := Fill(OthersEntryNum, enqCanTrans2Others.get && selOH.valid) & selOH.bits
1925db4956bSzhanglyGit    }
1935db4956bSzhanglyGit
19428607074Ssinsanction    //othersEntryEnq
19528607074Ssinsanction    othersEntryEnqVec.zipWithIndex.foreach { case (othersEntryEnq, othersIdx) =>
19628607074Ssinsanction      val othersEnqOH = finalOthersTransSelVec.get.map(_(othersIdx))
19728607074Ssinsanction      if (othersEnqOH.size == 1)
19828607074Ssinsanction        othersEntryEnq := Mux(othersEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head))
19928607074Ssinsanction      else
20028607074Ssinsanction        othersEntryEnq := Mux1H(othersEnqOH, enqEntryTransVec)
2015db4956bSzhanglyGit    }
20228607074Ssinsanction  }
20328607074Ssinsanction  else {
20428607074Ssinsanction    //transPolicy
20528607074Ssinsanction    simpTransPolicy.get.io.canEnq := VecInit(simpEntryEnqReadyVec).asUInt
20628607074Ssinsanction    compTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(CompEntryNum).map(!_)).asUInt
20728607074Ssinsanction
208b43488b9Ssinsanction    // we only allow all or none of the enq entries transfering to comp/simp entries.
209b43488b9Ssinsanction    // when all of simp entries are empty and comp entries are enough, transfer to comp entries.
210b43488b9Ssinsanction    // otherwise, transfer to simp entries.
21128607074Ssinsanction    enqCanTrans2Comp.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(CompEntryNum).map(!_)) && !validVec.drop(EnqEntryNum).take(SimpEntryNum).reduce(_ || _)
21228607074Ssinsanction    enqCanTrans2Simp.get := !enqCanTrans2Comp.get && PopCount(validVec.take(EnqEntryNum)) <= PopCount(simpEntryEnqReadyVec)
21328607074Ssinsanction    simpCanTrans2Comp.get.zipWithIndex.foreach { case (canTrans, idx) =>
21428607074Ssinsanction      canTrans := !enqCanTrans2Comp.get && PopCount(validVec.takeRight(CompEntryNum).map(!_)) >= (idx + 1).U
21528607074Ssinsanction    }
21628607074Ssinsanction
217b43488b9Ssinsanction    // simp/compTransSelVec(i) is the target simp/comp entry for enq entry [i].
218b43488b9Ssinsanction    // note that dispatch does not guarantee the validity of enq entries with low index.
219b43488b9Ssinsanction    // that means in some cases enq entry [0] is invalid while enq entry [1] is valid.
220b43488b9Ssinsanction    // in this case, enq entry [1] should use result [0] of TransPolicy.
22128607074Ssinsanction    simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0)
22228607074Ssinsanction    simpTransSelVec.get(0).bits  := simpTransPolicy.get.io.enqSelOHVec(0).bits
22328607074Ssinsanction    compTransSelVec.get(0).valid := compTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0)
22428607074Ssinsanction    compTransSelVec.get(0).bits  := compTransPolicy.get.io.enqSelOHVec(0).bits
22528607074Ssinsanction    if (params.numEnq == 2) {
22628607074Ssinsanction      simpTransSelVec.get(1).valid := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid)
22728607074Ssinsanction      simpTransSelVec.get(1).bits  := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).bits,  simpTransPolicy.get.io.enqSelOHVec(1).bits)
22828607074Ssinsanction      compTransSelVec.get(1).valid := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid)
22928607074Ssinsanction      compTransSelVec.get(1).bits  := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).bits,  compTransPolicy.get.io.enqSelOHVec(1).bits)
23028607074Ssinsanction    }
23128607074Ssinsanction
23228607074Ssinsanction    finalSimpTransSelVec.get.zip(simpTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) =>
23328607074Ssinsanction      finalOH := Fill(SimpEntryNum, enqCanTrans2Simp.get && selOH.valid) & selOH.bits
23428607074Ssinsanction    }
23528607074Ssinsanction    finalCompTransSelVec.get.zip(compTransSelVec.get).zip(compTransPolicy.get.io.enqSelOHVec).zipWithIndex.foreach {
23628607074Ssinsanction      case (((finalOH, selOH), origSelOH), enqIdx) =>
23728607074Ssinsanction        finalOH := Mux(enqCanTrans2Comp.get, Fill(CompEntryNum, selOH.valid) & selOH.bits, Fill(CompEntryNum, origSelOH.valid) & origSelOH.bits)
23828607074Ssinsanction    }
23928607074Ssinsanction
24028607074Ssinsanction    //othersEntryEnq
24128607074Ssinsanction    simpEntryEnqVec.zipWithIndex.foreach { case (simpEntryEnq, simpIdx) =>
24228607074Ssinsanction      val simpEnqOH = finalSimpTransSelVec.get.map(_(simpIdx))
24328607074Ssinsanction      // shit Mux1H directly returns in(0) if the seq has only 1 elements
24428607074Ssinsanction      if (simpEnqOH.size == 1)
24528607074Ssinsanction        simpEntryEnq := Mux(simpEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head))
24628607074Ssinsanction      else
24728607074Ssinsanction        simpEntryEnq := Mux1H(simpEnqOH, enqEntryTransVec)
24828607074Ssinsanction    }
24928607074Ssinsanction
25028607074Ssinsanction    compEnqVec.get.zip(enqEntryTransVec).zip(io.simpEntryDeqSelVec.get).foreach { case ((compEnq, enqEntry), deqSel) =>
25128607074Ssinsanction      compEnq := Mux(enqCanTrans2Comp.get, enqEntry, Mux1H(deqSel, simpEntryTransVec.get))
25228607074Ssinsanction    }
25328607074Ssinsanction    compEntryEnqVec.zipWithIndex.foreach { case (compEntryEnq, compIdx) =>
25428607074Ssinsanction      val compEnqOH = finalCompTransSelVec.get.map(_(compIdx))
25528607074Ssinsanction      // shit Mux1H directly returns in(0) if the seq has only 1 elements
25628607074Ssinsanction      if (compEnqOH.size == 1)
25728607074Ssinsanction        compEntryEnq := Mux(compEnqOH.head, compEnqVec.get.head, 0.U.asTypeOf(compEnqVec.get.head))
25828607074Ssinsanction      else
25928607074Ssinsanction        compEntryEnq := Mux1H(compEnqOH, compEnqVec.get)
26028607074Ssinsanction    }
26128607074Ssinsanction
26228607074Ssinsanction    assert(PopCount(simpEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of simpEntryEnq is more than numEnq\n")
26328607074Ssinsanction    assert(PopCount(compEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of compEntryEnq is more than numEnq\n")
26428607074Ssinsanction  }
26528607074Ssinsanction
2668d081717Sszw_kaixin  if(backendParams.debugEn) {
26728607074Ssinsanction    dontTouch(othersEntryEnqVec)
2688d081717Sszw_kaixin  }
2695db4956bSzhanglyGit
2705db4956bSzhanglyGit  //issueRespVec
271887f9c3dSzhanglinjuan  if (params.isVecMemIQ) {
272887f9c3dSzhanglinjuan    // vector memory IQ
273dd40a82bSsinsanction    issueRespVec.lazyZip(robIdxVec.lazyZip(uopIdxVec.get)).lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (robIdx, uopIdx), (issueTimer, deqPortIdx)) =>
274dd40a82bSsinsanction      val respInDatapath = resps(issueTimer(0))(deqPortIdx)
275dd40a82bSsinsanction      val respAfterDatapath = Wire(chiselTypeOf(respInDatapath))
276f7890d3cSXuan Hu      val hitRespsVec = VecInit(memEtyResps.map(x =>
277aa2bcc31SzhanglyGit        x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx.get === uopIdx
278f7890d3cSXuan Hu      ).toSeq)
279dd40a82bSsinsanction      respAfterDatapath.valid := hitRespsVec.reduce(_ | _)
280dd40a82bSsinsanction      respAfterDatapath.bits  := (if (memEtyResps.size == 1) memEtyResps.head.bits
281dd40a82bSsinsanction                                  else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq))
282dd40a82bSsinsanction      issueResp := Mux(issueTimer(1), respAfterDatapath, respInDatapath)
283887f9c3dSzhanglinjuan    }
284887f9c3dSzhanglinjuan  } else if (params.isMemAddrIQ) {
285887f9c3dSzhanglinjuan    // scalar memory IQ
286dd40a82bSsinsanction    issueRespVec.lazyZip(robIdxVec).lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, robIdx, (issueTimer, deqPortIdx)) =>
287dd40a82bSsinsanction      val respInDatapath = resps(issueTimer(0))(deqPortIdx)
288dd40a82bSsinsanction      val respAfterDatapath = Wire(chiselTypeOf(respInDatapath))
289c838dea1SXuan Hu      val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq)
290dd40a82bSsinsanction      respAfterDatapath.valid := hitRespsVec.reduce(_ | _)
291dd40a82bSsinsanction      respAfterDatapath.bits  := (if (memEtyResps.size == 1) memEtyResps.head.bits
292dd40a82bSsinsanction                                  else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq))
293dd40a82bSsinsanction      issueResp := Mux(issueTimer(1), respAfterDatapath, respInDatapath)
2945db4956bSzhanglyGit    }
2955db4956bSzhanglyGit  }
2965db4956bSzhanglyGit  else {
297dd40a82bSsinsanction    issueRespVec.lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (issueTimer, deqPortIdx)) =>
2985db4956bSzhanglyGit      val Resp = resps(issueTimer)(deqPortIdx)
2995db4956bSzhanglyGit      issueResp := Resp
3005db4956bSzhanglyGit    }
3015db4956bSzhanglyGit  }
3025db4956bSzhanglyGit
30340283787Ssinsanction  //deq
30428607074Ssinsanction  val enqEntryOldest          = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
30528607074Ssinsanction  val simpEntryOldest         = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
30628607074Ssinsanction  val compEntryOldest         = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
30728607074Ssinsanction  val othersEntryOldest       = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
30828607074Ssinsanction  val enqEntryOldestCancel    = Wire(Vec(params.numDeq, Bool()))
30928607074Ssinsanction  val simpEntryOldestCancel   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool())))
31028607074Ssinsanction  val compEntryOldestCancel   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool())))
31128607074Ssinsanction  val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool())))
31228607074Ssinsanction
31328607074Ssinsanction  io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) =>
31428607074Ssinsanction    enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum))
315eea4a3caSzhanglyGit    enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum))
31640283787Ssinsanction  }
31728607074Ssinsanction
31828607074Ssinsanction  if (params.isAllComp || params.isAllSimp) {
31928607074Ssinsanction    io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
32028607074Ssinsanction      othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum))
321eea4a3caSzhanglyGit      othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum))
322af4bd265SzhanglyGit    }
32340283787Ssinsanction  }
32428607074Ssinsanction  else {
32528607074Ssinsanction    io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
32628607074Ssinsanction      simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum))
327eea4a3caSzhanglyGit      simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum))
32828607074Ssinsanction    }
32928607074Ssinsanction    io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
33028607074Ssinsanction      compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum))
331eea4a3caSzhanglyGit      compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum))
33228607074Ssinsanction    }
333af4bd265SzhanglyGit  }
334cf4a131aSsinsanction
335cf4a131aSsinsanction  if (params.deqFuSame) {
336cf4a131aSsinsanction    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
337cf4a131aSsinsanction    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
338a4d38a63SzhanglyGit    val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool()))
339cf4a131aSsinsanction
340aa2bcc31SzhanglyGit    subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U
341aa2bcc31SzhanglyGit    subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U
34228607074Ssinsanction
34328607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
34428607074Ssinsanction      subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries)
34528607074Ssinsanction      subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
346eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec)
347eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse)
348cf4a131aSsinsanction
34928607074Ssinsanction      io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1))
350aa2bcc31SzhanglyGit      io.deqEntry(1) := subDeqPolicyEntryVec(0)
35128607074Ssinsanction      io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))
352a4d38a63SzhanglyGit      io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
35328607074Ssinsanction    }
35428607074Ssinsanction    else {
35528607074Ssinsanction      subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
35628607074Ssinsanction      subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries)
357eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse)
358eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec)
35928607074Ssinsanction
36028607074Ssinsanction      io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid,
36128607074Ssinsanction                            compEntryOldest.get(0),
36228607074Ssinsanction                            Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1)))
36328607074Ssinsanction      io.deqEntry(1) := subDeqPolicyEntryVec(0)
36428607074Ssinsanction      io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid,
36528607074Ssinsanction                                compEntryOldestCancel.get(0),
36628607074Ssinsanction                                Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)))
36728607074Ssinsanction      io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
36828607074Ssinsanction    }
369cf4a131aSsinsanction
370cf4a131aSsinsanction    when (subDeqPolicyValidVec(0)) {
371aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
37240283787Ssinsanction    }
373cf4a131aSsinsanction    when (subDeqPolicyValidVec(1)) {
374aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
375f7f73727Ssinsanction    }
376f7f73727Ssinsanction  }
377f7f73727Ssinsanction  else {
37828607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
37928607074Ssinsanction      io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) =>
38028607074Ssinsanction        io.deqEntry(i)     := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i))
38128607074Ssinsanction        io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i))
38228607074Ssinsanction      }
38328607074Ssinsanction    }
38428607074Ssinsanction    else {
38528607074Ssinsanction      io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) =>
38628607074Ssinsanction        io.deqEntry(i)     := Mux(compSel.valid,
38728607074Ssinsanction                                  compEntryOldest.get(i),
38828607074Ssinsanction                                  Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i)))
38928607074Ssinsanction        io.cancelDeqVec(i) := Mux(compSel.valid,
39028607074Ssinsanction                                  compEntryOldestCancel.get(i),
39128607074Ssinsanction                                  Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i)))
39228607074Ssinsanction      }
393af4bd265SzhanglyGit    }
394af4bd265SzhanglyGit  }
395af4bd265SzhanglyGit
3965db4956bSzhanglyGit  io.valid                          := validVec.asUInt
3975db4956bSzhanglyGit  io.canIssue                       := canIssueVec.asUInt
3985db4956bSzhanglyGit  io.fuType                         := fuTypeVec
3995db4956bSzhanglyGit  io.dataSources                    := dataSourceVec
400864480f4Sxiaofeibao-xjtu  io.srcWakeUpL1ExuOH.foreach(_     := srcWakeUpL1ExuOHVec.get)
401eea4a3caSzhanglyGit  io.loadDependency                 := loadDependencyVec
402aa2bcc31SzhanglyGit  io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) =>
403aa2bcc31SzhanglyGit    isFirstIssue                    := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec)
4048d081717Sszw_kaixin  }
40528607074Ssinsanction  io.simpEntryEnqSelVec.foreach(_   := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid)))
40628607074Ssinsanction  io.compEntryEnqSelVec.foreach(_   := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid)))
40728607074Ssinsanction  io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid)))
408aa2bcc31SzhanglyGit  io.robIdx.foreach(_               := robIdxVec)
409aa2bcc31SzhanglyGit  io.uopIdx.foreach(_               := uopIdxVec.get)
410aa2bcc31SzhanglyGit
4117e471bf8SXuan Hu
412aa2bcc31SzhanglyGit  def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = {
413aa2bcc31SzhanglyGit    in.flush                    := io.flush
414aa2bcc31SzhanglyGit    in.wakeUpFromWB             := io.wakeUpFromWB
415aa2bcc31SzhanglyGit    in.wakeUpFromIQ             := io.wakeUpFromIQ
416b6279fc6SZiyue Zhang    in.vlIsZero                 := io.vlIsZero
417b6279fc6SZiyue Zhang    in.vlIsVlmax                := io.vlIsVlmax
418aa2bcc31SzhanglyGit    in.og0Cancel                := io.og0Cancel
419aa2bcc31SzhanglyGit    in.og1Cancel                := io.og1Cancel
420aa2bcc31SzhanglyGit    in.ldCancel                 := io.ldCancel
421aa2bcc31SzhanglyGit    in.deqSel                   := deqSelVec(entryIdx)
422aa2bcc31SzhanglyGit    in.deqPortIdxWrite          := deqPortIdxWriteVec(entryIdx)
423aa2bcc31SzhanglyGit    in.issueResp                := issueRespVec(entryIdx)
424aa2bcc31SzhanglyGit    if (params.isVecMemIQ) {
425aa2bcc31SzhanglyGit      in.fromLsq.get.sqDeqPtr   := io.vecMemIn.get.sqDeqPtr
426aa2bcc31SzhanglyGit      in.fromLsq.get.lqDeqPtr   := io.vecMemIn.get.lqDeqPtr
427aa2bcc31SzhanglyGit    }
428aa2bcc31SzhanglyGit    validVec(entryIdx)          := out.valid
429aa2bcc31SzhanglyGit    canIssueVec(entryIdx)       := out.canIssue
430aa2bcc31SzhanglyGit    fuTypeVec(entryIdx)         := out.fuType
431aa2bcc31SzhanglyGit    robIdxVec(entryIdx)         := out.robIdx
432aa2bcc31SzhanglyGit    dataSourceVec(entryIdx)     := out.dataSource
433aa2bcc31SzhanglyGit    isFirstIssueVec(entryIdx)   := out.isFirstIssue
434aa2bcc31SzhanglyGit    entries(entryIdx)           := out.entry
435aa2bcc31SzhanglyGit    deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead
436aa2bcc31SzhanglyGit    issueTimerVec(entryIdx)     := out.issueTimerRead
437eea4a3caSzhanglyGit    loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency
438ec49b127Ssinsanction    cancelBypassVec(entryIdx)   := out.cancelBypass
439aa2bcc31SzhanglyGit    if (params.hasIQWakeUp) {
440aa2bcc31SzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx)     := out.srcWakeUpL1ExuOH.get
441aa2bcc31SzhanglyGit    }
442aa2bcc31SzhanglyGit    if (params.isVecMemIQ) {
443aa2bcc31SzhanglyGit      uopIdxVec.get(entryIdx)       := out.uopIdx.get
444aa2bcc31SzhanglyGit    }
445a6938b17Ssinsanction    entryInValidVec(entryIdx)       := out.entryInValid
446a6938b17Ssinsanction    entryOutDeqValidVec(entryIdx)   := out.entryOutDeqValid
447a6938b17Ssinsanction    entryOutTransValidVec(entryIdx) := out.entryOutTransValid
448e3ef3537Ssinsanction    perfWakeupByWBVec(entryIdx)     := out.perfWakeupByWB
449e3ef3537Ssinsanction    if (params.hasIQWakeUp) {
450e3ef3537Ssinsanction      perfLdCancelVec.get(entryIdx)   := out.perfLdCancel.get
451e3ef3537Ssinsanction      perfOg0CancelVec.get(entryIdx)  := out.perfOg0Cancel.get
452e3ef3537Ssinsanction      perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get
453aa2bcc31SzhanglyGit    }
454aa2bcc31SzhanglyGit  }
455a6938b17Ssinsanction
45625df626eSgood-circle  io.vecLdIn.foreach(dontTouch(_))
457a6938b17Ssinsanction
458a6938b17Ssinsanction  // entries perf counter
459a6938b17Ssinsanction  // enq
460a6938b17Ssinsanction  for (i <- 0 until params.numEnq) {
461a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i))
462a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i))
463a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i))
464a6938b17Ssinsanction  }
465a6938b17Ssinsanction  // simple
466a6938b17Ssinsanction  for (i <- 0 until params.numSimp) {
467a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq))
468a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq))
469a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq))
470a6938b17Ssinsanction  }
471a6938b17Ssinsanction  // complex
472a6938b17Ssinsanction  for (i <- 0 until params.numComp) {
473a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp))
474a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp))
475a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp))
476a6938b17Ssinsanction  }
477a6938b17Ssinsanction  // total
478a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq)))
479a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq)))
480a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq)))
481e3ef3537Ssinsanction  for (srcIdx <- 0 until params.numRegSrc) {
482e3ef3537Ssinsanction    XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx))))
483d280e426Slewislzh    if (params.hasIQWakeUp) {
484e3ef3537Ssinsanction      XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx))))
485e3ef3537Ssinsanction      XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx))))
486e3ef3537Ssinsanction      for (iqIdx <- 0 until params.numWakeupFromIQ) {
487e3ef3537Ssinsanction        XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx))))
488e3ef3537Ssinsanction      }
489e3ef3537Ssinsanction    }
490d280e426Slewislzh  }
491a6938b17Ssinsanction
492a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq)))
493a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq)))
494a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq)))
4957e471bf8SXuan Hu
496e3ef3537Ssinsanction  for (srcIdx <- 0 until params.numRegSrc) {
497e3ef3537Ssinsanction    XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx))))
498d280e426Slewislzh    if (params.hasIQWakeUp) {
499e3ef3537Ssinsanction      XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx))))
500e3ef3537Ssinsanction      XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx))))
501e3ef3537Ssinsanction      for (iqIdx <- 0 until params.numWakeupFromIQ) {
502e3ef3537Ssinsanction        XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx))))
503e3ef3537Ssinsanction      }
504e3ef3537Ssinsanction    }
505e3ef3537Ssinsanction  }
506e3ef3537Ssinsanction
507e3ef3537Ssinsanction  for (t <- FuType.functionNameMap.keys) {
508e3ef3537Ssinsanction    val fuName = FuType.functionNameMap(t)
509e3ef3537Ssinsanction    if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) {
510e3ef3537Ssinsanction      for (srcIdx <- 0 until params.numRegSrc) {
511e3ef3537Ssinsanction        XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
512e3ef3537Ssinsanction        if (params.hasIQWakeUp) {
513e3ef3537Ssinsanction          XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
514e3ef3537Ssinsanction          XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
515e3ef3537Ssinsanction          for (iqIdx <- 0 until params.numWakeupFromIQ) {
516e3ef3537Ssinsanction            XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx)(iqIdx) && fu(t.id) }))
517e3ef3537Ssinsanction          }
518e3ef3537Ssinsanction        }
519e3ef3537Ssinsanction      }
520e3ef3537Ssinsanction    }
521d280e426Slewislzh  }
522aa2bcc31SzhanglyGit}
523aa2bcc31SzhanglyGit
524aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
525aa2bcc31SzhanglyGit  val flush               = Flipped(ValidIO(new Redirect))
526aa2bcc31SzhanglyGit  //enq
527aa2bcc31SzhanglyGit  val enq                 = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
528aa2bcc31SzhanglyGit  val og0Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
529aa2bcc31SzhanglyGit  val og1Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
530c38df446SzhanglyGit  val og2Resp             = OptionWrapper(params.inVfSchd, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))))
531aa2bcc31SzhanglyGit  //deq sel
532aa2bcc31SzhanglyGit  val deqReady            = Vec(params.numDeq, Input(Bool()))
533aa2bcc31SzhanglyGit  val deqSelOH            = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W))))
534aa2bcc31SzhanglyGit  val enqEntryOldestSel   = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W))))
53528607074Ssinsanction  val simpEntryOldestSel  = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W)))))
53628607074Ssinsanction  val compEntryOldestSel  = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W)))))
53728607074Ssinsanction  val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))))
538aa2bcc31SzhanglyGit  val subDeqRequest       = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
539aa2bcc31SzhanglyGit  val subDeqSelOH         = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
540aa2bcc31SzhanglyGit  // wakeup
541aa2bcc31SzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
542aa2bcc31SzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
543b6279fc6SZiyue Zhang  val vlIsZero            = Input(Bool())
544b6279fc6SZiyue Zhang  val vlIsVlmax           = Input(Bool())
545aa2bcc31SzhanglyGit  val og0Cancel           = Input(ExuOH(backendParams.numExu))
546aa2bcc31SzhanglyGit  val og1Cancel           = Input(ExuOH(backendParams.numExu))
547aa2bcc31SzhanglyGit  val ldCancel            = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO))
548aa2bcc31SzhanglyGit  //entries status
549aa2bcc31SzhanglyGit  val valid               = Output(UInt(params.numEntries.W))
550aa2bcc31SzhanglyGit  val canIssue            = Output(UInt(params.numEntries.W))
551aa2bcc31SzhanglyGit  val fuType              = Vec(params.numEntries, Output(FuType()))
552aa2bcc31SzhanglyGit  val dataSources         = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource())))
553ec49b127Ssinsanction  val loadDependency      = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W)))
554864480f4Sxiaofeibao-xjtu  val srcWakeUpL1ExuOH    = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuVec()))))
555aa2bcc31SzhanglyGit  //deq status
556aa2bcc31SzhanglyGit  val isFirstIssue        = Vec(params.numDeq, Output(Bool()))
557aa2bcc31SzhanglyGit  val deqEntry            = Vec(params.numDeq, ValidIO(new EntryBundle))
558aa2bcc31SzhanglyGit  val cancelDeqVec        = Vec(params.numDeq, Output(Bool()))
559e07131b2Ssinsanction
560e07131b2Ssinsanction  // load/hybird only
561e07131b2Ssinsanction  val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle {
562e07131b2Ssinsanction    val finalIssueResp    = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
563e07131b2Ssinsanction    val memAddrIssueResp  = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
564e07131b2Ssinsanction  })
565aa2bcc31SzhanglyGit  // mem only
566e07131b2Ssinsanction  val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle {
567aa2bcc31SzhanglyGit    val slowResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
568d3372210SzhanglyGit    val fastResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
569e07131b2Ssinsanction  })
57099944b79Ssinsanction  // vec mem only
571aa2bcc31SzhanglyGit  val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle {
572aa2bcc31SzhanglyGit    val sqDeqPtr          = Input(new SqPtr)
573aa2bcc31SzhanglyGit    val lqDeqPtr          = Input(new LqPtr)
574aa2bcc31SzhanglyGit  })
5757e471bf8SXuan Hu  val vecLdIn = OptionWrapper(params.isVecLduIQ, new Bundle {
5767e471bf8SXuan Hu    val resp              = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
5777e471bf8SXuan Hu  })
578aa2bcc31SzhanglyGit  val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr)))
579aa2bcc31SzhanglyGit  val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx())))
580aa2bcc31SzhanglyGit
58128607074Ssinsanction  // trans
58228607074Ssinsanction  val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W))))
58328607074Ssinsanction  val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W))))
58428607074Ssinsanction  val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W))))
58528607074Ssinsanction  val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W))))
586aa2bcc31SzhanglyGit
587aa2bcc31SzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
5885db4956bSzhanglyGit}
589