xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision c0beb497532ef1deb7aabb86deefe9ae4e4be55e)
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
61ae0295f4STang Haojin  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = Wire(Vec(4, chiselTypeOf(io.og0Resp)))
62ae0295f4STang Haojin
63c38df446SzhanglyGit  if (params.inVfSchd)
64ae0295f4STang Haojin    resps := Seq(io.og0Resp, io.og1Resp, io.og2Resp.get, WireDefault(0.U.asTypeOf(io.og0Resp)))
65c38df446SzhanglyGit  else
66ae0295f4STang Haojin    resps := Seq(io.og0Resp, io.og1Resp, WireDefault(0.U.asTypeOf(io.og0Resp)), WireDefault(0.U.asTypeOf(io.og0Resp)))
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()))
84*c0beb497Sxiaofeibao  val issuedVec           = Wire(Vec(params.numEntries, Bool()))
85*c0beb497Sxiaofeibao  val validForTrans       = VecInit(validVec.zip(issuedVec).map(x => x._1 && !x._2))
865db4956bSzhanglyGit  val canIssueVec         = Wire(Vec(params.numEntries, Bool()))
875db4956bSzhanglyGit  val fuTypeVec           = Wire(Vec(params.numEntries, FuType()))
885db4956bSzhanglyGit  val isFirstIssueVec     = Wire(Vec(params.numEntries, Bool()))
895db4956bSzhanglyGit  val issueTimerVec       = Wire(Vec(params.numEntries, UInt(2.W)))
9028ac1c16Sxiaofeibao-xjtu  val sqIdxVec            = OptionWrapper(params.needFeedBackSqIdx || params.needFeedBackLqIdx, Wire(Vec(params.numEntries, new SqPtr())))
9128ac1c16Sxiaofeibao-xjtu  val lqIdxVec            = OptionWrapper(params.needFeedBackSqIdx || params.needFeedBackLqIdx, Wire(Vec(params.numEntries, new LqPtr())))
92aa2bcc31SzhanglyGit  //src status
93aa2bcc31SzhanglyGit  val dataSourceVec       = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
94ec49b127Ssinsanction  val loadDependencyVec   = Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W))))
95aa2bcc31SzhanglyGit  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec()))))
96aa2bcc31SzhanglyGit  //deq sel
97aa2bcc31SzhanglyGit  val deqSelVec           = Wire(Vec(params.numEntries, Bool()))
98aa2bcc31SzhanglyGit  val issueRespVec        = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
995db4956bSzhanglyGit  val deqPortIdxWriteVec  = Wire(Vec(params.numEntries, UInt(1.W)))
1005db4956bSzhanglyGit  val deqPortIdxReadVec   = Wire(Vec(params.numEntries, UInt(1.W)))
101aa2bcc31SzhanglyGit  //trans sel
10228607074Ssinsanction  val othersEntryEnqReadyVec = Wire(Vec(OthersEntryNum, Bool()))
10328607074Ssinsanction  val othersEntryEnqVec      = Wire(Vec(OthersEntryNum, Valid(new EntryBundle)))
10428607074Ssinsanction  val enqEntryTransVec       = Wire(Vec(EnqEntryNum, Valid(new EntryBundle)))
10528607074Ssinsanction  val simpEntryTransVec      = OptionWrapper(params.hasCompAndSimp, Wire(Vec(SimpEntryNum, Valid(new EntryBundle))))
10628607074Ssinsanction  val compEnqVec             = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(new EntryBundle))))
10728607074Ssinsanction
10828607074Ssinsanction  val enqCanTrans2Simp       = OptionWrapper(params.hasCompAndSimp, Wire(Bool()))
10928607074Ssinsanction  val enqCanTrans2Comp       = OptionWrapper(params.hasCompAndSimp, Wire(Bool()))
11028607074Ssinsanction  val simpCanTrans2Comp      = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Bool())))
11128607074Ssinsanction  val simpTransSelVec        = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(SimpEntryNum.W)))))
11228607074Ssinsanction  val compTransSelVec        = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, Valid(UInt(CompEntryNum.W)))))
11328607074Ssinsanction  val finalSimpTransSelVec   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(SimpEntryNum.W))))
11428607074Ssinsanction  val finalCompTransSelVec   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(EnqEntryNum, UInt(CompEntryNum.W))))
11528607074Ssinsanction
11628607074Ssinsanction  val enqCanTrans2Others     = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Bool()))
11728607074Ssinsanction  val othersTransSelVec      = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W)))))
11828607074Ssinsanction  val finalOthersTransSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(EnqEntryNum, UInt(OthersEntryNum.W))))
11928607074Ssinsanction
12028607074Ssinsanction  val simpEntryEnqReadyVec   = othersEntryEnqReadyVec.take(SimpEntryNum)
12128607074Ssinsanction  val compEntryEnqReadyVec   = othersEntryEnqReadyVec.takeRight(CompEntryNum)
12228607074Ssinsanction  val simpEntryEnqVec        = othersEntryEnqVec.take(SimpEntryNum)
12328607074Ssinsanction  val compEntryEnqVec        = othersEntryEnqVec.takeRight(CompEntryNum)
124aa2bcc31SzhanglyGit  //debug
125a6938b17Ssinsanction  val entryInValidVec        = Wire(Vec(params.numEntries, Bool()))
126a6938b17Ssinsanction  val entryOutDeqValidVec    = Wire(Vec(params.numEntries, Bool()))
127a6938b17Ssinsanction  val entryOutTransValidVec  = Wire(Vec(params.numEntries, Bool()))
128e3ef3537Ssinsanction  val perfLdCancelVec        = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))))
129e3ef3537Ssinsanction  val perfOg0CancelVec       = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool()))))
130e3ef3537Ssinsanction  val perfWakeupByWBVec      = Wire(Vec(params.numEntries, Vec(params.numRegSrc, Bool())))
131e3ef3537Ssinsanction  val perfWakeupByIQVec      = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(params.numWakeupFromIQ, Bool())))))
132a4d38a63SzhanglyGit  //cancel bypass
133eea4a3caSzhanglyGit  val cancelBypassVec        = Wire(Vec(params.numEntries, Bool()))
1345db4956bSzhanglyGit
1355db4956bSzhanglyGit
1365db4956bSzhanglyGit  //enqEntries
1375db4956bSzhanglyGit  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
138aa2bcc31SzhanglyGit    enqEntry.io.commonIn.enq                  := io.enq(entryIdx)
13928607074Ssinsanction    enqEntry.io.commonIn.transSel             := (if (params.isAllComp || params.isAllSimp) enqCanTrans2Others.get && othersTransSelVec.get(entryIdx).valid
14028607074Ssinsanction                                                  else enqCanTrans2Simp.get && simpTransSelVec.get(entryIdx).valid || enqCanTrans2Comp.get && compTransSelVec.get(entryIdx).valid)
141aa2bcc31SzhanglyGit    EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx)
14256db494fSxiaofeibao-xjtu    enqEntry.io.enqDelayIn1.wakeUpFromWB      := RegNext(io.wakeUpFromWB)
14356db494fSxiaofeibao-xjtu    enqEntry.io.enqDelayIn1.wakeUpFromIQ      := RegNext(io.wakeUpFromIQ)
14456db494fSxiaofeibao-xjtu    enqEntry.io.enqDelayIn1.srcLoadDependency := RegNext(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)))
145be9ff987Ssinsanction    enqEntry.io.enqDelayIn1.og0Cancel         := RegNext(io.og0Cancel)
1464fa640e4Ssinsanction    enqEntry.io.enqDelayIn1.ldCancel          := RegNext(io.ldCancel)
1474fa640e4Ssinsanction    // note: these signals with 2 cycle delay should not be enabled by io.enq.valid
1484fa640e4Ssinsanction    enqEntry.io.enqDelayIn2.wakeUpFromWB      := DelayN(io.wakeUpFromWB, 2)
1494fa640e4Ssinsanction    enqEntry.io.enqDelayIn2.wakeUpFromIQ      := DelayN(io.wakeUpFromIQ, 2)
15091f31488Sxiaofeibao-xjtu    enqEntry.io.enqDelayIn2.srcLoadDependency := DelayN(VecInit(io.enq(entryIdx).bits.payload.srcLoadDependency.take(params.numRegSrc)), 2)
151be9ff987Ssinsanction    enqEntry.io.enqDelayIn2.og0Cancel         := DelayN(io.og0Cancel, 2)
1524fa640e4Ssinsanction    enqEntry.io.enqDelayIn2.ldCancel          := DelayN(io.ldCancel, 2)
15328607074Ssinsanction    enqEntryTransVec(entryIdx)                := enqEntry.io.commonOut.transEntry
1545db4956bSzhanglyGit  }
1555db4956bSzhanglyGit  //othersEntries
1565db4956bSzhanglyGit  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
15728607074Ssinsanction    othersEntry.io.commonIn.enq               := othersEntryEnqVec(entryIdx)
15828607074Ssinsanction    othersEntry.io.commonIn.transSel          := (if (params.hasCompAndSimp && (entryIdx < SimpEntryNum))
15928607074Ssinsanction                                                    io.simpEntryDeqSelVec.get.zip(simpCanTrans2Comp.get).map(x => x._1(entryIdx) && x._2).reduce(_ | _)
16028607074Ssinsanction                                                  else false.B)
161aa2bcc31SzhanglyGit    EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum)
16228607074Ssinsanction    othersEntryEnqReadyVec(entryIdx)          := othersEntry.io.commonOut.enqReady
16328607074Ssinsanction    if (params.hasCompAndSimp && (entryIdx < SimpEntryNum)) {
16428607074Ssinsanction      simpEntryTransVec.get(entryIdx)         := othersEntry.io.commonOut.transEntry
16528607074Ssinsanction    }
1665db4956bSzhanglyGit  }
1675db4956bSzhanglyGit
1685db4956bSzhanglyGit
1695db4956bSzhanglyGit  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
170aa2bcc31SzhanglyGit    val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2)
1715db4956bSzhanglyGit    deqPortIdxWrite := OHToUInt(deqVec)
1725db4956bSzhanglyGit    deqSel := deqVec.reduce(_ | _)
1735db4956bSzhanglyGit  }
1745db4956bSzhanglyGit
1755db4956bSzhanglyGit
17628607074Ssinsanction  if (params.isAllComp || params.isAllSimp) {
1775db4956bSzhanglyGit    //transPolicy
178b9631a81Sxiaofeibao-xjtu    othersTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(OthersEntryNum).map(!_)).asUInt
179b43488b9Ssinsanction
180b43488b9Ssinsanction    // we only allow all or none of the enq entries transfering to others entries.
181b9631a81Sxiaofeibao-xjtu    enqCanTrans2Others.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(OthersEntryNum).map(!_))
182b43488b9Ssinsanction    // othersTransSelVec(i) is the target others entry for enq entry [i].
183b43488b9Ssinsanction    // note that dispatch does not guarantee the validity of enq entries with low index.
184b43488b9Ssinsanction    // that means in some cases enq entry [0] is invalid while enq entry [1] is valid.
185b43488b9Ssinsanction    // in this case, enq entry [1] should use result [0] of TransPolicy.
186*c0beb497Sxiaofeibao    othersTransSelVec.get(0).valid := othersTransPolicy.get.io.enqSelOHVec(0).valid && validForTrans(0)
18728607074Ssinsanction    othersTransSelVec.get(0).bits  := othersTransPolicy.get.io.enqSelOHVec(0).bits
1888321ef33Ssinsanction    if (params.numEnq == 2) {
189*c0beb497Sxiaofeibao      othersTransSelVec.get(1).valid := Mux(!validForTrans(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1)
190*c0beb497Sxiaofeibao      othersTransSelVec.get(1).bits  := Mux(!validForTrans(0), othersTransPolicy.get.io.enqSelOHVec(0).bits,  othersTransPolicy.get.io.enqSelOHVec(1).bits)
1918321ef33Ssinsanction    }
1928321ef33Ssinsanction
19328607074Ssinsanction    finalOthersTransSelVec.get.zip(othersTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) =>
19428607074Ssinsanction      finalOH := Fill(OthersEntryNum, enqCanTrans2Others.get && selOH.valid) & selOH.bits
1955db4956bSzhanglyGit    }
1965db4956bSzhanglyGit
19728607074Ssinsanction    //othersEntryEnq
19828607074Ssinsanction    othersEntryEnqVec.zipWithIndex.foreach { case (othersEntryEnq, othersIdx) =>
19928607074Ssinsanction      val othersEnqOH = finalOthersTransSelVec.get.map(_(othersIdx))
20028607074Ssinsanction      if (othersEnqOH.size == 1)
20128607074Ssinsanction        othersEntryEnq := Mux(othersEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head))
20228607074Ssinsanction      else
20328607074Ssinsanction        othersEntryEnq := Mux1H(othersEnqOH, enqEntryTransVec)
2045db4956bSzhanglyGit    }
20528607074Ssinsanction  }
20628607074Ssinsanction  else {
20728607074Ssinsanction    //transPolicy
20828607074Ssinsanction    simpTransPolicy.get.io.canEnq := VecInit(simpEntryEnqReadyVec).asUInt
20928607074Ssinsanction    compTransPolicy.get.io.canEnq := VecInit(validVec.takeRight(CompEntryNum).map(!_)).asUInt
21028607074Ssinsanction
211b43488b9Ssinsanction    // we only allow all or none of the enq entries transfering to comp/simp entries.
212b43488b9Ssinsanction    // when all of simp entries are empty and comp entries are enough, transfer to comp entries.
213b43488b9Ssinsanction    // otherwise, transfer to simp entries.
21428607074Ssinsanction    enqCanTrans2Comp.get := PopCount(validVec.take(EnqEntryNum)) <= PopCount(validVec.takeRight(CompEntryNum).map(!_)) && !validVec.drop(EnqEntryNum).take(SimpEntryNum).reduce(_ || _)
21528607074Ssinsanction    enqCanTrans2Simp.get := !enqCanTrans2Comp.get && PopCount(validVec.take(EnqEntryNum)) <= PopCount(simpEntryEnqReadyVec)
21628607074Ssinsanction    simpCanTrans2Comp.get.zipWithIndex.foreach { case (canTrans, idx) =>
21728607074Ssinsanction      canTrans := !enqCanTrans2Comp.get && PopCount(validVec.takeRight(CompEntryNum).map(!_)) >= (idx + 1).U
21828607074Ssinsanction    }
21928607074Ssinsanction
220b43488b9Ssinsanction    // simp/compTransSelVec(i) is the target simp/comp entry for enq entry [i].
221b43488b9Ssinsanction    // note that dispatch does not guarantee the validity of enq entries with low index.
222b43488b9Ssinsanction    // that means in some cases enq entry [0] is invalid while enq entry [1] is valid.
223b43488b9Ssinsanction    // in this case, enq entry [1] should use result [0] of TransPolicy.
224*c0beb497Sxiaofeibao    simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validForTrans(0)
22528607074Ssinsanction    simpTransSelVec.get(0).bits  := simpTransPolicy.get.io.enqSelOHVec(0).bits
226*c0beb497Sxiaofeibao    compTransSelVec.get(0).valid := compTransPolicy.get.io.enqSelOHVec(0).valid && validForTrans(0)
22728607074Ssinsanction    compTransSelVec.get(0).bits  := compTransPolicy.get.io.enqSelOHVec(0).bits
22828607074Ssinsanction    if (params.numEnq == 2) {
229*c0beb497Sxiaofeibao      simpTransSelVec.get(1).valid := Mux(!validForTrans(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1)
230*c0beb497Sxiaofeibao      simpTransSelVec.get(1).bits  := Mux(!validForTrans(0), simpTransPolicy.get.io.enqSelOHVec(0).bits,  simpTransPolicy.get.io.enqSelOHVec(1).bits)
231*c0beb497Sxiaofeibao      compTransSelVec.get(1).valid := Mux(!validForTrans(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1)
232*c0beb497Sxiaofeibao      compTransSelVec.get(1).bits  := Mux(!validForTrans(0), compTransPolicy.get.io.enqSelOHVec(0).bits,  compTransPolicy.get.io.enqSelOHVec(1).bits)
23328607074Ssinsanction    }
23428607074Ssinsanction
23528607074Ssinsanction    finalSimpTransSelVec.get.zip(simpTransSelVec.get).zipWithIndex.foreach { case ((finalOH, selOH), enqIdx) =>
23628607074Ssinsanction      finalOH := Fill(SimpEntryNum, enqCanTrans2Simp.get && selOH.valid) & selOH.bits
23728607074Ssinsanction    }
23828607074Ssinsanction    finalCompTransSelVec.get.zip(compTransSelVec.get).zip(compTransPolicy.get.io.enqSelOHVec).zipWithIndex.foreach {
23928607074Ssinsanction      case (((finalOH, selOH), origSelOH), enqIdx) =>
24028607074Ssinsanction        finalOH := Mux(enqCanTrans2Comp.get, Fill(CompEntryNum, selOH.valid) & selOH.bits, Fill(CompEntryNum, origSelOH.valid) & origSelOH.bits)
24128607074Ssinsanction    }
24228607074Ssinsanction
24328607074Ssinsanction    //othersEntryEnq
24428607074Ssinsanction    simpEntryEnqVec.zipWithIndex.foreach { case (simpEntryEnq, simpIdx) =>
24528607074Ssinsanction      val simpEnqOH = finalSimpTransSelVec.get.map(_(simpIdx))
24628607074Ssinsanction      // shit Mux1H directly returns in(0) if the seq has only 1 elements
24728607074Ssinsanction      if (simpEnqOH.size == 1)
24828607074Ssinsanction        simpEntryEnq := Mux(simpEnqOH.head, enqEntryTransVec.head, 0.U.asTypeOf(enqEntryTransVec.head))
24928607074Ssinsanction      else
25028607074Ssinsanction        simpEntryEnq := Mux1H(simpEnqOH, enqEntryTransVec)
25128607074Ssinsanction    }
25228607074Ssinsanction
25328607074Ssinsanction    compEnqVec.get.zip(enqEntryTransVec).zip(io.simpEntryDeqSelVec.get).foreach { case ((compEnq, enqEntry), deqSel) =>
25428607074Ssinsanction      compEnq := Mux(enqCanTrans2Comp.get, enqEntry, Mux1H(deqSel, simpEntryTransVec.get))
25528607074Ssinsanction    }
25628607074Ssinsanction    compEntryEnqVec.zipWithIndex.foreach { case (compEntryEnq, compIdx) =>
25728607074Ssinsanction      val compEnqOH = finalCompTransSelVec.get.map(_(compIdx))
25828607074Ssinsanction      // shit Mux1H directly returns in(0) if the seq has only 1 elements
25928607074Ssinsanction      if (compEnqOH.size == 1)
26028607074Ssinsanction        compEntryEnq := Mux(compEnqOH.head, compEnqVec.get.head, 0.U.asTypeOf(compEnqVec.get.head))
26128607074Ssinsanction      else
26228607074Ssinsanction        compEntryEnq := Mux1H(compEnqOH, compEnqVec.get)
26328607074Ssinsanction    }
26428607074Ssinsanction
26528607074Ssinsanction    assert(PopCount(simpEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of simpEntryEnq is more than numEnq\n")
26628607074Ssinsanction    assert(PopCount(compEntryEnqVec.map(_.valid)) <= params.numEnq.U, "the number of compEntryEnq is more than numEnq\n")
26728607074Ssinsanction  }
26828607074Ssinsanction
2698d081717Sszw_kaixin  if(backendParams.debugEn) {
27028607074Ssinsanction    dontTouch(othersEntryEnqVec)
2718d081717Sszw_kaixin  }
2725db4956bSzhanglyGit
2735db4956bSzhanglyGit  //issueRespVec
27428ac1c16Sxiaofeibao-xjtu  if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) {
27528ac1c16Sxiaofeibao-xjtu    issueRespVec.lazyZip(sqIdxVec.get.zip(lqIdxVec.get)).lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (sqIdx, lqIdx), (issueTimer, deqPortIdx)) =>
276dd40a82bSsinsanction      val respInDatapath = resps(issueTimer(0))(deqPortIdx)
277dd40a82bSsinsanction      val respAfterDatapath = Wire(chiselTypeOf(respInDatapath))
278f7890d3cSXuan Hu      val hitRespsVec = VecInit(memEtyResps.map(x =>
27928ac1c16Sxiaofeibao-xjtu        x.valid &&
28028ac1c16Sxiaofeibao-xjtu        (if (params.needFeedBackSqIdx) x.bits.sqIdx.get === sqIdx else true.B) &&
28128ac1c16Sxiaofeibao-xjtu        (if (params.needFeedBackLqIdx) x.bits.lqIdx.get === lqIdx else true.B)
282f7890d3cSXuan Hu      ).toSeq)
283dd40a82bSsinsanction      respAfterDatapath.valid := hitRespsVec.reduce(_ | _)
284dd40a82bSsinsanction      respAfterDatapath.bits  := (if (memEtyResps.size == 1) memEtyResps.head.bits
285dd40a82bSsinsanction                                  else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq))
286dd40a82bSsinsanction      issueResp := Mux(issueTimer(1), respAfterDatapath, respInDatapath)
287887f9c3dSzhanglinjuan    }
2885db4956bSzhanglyGit  }
2895db4956bSzhanglyGit  else {
290dd40a82bSsinsanction    issueRespVec.lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (issueTimer, deqPortIdx)) =>
2915db4956bSzhanglyGit      val Resp = resps(issueTimer)(deqPortIdx)
2925db4956bSzhanglyGit      issueResp := Resp
2935db4956bSzhanglyGit    }
2945db4956bSzhanglyGit  }
2955db4956bSzhanglyGit
29640283787Ssinsanction  //deq
29728607074Ssinsanction  val enqEntryOldest          = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
29828607074Ssinsanction  val simpEntryOldest         = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
29928607074Ssinsanction  val compEntryOldest         = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
30028607074Ssinsanction  val othersEntryOldest       = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
30128607074Ssinsanction  val enqEntryOldestCancel    = Wire(Vec(params.numDeq, Bool()))
30228607074Ssinsanction  val simpEntryOldestCancel   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool())))
30328607074Ssinsanction  val compEntryOldestCancel   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool())))
30428607074Ssinsanction  val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool())))
30528607074Ssinsanction
30628607074Ssinsanction  io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) =>
30728607074Ssinsanction    enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum))
308eea4a3caSzhanglyGit    enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum))
30940283787Ssinsanction  }
31028607074Ssinsanction
31128607074Ssinsanction  if (params.isAllComp || params.isAllSimp) {
31228607074Ssinsanction    io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
31328607074Ssinsanction      othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum))
314eea4a3caSzhanglyGit      othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum))
315af4bd265SzhanglyGit    }
31640283787Ssinsanction  }
31728607074Ssinsanction  else {
31828607074Ssinsanction    io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
31928607074Ssinsanction      simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum))
320eea4a3caSzhanglyGit      simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum))
32128607074Ssinsanction    }
32228607074Ssinsanction    io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
32328607074Ssinsanction      compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum))
324eea4a3caSzhanglyGit      compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum))
32528607074Ssinsanction    }
326af4bd265SzhanglyGit  }
327cf4a131aSsinsanction
328cf4a131aSsinsanction  if (params.deqFuSame) {
329cf4a131aSsinsanction    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
330cf4a131aSsinsanction    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
331a4d38a63SzhanglyGit    val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool()))
332cf4a131aSsinsanction
333aa2bcc31SzhanglyGit    subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U
334aa2bcc31SzhanglyGit    subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U
33528607074Ssinsanction
33628607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
33728607074Ssinsanction      subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries)
33828607074Ssinsanction      subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
339eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec)
340eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse)
341cf4a131aSsinsanction
34228607074Ssinsanction      io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1))
343aa2bcc31SzhanglyGit      io.deqEntry(1) := subDeqPolicyEntryVec(0)
34428607074Ssinsanction      io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))
345a4d38a63SzhanglyGit      io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
34628607074Ssinsanction    }
34728607074Ssinsanction    else {
34828607074Ssinsanction      subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
34928607074Ssinsanction      subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries)
350eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse)
351eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec)
35228607074Ssinsanction
35328607074Ssinsanction      io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid,
35428607074Ssinsanction                            compEntryOldest.get(0),
35528607074Ssinsanction                            Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1)))
35628607074Ssinsanction      io.deqEntry(1) := subDeqPolicyEntryVec(0)
35728607074Ssinsanction      io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid,
35828607074Ssinsanction                                compEntryOldestCancel.get(0),
35928607074Ssinsanction                                Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)))
36028607074Ssinsanction      io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
36128607074Ssinsanction    }
362cf4a131aSsinsanction
363cf4a131aSsinsanction    when (subDeqPolicyValidVec(0)) {
364aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
36540283787Ssinsanction    }
366cf4a131aSsinsanction    when (subDeqPolicyValidVec(1)) {
367aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
368f7f73727Ssinsanction    }
369f7f73727Ssinsanction  }
370f7f73727Ssinsanction  else {
37128607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
37228607074Ssinsanction      io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) =>
37328607074Ssinsanction        io.deqEntry(i)     := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i))
37428607074Ssinsanction        io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i))
37528607074Ssinsanction      }
37628607074Ssinsanction    }
37728607074Ssinsanction    else {
37828607074Ssinsanction      io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) =>
37928607074Ssinsanction        io.deqEntry(i)     := Mux(compSel.valid,
38028607074Ssinsanction                                  compEntryOldest.get(i),
38128607074Ssinsanction                                  Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i)))
38228607074Ssinsanction        io.cancelDeqVec(i) := Mux(compSel.valid,
38328607074Ssinsanction                                  compEntryOldestCancel.get(i),
38428607074Ssinsanction                                  Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i)))
38528607074Ssinsanction      }
386af4bd265SzhanglyGit    }
387af4bd265SzhanglyGit  }
388af4bd265SzhanglyGit
3895db4956bSzhanglyGit  io.valid                          := validVec.asUInt
390*c0beb497Sxiaofeibao  io.issued                         := issuedVec.asUInt
3915db4956bSzhanglyGit  io.canIssue                       := canIssueVec.asUInt
3925db4956bSzhanglyGit  io.fuType                         := fuTypeVec
3935db4956bSzhanglyGit  io.dataSources                    := dataSourceVec
394864480f4Sxiaofeibao-xjtu  io.srcWakeUpL1ExuOH.foreach(_     := srcWakeUpL1ExuOHVec.get)
395eea4a3caSzhanglyGit  io.loadDependency                 := loadDependencyVec
396aa2bcc31SzhanglyGit  io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) =>
397aa2bcc31SzhanglyGit    isFirstIssue                    := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec)
3988d081717Sszw_kaixin  }
39928607074Ssinsanction  io.simpEntryEnqSelVec.foreach(_   := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid)))
40028607074Ssinsanction  io.compEntryEnqSelVec.foreach(_   := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid)))
40128607074Ssinsanction  io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid)))
402aa2bcc31SzhanglyGit  io.robIdx.foreach(_               := robIdxVec)
403aa2bcc31SzhanglyGit
4047e471bf8SXuan Hu
405aa2bcc31SzhanglyGit  def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = {
406aa2bcc31SzhanglyGit    in.flush                    := io.flush
407aa2bcc31SzhanglyGit    in.wakeUpFromWB             := io.wakeUpFromWB
408aa2bcc31SzhanglyGit    in.wakeUpFromIQ             := io.wakeUpFromIQ
409b6279fc6SZiyue Zhang    in.vlIsZero                 := io.vlIsZero
410b6279fc6SZiyue Zhang    in.vlIsVlmax                := io.vlIsVlmax
411aa2bcc31SzhanglyGit    in.og0Cancel                := io.og0Cancel
412aa2bcc31SzhanglyGit    in.og1Cancel                := io.og1Cancel
413aa2bcc31SzhanglyGit    in.ldCancel                 := io.ldCancel
414aa2bcc31SzhanglyGit    in.deqSel                   := deqSelVec(entryIdx)
415aa2bcc31SzhanglyGit    in.deqPortIdxWrite          := deqPortIdxWriteVec(entryIdx)
416aa2bcc31SzhanglyGit    in.issueResp                := issueRespVec(entryIdx)
417aa2bcc31SzhanglyGit    if (params.isVecMemIQ) {
418aa2bcc31SzhanglyGit      in.fromLsq.get.sqDeqPtr   := io.vecMemIn.get.sqDeqPtr
419aa2bcc31SzhanglyGit      in.fromLsq.get.lqDeqPtr   := io.vecMemIn.get.lqDeqPtr
420aa2bcc31SzhanglyGit    }
421aa2bcc31SzhanglyGit    validVec(entryIdx)          := out.valid
422*c0beb497Sxiaofeibao    issuedVec(entryIdx)         := out.issued
423aa2bcc31SzhanglyGit    canIssueVec(entryIdx)       := out.canIssue
424aa2bcc31SzhanglyGit    fuTypeVec(entryIdx)         := out.fuType
425aa2bcc31SzhanglyGit    robIdxVec(entryIdx)         := out.robIdx
426aa2bcc31SzhanglyGit    dataSourceVec(entryIdx)     := out.dataSource
427aa2bcc31SzhanglyGit    isFirstIssueVec(entryIdx)   := out.isFirstIssue
428aa2bcc31SzhanglyGit    entries(entryIdx)           := out.entry
429aa2bcc31SzhanglyGit    deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead
430aa2bcc31SzhanglyGit    issueTimerVec(entryIdx)     := out.issueTimerRead
431eea4a3caSzhanglyGit    loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency
432ec49b127Ssinsanction    cancelBypassVec(entryIdx)   := out.cancelBypass
433aa2bcc31SzhanglyGit    if (params.hasIQWakeUp) {
434aa2bcc31SzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx)     := out.srcWakeUpL1ExuOH.get
435aa2bcc31SzhanglyGit    }
43628ac1c16Sxiaofeibao-xjtu    if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) {
43738f78b5dSxiaofeibao-xjtu      sqIdxVec.get(entryIdx) := out.entry.bits.payload.sqIdx
43828ac1c16Sxiaofeibao-xjtu      lqIdxVec.get(entryIdx) := out.entry.bits.payload.lqIdx
439aa2bcc31SzhanglyGit    }
440a6938b17Ssinsanction    entryInValidVec(entryIdx)       := out.entryInValid
441a6938b17Ssinsanction    entryOutDeqValidVec(entryIdx)   := out.entryOutDeqValid
442a6938b17Ssinsanction    entryOutTransValidVec(entryIdx) := out.entryOutTransValid
443e3ef3537Ssinsanction    perfWakeupByWBVec(entryIdx)     := out.perfWakeupByWB
444e3ef3537Ssinsanction    if (params.hasIQWakeUp) {
445e3ef3537Ssinsanction      perfLdCancelVec.get(entryIdx)   := out.perfLdCancel.get
446e3ef3537Ssinsanction      perfOg0CancelVec.get(entryIdx)  := out.perfOg0Cancel.get
447e3ef3537Ssinsanction      perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get
448aa2bcc31SzhanglyGit    }
449aa2bcc31SzhanglyGit  }
450a6938b17Ssinsanction
45125df626eSgood-circle  io.vecLdIn.foreach(dontTouch(_))
452a6938b17Ssinsanction
453a6938b17Ssinsanction  // entries perf counter
454a6938b17Ssinsanction  // enq
455a6938b17Ssinsanction  for (i <- 0 until params.numEnq) {
456a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i))
457a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i))
458a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i))
459a6938b17Ssinsanction  }
460a6938b17Ssinsanction  // simple
461a6938b17Ssinsanction  for (i <- 0 until params.numSimp) {
462a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq))
463a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq))
464a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq))
465a6938b17Ssinsanction  }
466a6938b17Ssinsanction  // complex
467a6938b17Ssinsanction  for (i <- 0 until params.numComp) {
468a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp))
469a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp))
470a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp))
471a6938b17Ssinsanction  }
472a6938b17Ssinsanction  // total
473a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq)))
474a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq)))
475a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq)))
476e3ef3537Ssinsanction  for (srcIdx <- 0 until params.numRegSrc) {
477e3ef3537Ssinsanction    XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx))))
478d280e426Slewislzh    if (params.hasIQWakeUp) {
479e3ef3537Ssinsanction      XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx))))
480e3ef3537Ssinsanction      XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx))))
481e3ef3537Ssinsanction      for (iqIdx <- 0 until params.numWakeupFromIQ) {
482e3ef3537Ssinsanction        XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx))))
483e3ef3537Ssinsanction      }
484e3ef3537Ssinsanction    }
485d280e426Slewislzh  }
486a6938b17Ssinsanction
487a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq)))
488a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq)))
489a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq)))
4907e471bf8SXuan Hu
491e3ef3537Ssinsanction  for (srcIdx <- 0 until params.numRegSrc) {
492e3ef3537Ssinsanction    XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx))))
493d280e426Slewislzh    if (params.hasIQWakeUp) {
494e3ef3537Ssinsanction      XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx))))
495e3ef3537Ssinsanction      XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx))))
496e3ef3537Ssinsanction      for (iqIdx <- 0 until params.numWakeupFromIQ) {
497e3ef3537Ssinsanction        XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx))))
498e3ef3537Ssinsanction      }
499e3ef3537Ssinsanction    }
500e3ef3537Ssinsanction  }
501e3ef3537Ssinsanction
502e3ef3537Ssinsanction  for (t <- FuType.functionNameMap.keys) {
503e3ef3537Ssinsanction    val fuName = FuType.functionNameMap(t)
504e3ef3537Ssinsanction    if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) {
505e3ef3537Ssinsanction      for (srcIdx <- 0 until params.numRegSrc) {
506e3ef3537Ssinsanction        XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
507e3ef3537Ssinsanction        if (params.hasIQWakeUp) {
508e3ef3537Ssinsanction          XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
509e3ef3537Ssinsanction          XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
510e3ef3537Ssinsanction          for (iqIdx <- 0 until params.numWakeupFromIQ) {
511e3ef3537Ssinsanction            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) }))
512e3ef3537Ssinsanction          }
513e3ef3537Ssinsanction        }
514e3ef3537Ssinsanction      }
515e3ef3537Ssinsanction    }
516d280e426Slewislzh  }
517aa2bcc31SzhanglyGit}
518aa2bcc31SzhanglyGit
519aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
520aa2bcc31SzhanglyGit  val flush               = Flipped(ValidIO(new Redirect))
521aa2bcc31SzhanglyGit  //enq
522aa2bcc31SzhanglyGit  val enq                 = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
523aa2bcc31SzhanglyGit  val og0Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
524aa2bcc31SzhanglyGit  val og1Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
525c38df446SzhanglyGit  val og2Resp             = OptionWrapper(params.inVfSchd, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))))
526aa2bcc31SzhanglyGit  //deq sel
527aa2bcc31SzhanglyGit  val deqReady            = Vec(params.numDeq, Input(Bool()))
528aa2bcc31SzhanglyGit  val deqSelOH            = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W))))
529aa2bcc31SzhanglyGit  val enqEntryOldestSel   = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W))))
53028607074Ssinsanction  val simpEntryOldestSel  = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W)))))
53128607074Ssinsanction  val compEntryOldestSel  = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W)))))
53228607074Ssinsanction  val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))))
533aa2bcc31SzhanglyGit  val subDeqRequest       = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
534aa2bcc31SzhanglyGit  val subDeqSelOH         = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
535aa2bcc31SzhanglyGit  // wakeup
536aa2bcc31SzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
537aa2bcc31SzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
538b6279fc6SZiyue Zhang  val vlIsZero            = Input(Bool())
539b6279fc6SZiyue Zhang  val vlIsVlmax           = Input(Bool())
540be9ff987Ssinsanction  val og0Cancel           = Input(ExuVec())
541be9ff987Ssinsanction  val og1Cancel           = Input(ExuVec())
542aa2bcc31SzhanglyGit  val ldCancel            = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO))
543aa2bcc31SzhanglyGit  //entries status
544aa2bcc31SzhanglyGit  val valid               = Output(UInt(params.numEntries.W))
545*c0beb497Sxiaofeibao  val issued              = Output(UInt(params.numEntries.W))
546aa2bcc31SzhanglyGit  val canIssue            = Output(UInt(params.numEntries.W))
547aa2bcc31SzhanglyGit  val fuType              = Vec(params.numEntries, Output(FuType()))
548aa2bcc31SzhanglyGit  val dataSources         = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource())))
549ec49b127Ssinsanction  val loadDependency      = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W)))
550864480f4Sxiaofeibao-xjtu  val srcWakeUpL1ExuOH    = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuVec()))))
551aa2bcc31SzhanglyGit  //deq status
552aa2bcc31SzhanglyGit  val isFirstIssue        = Vec(params.numDeq, Output(Bool()))
553aa2bcc31SzhanglyGit  val deqEntry            = Vec(params.numDeq, ValidIO(new EntryBundle))
554aa2bcc31SzhanglyGit  val cancelDeqVec        = Vec(params.numDeq, Output(Bool()))
555e07131b2Ssinsanction
556e07131b2Ssinsanction  // load/hybird only
557e07131b2Ssinsanction  val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle {
558e07131b2Ssinsanction    val finalIssueResp    = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
559e07131b2Ssinsanction    val memAddrIssueResp  = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
560e07131b2Ssinsanction  })
561aa2bcc31SzhanglyGit  // mem only
562e07131b2Ssinsanction  val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle {
563aa2bcc31SzhanglyGit    val slowResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
564d3372210SzhanglyGit    val fastResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
565e07131b2Ssinsanction  })
56699944b79Ssinsanction  // vec mem only
567aa2bcc31SzhanglyGit  val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle {
568aa2bcc31SzhanglyGit    val sqDeqPtr          = Input(new SqPtr)
569aa2bcc31SzhanglyGit    val lqDeqPtr          = Input(new LqPtr)
570aa2bcc31SzhanglyGit  })
5717e471bf8SXuan Hu  val vecLdIn = OptionWrapper(params.isVecLduIQ, new Bundle {
5727e471bf8SXuan Hu    val resp              = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
5737e471bf8SXuan Hu  })
574aa2bcc31SzhanglyGit  val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr)))
575aa2bcc31SzhanglyGit
57628607074Ssinsanction  // trans
57728607074Ssinsanction  val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W))))
57828607074Ssinsanction  val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W))))
57928607074Ssinsanction  val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W))))
58028607074Ssinsanction  val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W))))
581aa2bcc31SzhanglyGit
582aa2bcc31SzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
5835db4956bSzhanglyGit}
584