xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision e3ef35374bc4c123929012a150bc1cb53a3dc3fc)
15db4956bSzhanglyGitpackage xiangshan.backend.issue
25db4956bSzhanglyGit
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
45db4956bSzhanglyGitimport chisel3._
55db4956bSzhanglyGitimport chisel3.util._
65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper
7a6938b17Ssinsanctionimport utils._
85db4956bSzhanglyGitimport xiangshan._
95db4956bSzhanglyGitimport xiangshan.backend.Bundles._
105db4956bSzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData
115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource
125db4956bSzhanglyGitimport xiangshan.backend.fu.FuType
135db4956bSzhanglyGitimport xiangshan.backend.fu.vector.Utils.NOnes
145db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr
15aa2bcc31SzhanglyGitimport xiangshan.mem.{LqPtr, MemWaitUpdateReq, SqPtr}
16aa2bcc31SzhanglyGitimport xiangshan.backend.issue.EntryBundles._
175db4956bSzhanglyGit
185db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
190721d1aaSXuan Hu  override def desiredName: String = params.getEntryName
200721d1aaSXuan Hu
2127811ea4SXuan Hu  require(params.numEnq <= 2, "number of enq should be no more than 2")
2227811ea4SXuan Hu
235db4956bSzhanglyGit  private val EnqEntryNum         = params.numEnq
245db4956bSzhanglyGit  private val OthersEntryNum      = params.numEntries - params.numEnq
2528607074Ssinsanction  private val SimpEntryNum        = params.numSimp
2628607074Ssinsanction  private val CompEntryNum        = params.numComp
275db4956bSzhanglyGit  val io = IO(new EntriesIO)
285db4956bSzhanglyGit
29c838dea1SXuan Hu  // only memAddrIQ use it
30c838dea1SXuan Hu  val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = {
31d3372210SzhanglyGit    if (params.isLdAddrIQ && !params.isStAddrIQ)                                                    //LDU
32e07131b2Ssinsanction      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromLoad.get.finalIssueResp ++ io.fromLoad.get.memAddrIssueResp)
33d3372210SzhanglyGit    else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ)                           //HYU
34e07131b2Ssinsanction      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromLoad.get.finalIssueResp ++ io.fromLoad.get.memAddrIssueResp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
35e07131b2Ssinsanction    else if (params.isMemAddrIQ)                                                                    //STU, VLDU, VSTU
366462eb1cSzhanglyGit      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.slowResp)
37c838dea1SXuan Hu    else MixedVecInit(Seq())
38c838dea1SXuan Hu  }
39c838dea1SXuan Hu
40c38df446SzhanglyGit  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = {
41c38df446SzhanglyGit    if (params.inVfSchd)
42c38df446SzhanglyGit      VecInit(io.og0Resp, io.og1Resp, io.og2Resp.get, 0.U.asTypeOf(io.og0Resp))
43c38df446SzhanglyGit    else
44c38df446SzhanglyGit      VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp))
45c38df446SzhanglyGit  }
465db4956bSzhanglyGit
475db4956bSzhanglyGit  //Module
48df26db8aSsinsanction  val enqEntries          = Seq.fill(EnqEntryNum)(Module(EnqEntry(isComp = true)(p, params)))
4928607074Ssinsanction  val othersEntriesSimp   = Seq.fill(SimpEntryNum)(Module(OthersEntry(isComp = false)(p, params)))
5028607074Ssinsanction  val othersEntriesComp   = Seq.fill(CompEntryNum)(Module(OthersEntry(isComp = true)(p, params)))
5128607074Ssinsanction  val othersEntries       = othersEntriesSimp ++ othersEntriesComp
5228607074Ssinsanction  val othersTransPolicy   = OptionWrapper(params.isAllComp || params.isAllSimp, Module(new EnqPolicy))
5328607074Ssinsanction  val simpTransPolicy     = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy))
5428607074Ssinsanction  val compTransPolicy     = OptionWrapper(params.hasCompAndSimp, Module(new EnqPolicy))
555db4956bSzhanglyGit
565db4956bSzhanglyGit  //Wire
57aa2bcc31SzhanglyGit  //entries status
585db4956bSzhanglyGit  val entries             = Wire(Vec(params.numEntries, ValidIO(new EntryBundle)))
59aa2bcc31SzhanglyGit  val robIdxVec           = Wire(Vec(params.numEntries, new RobPtr))
605db4956bSzhanglyGit  val validVec            = Wire(Vec(params.numEntries, Bool()))
615db4956bSzhanglyGit  val canIssueVec         = Wire(Vec(params.numEntries, Bool()))
625db4956bSzhanglyGit  val fuTypeVec           = Wire(Vec(params.numEntries, FuType()))
635db4956bSzhanglyGit  val isFirstIssueVec     = Wire(Vec(params.numEntries, Bool()))
645db4956bSzhanglyGit  val issueTimerVec       = Wire(Vec(params.numEntries, UInt(2.W)))
6599944b79Ssinsanction  val uopIdxVec           = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx())))
66aa2bcc31SzhanglyGit  //src status
67aa2bcc31SzhanglyGit  val dataSourceVec       = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
68eea4a3caSzhanglyGit  val loadDependencyVec   = Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(3.W))))
69eea4a3caSzhanglyGit  val srcLoadDependencyVec= Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W)))))
70aa2bcc31SzhanglyGit  val srcTimerVec         = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
71aa2bcc31SzhanglyGit  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec()))))
72aa2bcc31SzhanglyGit  //deq sel
73aa2bcc31SzhanglyGit  val deqSelVec           = Wire(Vec(params.numEntries, Bool()))
74aa2bcc31SzhanglyGit  val issueRespVec        = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
755db4956bSzhanglyGit  val deqPortIdxWriteVec  = Wire(Vec(params.numEntries, UInt(1.W)))
765db4956bSzhanglyGit  val deqPortIdxReadVec   = Wire(Vec(params.numEntries, UInt(1.W)))
77aa2bcc31SzhanglyGit  //trans sel
7828607074Ssinsanction  val othersEntryEnqReadyVec = Wire(Vec(OthersEntryNum, Bool()))
7928607074Ssinsanction  val othersEntryEnqVec      = Wire(Vec(OthersEntryNum, Valid(new EntryBundle)))
8028607074Ssinsanction  val enqEntryTransVec       = Wire(Vec(EnqEntryNum, Valid(new EntryBundle)))
8128607074Ssinsanction  val simpEntryTransVec      = OptionWrapper(params.hasCompAndSimp, Wire(Vec(SimpEntryNum, Valid(new EntryBundle))))
8228607074Ssinsanction  val compEnqVec             = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(new EntryBundle))))
8328607074Ssinsanction
8428607074Ssinsanction  val enqCanTrans2Simp       = OptionWrapper(params.hasCompAndSimp, Wire(Bool()))
8528607074Ssinsanction  val enqCanTrans2Comp       = OptionWrapper(params.hasCompAndSimp, Wire(Bool()))
8628607074Ssinsanction  val simpCanTrans2Comp      = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Bool())))
8728607074Ssinsanction  val simpTransSelVec        = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(SimpEntryNum.W)))))
8828607074Ssinsanction  val compTransSelVec        = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(CompEntryNum.W)))))
8928607074Ssinsanction  val finalSimpTransSelVec   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(SimpEntryNum.W))))
9028607074Ssinsanction  val finalCompTransSelVec   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(CompEntryNum.W))))
9128607074Ssinsanction
9228607074Ssinsanction  val enqCanTrans2Others     = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Bool()))
9328607074Ssinsanction  val othersTransSelVec      = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W)))))
9428607074Ssinsanction  val finalOthersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, UInt(OthersEntryNum.W))))
9528607074Ssinsanction
9628607074Ssinsanction  val simpEntryEnqReadyVec   = othersEntryEnqReadyVec.take(SimpEntryNum)
9728607074Ssinsanction  val compEntryEnqReadyVec   = othersEntryEnqReadyVec.takeRight(CompEntryNum)
9828607074Ssinsanction  val simpEntryEnqVec        = othersEntryEnqVec.take(SimpEntryNum)
9928607074Ssinsanction  val compEntryEnqVec        = othersEntryEnqVec.takeRight(CompEntryNum)
100aa2bcc31SzhanglyGit  //debug
101a6938b17Ssinsanction  val entryInValidVec        = Wire(Vec(params.numEntries, Bool()))
102a6938b17Ssinsanction  val entryOutDeqValidVec    = Wire(Vec(params.numEntries, Bool()))
103a6938b17Ssinsanction  val entryOutTransValidVec  = Wire(Vec(params.numEntries, Bool()))
104*e3ef3537Ssinsanction  val perfLdCancelVec        = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))))
105*e3ef3537Ssinsanction  val perfOg0CancelVec       = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))))
106*e3ef3537Ssinsanction  val perfWakeupByWBVec      = Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))
107*e3ef3537Ssinsanction  val perfWakeupByIQVec      = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))))
108a4d38a63SzhanglyGit  //cancel bypass
109eea4a3caSzhanglyGit  val cancelBypassVec        = Wire(Vec(params.numEntries, Bool()))
1105db4956bSzhanglyGit
1115db4956bSzhanglyGit
1125db4956bSzhanglyGit  //enqEntries
1135db4956bSzhanglyGit  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
114aa2bcc31SzhanglyGit    enqEntry.io.commonIn.enq                  := io.enq(entryIdx)
11528607074Ssinsanction    enqEntry.io.commonIn.transSel             := (if (params.isAllComp || params.isAllSimp) enqCanTrans2Others.get && othersTransSelVec.get(entryIdx).valid
11628607074Ssinsanction                                                  else enqCanTrans2Simp.get && simpTransSelVec.get(entryIdx).valid || enqCanTrans2Comp.get && compTransSelVec.get(entryIdx).valid)
117aa2bcc31SzhanglyGit    EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx)
11841dbbdfdSsinceforYy    enqEntry.io.enqDelayWakeUpFromWB          := RegEnable(io.wakeUpFromWB, io.enq(entryIdx).valid)
11941dbbdfdSsinceforYy    enqEntry.io.enqDelayWakeUpFromIQ          := RegEnable(io.wakeUpFromIQ, io.enq(entryIdx).valid)
120aa2bcc31SzhanglyGit    enqEntry.io.enqDelayOg0Cancel             := RegNext(io.og0Cancel.asUInt)
121aa2b5219Ssinsanction    enqEntry.io.enqDelayLdCancel              := RegNext(io.ldCancel)
12228607074Ssinsanction    enqEntryTransVec(entryIdx)                := enqEntry.io.commonOut.transEntry
1235db4956bSzhanglyGit  }
1245db4956bSzhanglyGit  //othersEntries
1255db4956bSzhanglyGit  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
12628607074Ssinsanction    othersEntry.io.commonIn.enq               := othersEntryEnqVec(entryIdx)
12728607074Ssinsanction    othersEntry.io.commonIn.transSel          := (if (params.hasCompAndSimp && (entryIdx < SimpEntryNum))
12828607074Ssinsanction                                                    io.simpEntryDeqSelVec.get.zip(simpCanTrans2Comp.get).map(x => x._1(entryIdx) && x._2).reduce(_ | _)
12928607074Ssinsanction                                                  else false.B)
130aa2bcc31SzhanglyGit    EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum)
13128607074Ssinsanction    othersEntryEnqReadyVec(entryIdx)          := othersEntry.io.commonOut.enqReady
13228607074Ssinsanction    if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) {
13328607074Ssinsanction      simpEntryTransVec.get(entryIdx)         := othersEntry.io.commonOut.transEntry
13428607074Ssinsanction    }
1355db4956bSzhanglyGit  }
1365db4956bSzhanglyGit
1375db4956bSzhanglyGit
1385db4956bSzhanglyGit  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
139aa2bcc31SzhanglyGit    val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2)
1405db4956bSzhanglyGit    deqPortIdxWrite := OHToUInt(deqVec)
1415db4956bSzhanglyGit    deqSel := deqVec.reduce(_ | _)
1425db4956bSzhanglyGit  }
1435db4956bSzhanglyGit
1445db4956bSzhanglyGit
14528607074Ssinsanction  if (params.isAllComp || params.isAllSimp) {
1465db4956bSzhanglyGit    //transPolicy
14728607074Ssinsanction    othersTransPolicy.get.io.canEnq := othersEntryEnqReadyVec.asUInt
148b43488b9Ssinsanction
149b43488b9Ssinsanction    // we only allow all or none of the enq entries transfering to others entries.
15028607074Ssinsanction    enqCanTrans2Others.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(othersEntryEnqReadyVec)
151b43488b9Ssinsanction    // othersTransSelVec(i) is the target others entry for enq entry [i].
152b43488b9Ssinsanction    // note that dispatch does not guarantee the validity of enq entries with low index.
153b43488b9Ssinsanction    // that means in some cases enq entry [0] is invalid while enq entry [1] is valid.
154b43488b9Ssinsanction    // in this case, enq entry [1] should use result [0] of TransPolicy.
15528607074Ssinsanction    othersTransSelVec.get(0).valid := othersTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0)
15628607074Ssinsanction    othersTransSelVec.get(0).bits  := othersTransPolicy.get.io.enqSelOHVec(0).bits
1578321ef33Ssinsanction    if (params.numEnq == 2) {
15828607074Ssinsanction      othersTransSelVec.get(1).valid := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid)
15928607074Ssinsanction      othersTransSelVec.get(1).bits  := Mux(!validVec(0), othersTransPolicy.get.io.enqSelOHVec(0).bits,  othersTransPolicy.get.io.enqSelOHVec(1).bits)
1608321ef33Ssinsanction    }
1618321ef33Ssinsanction
16228607074Ssinsanction    finalOthersTransSelVec.get.zip(othersTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) =>
16328607074Ssinsanction      finalOH := Fill(OthersEntryNum, enqCanTrans2Others.get && selOH.valid) & selOH.bits
1645db4956bSzhanglyGit    }
1655db4956bSzhanglyGit
16628607074Ssinsanction    //othersEntryEnq
16728607074Ssinsanction    othersEntryEnqVec.zipWithIndex.foreach { case (othersEntryEnq, othersIdx) =>
16828607074Ssinsanction      val othersEnqOH = finalOthersTransSelVec.get.map(_(othersIdx))
16928607074Ssinsanction      if (othersEnqOH.size == 1)
17028607074Ssinsanction        othersEntryEnq := Mux(othersEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head))
17128607074Ssinsanction      else
17228607074Ssinsanction        othersEntryEnq := Mux1H(othersEnqOH, enqEntryTransVec)
1735db4956bSzhanglyGit    }
17428607074Ssinsanction  }
17528607074Ssinsanction  else {
17628607074Ssinsanction    //transPolicy
17728607074Ssinsanction    simpTransPolicy.get.io.canEnq := VecInit(simpEntryEnqReadyVec).asUInt
17828607074Ssinsanction    compTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(CompEntryNum).map(!_)).asUInt
17928607074Ssinsanction
180b43488b9Ssinsanction    // we only allow all or none of the enq entries transfering to comp/simp entries.
181b43488b9Ssinsanction    // when all of simp entries are empty and comp entries are enough, transfer to comp entries.
182b43488b9Ssinsanction    // otherwise, transfer to simp entries.
18328607074Ssinsanction    enqCanTrans2Comp.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(CompEntryNum).map(!_)) && !validVec.drop(EnqEntryNum).take(SimpEntryNum).reduce(_ || _)
18428607074Ssinsanction    enqCanTrans2Simp.get := !enqCanTrans2Comp.get && PopCount(validVec.take(EnqEntryNum)) <= PopCount(simpEntryEnqReadyVec)
18528607074Ssinsanction    simpCanTrans2Comp.get.zipWithIndex.foreach { case (canTrans, idx) =>
18628607074Ssinsanction      canTrans := !enqCanTrans2Comp.get && PopCount(validVec.takeRight(CompEntryNum).map(!_)) >= (idx + 1).U
18728607074Ssinsanction    }
18828607074Ssinsanction
189b43488b9Ssinsanction    // simp/compTransSelVec(i) is the target simp/comp entry for enq entry [i].
190b43488b9Ssinsanction    // note that dispatch does not guarantee the validity of enq entries with low index.
191b43488b9Ssinsanction    // that means in some cases enq entry [0] is invalid while enq entry [1] is valid.
192b43488b9Ssinsanction    // in this case, enq entry [1] should use result [0] of TransPolicy.
19328607074Ssinsanction    simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0)
19428607074Ssinsanction    simpTransSelVec.get(0).bits  := simpTransPolicy.get.io.enqSelOHVec(0).bits
19528607074Ssinsanction    compTransSelVec.get(0).valid := compTransPolicy.get.io.enqSelOHVec(0).valid && validVec(0)
19628607074Ssinsanction    compTransSelVec.get(0).bits  := compTransPolicy.get.io.enqSelOHVec(0).bits
19728607074Ssinsanction    if (params.numEnq == 2) {
19828607074Ssinsanction      simpTransSelVec.get(1).valid := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid)
19928607074Ssinsanction      simpTransSelVec.get(1).bits  := Mux(!validVec(0), simpTransPolicy.get.io.enqSelOHVec(0).bits,  simpTransPolicy.get.io.enqSelOHVec(1).bits)
20028607074Ssinsanction      compTransSelVec.get(1).valid := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid)
20128607074Ssinsanction      compTransSelVec.get(1).bits  := Mux(!validVec(0), compTransPolicy.get.io.enqSelOHVec(0).bits,  compTransPolicy.get.io.enqSelOHVec(1).bits)
20228607074Ssinsanction    }
20328607074Ssinsanction
20428607074Ssinsanction    finalSimpTransSelVec.get.zip(simpTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) =>
20528607074Ssinsanction      finalOH := Fill(SimpEntryNum, enqCanTrans2Simp.get && selOH.valid) & selOH.bits
20628607074Ssinsanction    }
20728607074Ssinsanction    finalCompTransSelVec.get.zip(compTransSelVec.get).zip(compTransPolicy.get.io.enqSelOHVec).zipWithIndex.foreach {
20828607074Ssinsanction      case (((finalOH, selOH), origSelOH), enqIdx) =>
20928607074Ssinsanction        finalOH := Mux(enqCanTrans2Comp.get, Fill(CompEntryNum, selOH.valid) & selOH.bits, Fill(CompEntryNum, origSelOH.valid) & origSelOH.bits)
21028607074Ssinsanction    }
21128607074Ssinsanction
21228607074Ssinsanction    //othersEntryEnq
21328607074Ssinsanction    simpEntryEnqVec.zipWithIndex.foreach { case (simpEntryEnq, simpIdx) =>
21428607074Ssinsanction      val simpEnqOH = finalSimpTransSelVec.get.map(_(simpIdx))
21528607074Ssinsanction      // shit Mux1H directly returns in(0) if the seq has only 1 elements
21628607074Ssinsanction      if (simpEnqOH.size == 1)
21728607074Ssinsanction        simpEntryEnq := Mux(simpEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head))
21828607074Ssinsanction      else
21928607074Ssinsanction        simpEntryEnq := Mux1H(simpEnqOH, enqEntryTransVec)
22028607074Ssinsanction    }
22128607074Ssinsanction
22228607074Ssinsanction    compEnqVec.get.zip(enqEntryTransVec).zip(io.simpEntryDeqSelVec.get).foreach { case ((compEnq, enqEntry), deqSel) =>
22328607074Ssinsanction      compEnq := Mux(enqCanTrans2Comp.get, enqEntry, Mux1H(deqSel, simpEntryTransVec.get))
22428607074Ssinsanction    }
22528607074Ssinsanction    compEntryEnqVec.zipWithIndex.foreach { case (compEntryEnq, compIdx) =>
22628607074Ssinsanction      val compEnqOH = finalCompTransSelVec.get.map(_(compIdx))
22728607074Ssinsanction      // shit Mux1H directly returns in(0) if the seq has only 1 elements
22828607074Ssinsanction      if (compEnqOH.size == 1)
22928607074Ssinsanction        compEntryEnq := Mux(compEnqOH.head, compEnqVec.get.head, 0.U.asTypeOf(compEnqVec.get.head))
23028607074Ssinsanction      else
23128607074Ssinsanction        compEntryEnq := Mux1H(compEnqOH, compEnqVec.get)
23228607074Ssinsanction    }
23328607074Ssinsanction
23428607074Ssinsanction    assert(PopCount(simpEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of simpEntryEnq is more than numEnq\n")
23528607074Ssinsanction    assert(PopCount(compEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of compEntryEnq is more than numEnq\n")
23628607074Ssinsanction  }
23728607074Ssinsanction
2388d081717Sszw_kaixin  if(backendParams.debugEn) {
23928607074Ssinsanction    dontTouch(othersEntryEnqVec)
2408d081717Sszw_kaixin  }
2415db4956bSzhanglyGit
2425db4956bSzhanglyGit  //issueRespVec
243887f9c3dSzhanglinjuan  if (params.isVecMemIQ) {
244887f9c3dSzhanglinjuan    // vector memory IQ
245887f9c3dSzhanglinjuan    issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) =>
246887f9c3dSzhanglinjuan      val hitRespsVec = VecInit(resps.flatten.map(x =>
247aa2bcc31SzhanglyGit        x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx.get === uopIdx
248887f9c3dSzhanglinjuan      ))
249887f9c3dSzhanglinjuan      issueResp.valid := hitRespsVec.reduce(_ | _)
250887f9c3dSzhanglinjuan      issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits))
251887f9c3dSzhanglinjuan    }
252887f9c3dSzhanglinjuan  } else if (params.isMemAddrIQ) {
253887f9c3dSzhanglinjuan    // scalar memory IQ
2545db4956bSzhanglyGit    issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) =>
255c838dea1SXuan Hu      val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq)
2565db4956bSzhanglyGit      issueResp.valid := hitRespsVec.reduce(_ | _)
257c838dea1SXuan Hu      issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)
2585db4956bSzhanglyGit    }
2595db4956bSzhanglyGit  }
2605db4956bSzhanglyGit  else {
2615db4956bSzhanglyGit    issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) =>
2625db4956bSzhanglyGit      val Resp = resps(issueTimer)(deqPortIdx)
2635db4956bSzhanglyGit      issueResp := Resp
2645db4956bSzhanglyGit    }
2655db4956bSzhanglyGit  }
2665db4956bSzhanglyGit
26740283787Ssinsanction  //deq
26828607074Ssinsanction  val enqEntryOldest          = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
26928607074Ssinsanction  val simpEntryOldest         = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
27028607074Ssinsanction  val compEntryOldest         = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
27128607074Ssinsanction  val othersEntryOldest       = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
27228607074Ssinsanction  val enqEntryOldestCancel    = Wire(Vec(params.numDeq, Bool()))
27328607074Ssinsanction  val simpEntryOldestCancel   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool())))
27428607074Ssinsanction  val compEntryOldestCancel   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool())))
27528607074Ssinsanction  val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool())))
27628607074Ssinsanction
27728607074Ssinsanction  io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) =>
27828607074Ssinsanction    enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum))
279eea4a3caSzhanglyGit    enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum))
28040283787Ssinsanction  }
28128607074Ssinsanction
28228607074Ssinsanction  if (params.isAllComp || params.isAllSimp) {
28328607074Ssinsanction    io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
28428607074Ssinsanction      othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum))
285eea4a3caSzhanglyGit      othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum))
286af4bd265SzhanglyGit    }
28740283787Ssinsanction  }
28828607074Ssinsanction  else {
28928607074Ssinsanction    io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
29028607074Ssinsanction      simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum))
291eea4a3caSzhanglyGit      simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum))
29228607074Ssinsanction    }
29328607074Ssinsanction    io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
29428607074Ssinsanction      compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum))
295eea4a3caSzhanglyGit      compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum))
29628607074Ssinsanction    }
297af4bd265SzhanglyGit  }
298cf4a131aSsinsanction
299cf4a131aSsinsanction  if (params.deqFuSame) {
300cf4a131aSsinsanction    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
301cf4a131aSsinsanction    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
302a4d38a63SzhanglyGit    val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool()))
303cf4a131aSsinsanction
304aa2bcc31SzhanglyGit    subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U
305aa2bcc31SzhanglyGit    subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U
30628607074Ssinsanction
30728607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
30828607074Ssinsanction      subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries)
30928607074Ssinsanction      subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
310eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec)
311eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse)
312cf4a131aSsinsanction
31328607074Ssinsanction      io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1))
314aa2bcc31SzhanglyGit      io.deqEntry(1) := subDeqPolicyEntryVec(0)
31528607074Ssinsanction      io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))
316a4d38a63SzhanglyGit      io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
31728607074Ssinsanction    }
31828607074Ssinsanction    else {
31928607074Ssinsanction      subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
32028607074Ssinsanction      subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries)
321eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse)
322eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec)
32328607074Ssinsanction
32428607074Ssinsanction      io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid,
32528607074Ssinsanction                            compEntryOldest.get(0),
32628607074Ssinsanction                            Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1)))
32728607074Ssinsanction      io.deqEntry(1) := subDeqPolicyEntryVec(0)
32828607074Ssinsanction      io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid,
32928607074Ssinsanction                                compEntryOldestCancel.get(0),
33028607074Ssinsanction                                Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)))
33128607074Ssinsanction      io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
33228607074Ssinsanction    }
333cf4a131aSsinsanction
334cf4a131aSsinsanction    when (subDeqPolicyValidVec(0)) {
335aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
33640283787Ssinsanction    }
337cf4a131aSsinsanction    when (subDeqPolicyValidVec(1)) {
338aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
339f7f73727Ssinsanction    }
340f7f73727Ssinsanction  }
341f7f73727Ssinsanction  else {
34228607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
34328607074Ssinsanction      io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) =>
34428607074Ssinsanction        io.deqEntry(i)     := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i))
34528607074Ssinsanction        io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i))
34628607074Ssinsanction      }
34728607074Ssinsanction    }
34828607074Ssinsanction    else {
34928607074Ssinsanction      io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) =>
35028607074Ssinsanction        io.deqEntry(i)     := Mux(compSel.valid,
35128607074Ssinsanction                                  compEntryOldest.get(i),
35228607074Ssinsanction                                  Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i)))
35328607074Ssinsanction        io.cancelDeqVec(i) := Mux(compSel.valid,
35428607074Ssinsanction                                  compEntryOldestCancel.get(i),
35528607074Ssinsanction                                  Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i)))
35628607074Ssinsanction      }
357af4bd265SzhanglyGit    }
358af4bd265SzhanglyGit  }
359af4bd265SzhanglyGit
360af4bd265SzhanglyGit  if (params.hasIQWakeUp) {
361eea4a3caSzhanglyGit    cancelBypassVec.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).zip(srcLoadDependencyVec).foreach{ case (((cancelBypass: Bool, l1ExuOH: Vec[Vec[Bool]]), srcTimer: Vec[UInt]), srcLoadDependency: Vec[Vec[UInt]]) =>
362a4d38a63SzhanglyGit      val cancelByOg0 = l1ExuOH.zip(srcTimer).map {
363af4bd265SzhanglyGit        case(exuOH, srcTimer) =>
364af4bd265SzhanglyGit          (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U
365af4bd265SzhanglyGit      }.reduce(_ | _)
366a4d38a63SzhanglyGit      val cancelByLd = srcLoadDependency.map(x => LoadShouldCancel(Some(x), io.ldCancel)).reduce(_ | _)
367e5feb625Sxiaofeibao-xjtu      cancelBypass := cancelByLd
36840283787Ssinsanction    }
369eea4a3caSzhanglyGit  } else {
370eea4a3caSzhanglyGit    cancelBypassVec.zip(srcLoadDependencyVec).foreach { case (cancelBypass, srcLoadDependency) =>
371eea4a3caSzhanglyGit      val cancelByLd = srcLoadDependency.map(x => LoadShouldCancel(Some(x), io.ldCancel)).reduce(_ | _)
372eea4a3caSzhanglyGit      cancelBypass := cancelByLd
373eea4a3caSzhanglyGit    }
37440283787Ssinsanction  }
37540283787Ssinsanction
3765db4956bSzhanglyGit  io.valid                          := validVec.asUInt
3775db4956bSzhanglyGit  io.canIssue                       := canIssueVec.asUInt
3785db4956bSzhanglyGit  io.fuType                         := fuTypeVec
3795db4956bSzhanglyGit  io.dataSources                    := dataSourceVec
380aa2bcc31SzhanglyGit  io.srcWakeUpL1ExuOH.foreach(_     := srcWakeUpL1ExuOHVec.get.map(x => VecInit(x.map(_.asUInt))))
3815db4956bSzhanglyGit  io.srcTimer.foreach(_             := srcTimerVec.get)
382eea4a3caSzhanglyGit  io.loadDependency                 := loadDependencyVec
383aa2bcc31SzhanglyGit  io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) =>
384aa2bcc31SzhanglyGit    isFirstIssue                    := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec)
3858d081717Sszw_kaixin  }
38628607074Ssinsanction  io.simpEntryEnqSelVec.foreach(_   := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid)))
38728607074Ssinsanction  io.compEntryEnqSelVec.foreach(_   := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid)))
38828607074Ssinsanction  io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid)))
389aa2bcc31SzhanglyGit  io.robIdx.foreach(_               := robIdxVec)
390aa2bcc31SzhanglyGit  io.uopIdx.foreach(_               := uopIdxVec.get)
391aa2bcc31SzhanglyGit
392aa2bcc31SzhanglyGit  def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = {
393aa2bcc31SzhanglyGit    in.flush                    := io.flush
394aa2bcc31SzhanglyGit    in.wakeUpFromWB             := io.wakeUpFromWB
395aa2bcc31SzhanglyGit    in.wakeUpFromIQ             := io.wakeUpFromIQ
396aa2bcc31SzhanglyGit    in.og0Cancel                := io.og0Cancel
397aa2bcc31SzhanglyGit    in.og1Cancel                := io.og1Cancel
398aa2bcc31SzhanglyGit    in.ldCancel                 := io.ldCancel
399aa2bcc31SzhanglyGit    in.deqSel                   := deqSelVec(entryIdx)
400aa2bcc31SzhanglyGit    in.deqPortIdxWrite          := deqPortIdxWriteVec(entryIdx)
401aa2bcc31SzhanglyGit    in.issueResp                := issueRespVec(entryIdx)
402aa2bcc31SzhanglyGit    if (params.isVecMemIQ) {
403aa2bcc31SzhanglyGit      in.fromLsq.get.sqDeqPtr   := io.vecMemIn.get.sqDeqPtr
404aa2bcc31SzhanglyGit      in.fromLsq.get.lqDeqPtr   := io.vecMemIn.get.lqDeqPtr
405aa2bcc31SzhanglyGit    }
406aa2bcc31SzhanglyGit    validVec(entryIdx)          := out.valid
407aa2bcc31SzhanglyGit    canIssueVec(entryIdx)       := out.canIssue
408aa2bcc31SzhanglyGit    fuTypeVec(entryIdx)         := out.fuType
409aa2bcc31SzhanglyGit    robIdxVec(entryIdx)         := out.robIdx
410aa2bcc31SzhanglyGit    dataSourceVec(entryIdx)     := out.dataSource
411aa2bcc31SzhanglyGit    isFirstIssueVec(entryIdx)   := out.isFirstIssue
412aa2bcc31SzhanglyGit    entries(entryIdx)           := out.entry
413aa2bcc31SzhanglyGit    deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead
414aa2bcc31SzhanglyGit    issueTimerVec(entryIdx)     := out.issueTimerRead
415eea4a3caSzhanglyGit    srcLoadDependencyVec(entryIdx)          := out.srcLoadDependency
416eea4a3caSzhanglyGit    loadDependencyVec(entryIdx)             := out.entry.bits.status.mergedLoadDependency
417aa2bcc31SzhanglyGit    if (params.hasIQWakeUp) {
418aa2bcc31SzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx)       := out.srcWakeUpL1ExuOH.get
419aa2bcc31SzhanglyGit      srcTimerVec.get(entryIdx)               := out.srcTimer.get
420aa2bcc31SzhanglyGit    }
421aa2bcc31SzhanglyGit    if (params.isVecMemIQ) {
422aa2bcc31SzhanglyGit      uopIdxVec.get(entryIdx)       := out.uopIdx.get
423aa2bcc31SzhanglyGit    }
424a6938b17Ssinsanction    entryInValidVec(entryIdx)       := out.entryInValid
425a6938b17Ssinsanction    entryOutDeqValidVec(entryIdx)   := out.entryOutDeqValid
426a6938b17Ssinsanction    entryOutTransValidVec(entryIdx) := out.entryOutTransValid
427*e3ef3537Ssinsanction    perfWakeupByWBVec(entryIdx)     := out.perfWakeupByWB
428*e3ef3537Ssinsanction    if (params.hasIQWakeUp) {
429*e3ef3537Ssinsanction      perfLdCancelVec.get(entryIdx)   := out.perfLdCancel.get
430*e3ef3537Ssinsanction      perfOg0CancelVec.get(entryIdx)  := out.perfOg0Cancel.get
431*e3ef3537Ssinsanction      perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get
432*e3ef3537Ssinsanction    }
433aa2bcc31SzhanglyGit  }
434a6938b17Ssinsanction
435a6938b17Ssinsanction  // entries perf counter
436a6938b17Ssinsanction  // enq
437a6938b17Ssinsanction  for (i <- 0 until params.numEnq) {
438a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i))
439a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i))
440a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i))
441a6938b17Ssinsanction  }
442a6938b17Ssinsanction  // simple
443a6938b17Ssinsanction  for (i <- 0 until params.numSimp) {
444a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq))
445a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq))
446a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq))
447a6938b17Ssinsanction  }
448a6938b17Ssinsanction  // complex
449a6938b17Ssinsanction  for (i <- 0 until params.numComp) {
450a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp))
451a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp))
452a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp))
453a6938b17Ssinsanction  }
454a6938b17Ssinsanction  // total
455a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq)))
456a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq)))
457a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq)))
458*e3ef3537Ssinsanction  for (srcIdx <- 0 until params.numRegSrc) {
459*e3ef3537Ssinsanction    XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx))))
460d280e426Slewislzh    if (params.hasIQWakeUp) {
461*e3ef3537Ssinsanction      XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx))))
462*e3ef3537Ssinsanction      XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx))))
463*e3ef3537Ssinsanction      for (iqIdx <- 0 until params.numWakeupFromIQ) {
464*e3ef3537Ssinsanction        XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx))))
465*e3ef3537Ssinsanction      }
466*e3ef3537Ssinsanction    }
467d280e426Slewislzh  }
468a6938b17Ssinsanction
469a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq)))
470a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq)))
471a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq)))
472*e3ef3537Ssinsanction  for (srcIdx <- 0 until params.numRegSrc) {
473*e3ef3537Ssinsanction    XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx))))
474d280e426Slewislzh    if (params.hasIQWakeUp) {
475*e3ef3537Ssinsanction      XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx))))
476*e3ef3537Ssinsanction      XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx))))
477*e3ef3537Ssinsanction      for (iqIdx <- 0 until params.numWakeupFromIQ) {
478*e3ef3537Ssinsanction        XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx))))
479*e3ef3537Ssinsanction      }
480*e3ef3537Ssinsanction    }
481*e3ef3537Ssinsanction  }
482*e3ef3537Ssinsanction
483*e3ef3537Ssinsanction  for (t <- FuType.functionNameMap.keys) {
484*e3ef3537Ssinsanction    val fuName = FuType.functionNameMap(t)
485*e3ef3537Ssinsanction    if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) {
486*e3ef3537Ssinsanction      for (srcIdx <- 0 until params.numRegSrc) {
487*e3ef3537Ssinsanction        XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
488*e3ef3537Ssinsanction        if (params.hasIQWakeUp) {
489*e3ef3537Ssinsanction          XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
490*e3ef3537Ssinsanction          XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
491*e3ef3537Ssinsanction          for (iqIdx <- 0 until params.numWakeupFromIQ) {
492*e3ef3537Ssinsanction            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) }))
493*e3ef3537Ssinsanction          }
494*e3ef3537Ssinsanction        }
495*e3ef3537Ssinsanction      }
496*e3ef3537Ssinsanction    }
497d280e426Slewislzh  }
498aa2bcc31SzhanglyGit}
499aa2bcc31SzhanglyGit
500aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
501aa2bcc31SzhanglyGit  val flush               = Flipped(ValidIO(new Redirect))
502aa2bcc31SzhanglyGit  //enq
503aa2bcc31SzhanglyGit  val enq                 = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
504aa2bcc31SzhanglyGit  val og0Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
505aa2bcc31SzhanglyGit  val og1Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
506c38df446SzhanglyGit  val og2Resp             = OptionWrapper(params.inVfSchd, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))))
507aa2bcc31SzhanglyGit  //deq sel
508aa2bcc31SzhanglyGit  val deqReady            = Vec(params.numDeq, Input(Bool()))
509aa2bcc31SzhanglyGit  val deqSelOH            = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W))))
510aa2bcc31SzhanglyGit  val enqEntryOldestSel   = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W))))
51128607074Ssinsanction  val simpEntryOldestSel  = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W)))))
51228607074Ssinsanction  val compEntryOldestSel  = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W)))))
51328607074Ssinsanction  val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))))
514aa2bcc31SzhanglyGit  val subDeqRequest       = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
515aa2bcc31SzhanglyGit  val subDeqSelOH         = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
516aa2bcc31SzhanglyGit  // wakeup
517aa2bcc31SzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
518aa2bcc31SzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
519aa2bcc31SzhanglyGit  val og0Cancel           = Input(ExuOH(backendParams.numExu))
520aa2bcc31SzhanglyGit  val og1Cancel           = Input(ExuOH(backendParams.numExu))
521aa2bcc31SzhanglyGit  val ldCancel            = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO))
522aa2bcc31SzhanglyGit  //entries status
523aa2bcc31SzhanglyGit  val valid               = Output(UInt(params.numEntries.W))
524aa2bcc31SzhanglyGit  val canIssue            = Output(UInt(params.numEntries.W))
525aa2bcc31SzhanglyGit  val fuType              = Vec(params.numEntries, Output(FuType()))
526aa2bcc31SzhanglyGit  val dataSources         = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource())))
527eea4a3caSzhanglyGit  val loadDependency      = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(3.W)))
528aa2bcc31SzhanglyGit  val srcWakeUpL1ExuOH    = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuOH()))))
529aa2bcc31SzhanglyGit  val srcTimer            = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(UInt(3.W)))))
530aa2bcc31SzhanglyGit  //deq status
531aa2bcc31SzhanglyGit  val isFirstIssue        = Vec(params.numDeq, Output(Bool()))
532aa2bcc31SzhanglyGit  val deqEntry            = Vec(params.numDeq, ValidIO(new EntryBundle))
533aa2bcc31SzhanglyGit  val cancelDeqVec        = Vec(params.numDeq, Output(Bool()))
534e07131b2Ssinsanction
535e07131b2Ssinsanction  // load/hybird only
536e07131b2Ssinsanction  val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle {
537e07131b2Ssinsanction    val finalIssueResp    = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
538e07131b2Ssinsanction    val memAddrIssueResp  = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
539e07131b2Ssinsanction  })
540aa2bcc31SzhanglyGit  // mem only
541e07131b2Ssinsanction  val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle {
542aa2bcc31SzhanglyGit    val slowResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
543d3372210SzhanglyGit    val fastResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
544e07131b2Ssinsanction  })
54599944b79Ssinsanction  // vec mem only
546aa2bcc31SzhanglyGit  val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle {
547aa2bcc31SzhanglyGit    val sqDeqPtr          = Input(new SqPtr)
548aa2bcc31SzhanglyGit    val lqDeqPtr          = Input(new LqPtr)
549aa2bcc31SzhanglyGit  })
550aa2bcc31SzhanglyGit  val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr)))
551aa2bcc31SzhanglyGit  val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx())))
552aa2bcc31SzhanglyGit
55328607074Ssinsanction  // trans
55428607074Ssinsanction  val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W))))
55528607074Ssinsanction  val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W))))
55628607074Ssinsanction  val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W))))
55728607074Ssinsanction  val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W))))
558aa2bcc31SzhanglyGit
559aa2bcc31SzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
5605db4956bSzhanglyGit}
561