xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision 42b6cdf9744fdb03eb7e5a7e7505d0c89eb40abd)
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
63*42b6cdf9Ssinsanction  if (params.needOg2Resp)
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()))
84c0beb497Sxiaofeibao  val issuedVec           = Wire(Vec(params.numEntries, Bool()))
85c0beb497Sxiaofeibao  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.
186c0beb497Sxiaofeibao    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) {
189c0beb497Sxiaofeibao      othersTransSelVec.get(1).valid := Mux(!validForTrans(0), othersTransPolicy.get.io.enqSelOHVec(0).valid, othersTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1)
190c0beb497Sxiaofeibao      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.
224c0beb497Sxiaofeibao    simpTransSelVec.get(0).valid := simpTransPolicy.get.io.enqSelOHVec(0).valid && validForTrans(0)
22528607074Ssinsanction    simpTransSelVec.get(0).bits  := simpTransPolicy.get.io.enqSelOHVec(0).bits
226c0beb497Sxiaofeibao    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) {
229c0beb497Sxiaofeibao      simpTransSelVec.get(1).valid := Mux(!validForTrans(0), simpTransPolicy.get.io.enqSelOHVec(0).valid, simpTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1)
230c0beb497Sxiaofeibao      simpTransSelVec.get(1).bits  := Mux(!validForTrans(0), simpTransPolicy.get.io.enqSelOHVec(0).bits,  simpTransPolicy.get.io.enqSelOHVec(1).bits)
231c0beb497Sxiaofeibao      compTransSelVec.get(1).valid := Mux(!validForTrans(0), compTransPolicy.get.io.enqSelOHVec(0).valid, compTransPolicy.get.io.enqSelOHVec(1).valid) && validForTrans(1)
232c0beb497Sxiaofeibao      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)) =>
276*42b6cdf9Ssinsanction      val respInDatapath = if (!params.isVecMemIQ) resps(issueTimer(0))(deqPortIdx)
277*42b6cdf9Ssinsanction                           else resps(issueTimer)(deqPortIdx)
278dd40a82bSsinsanction      val respAfterDatapath = Wire(chiselTypeOf(respInDatapath))
279f7890d3cSXuan Hu      val hitRespsVec = VecInit(memEtyResps.map(x =>
28028ac1c16Sxiaofeibao-xjtu        x.valid &&
28128ac1c16Sxiaofeibao-xjtu        (if (params.needFeedBackSqIdx) x.bits.sqIdx.get === sqIdx else true.B) &&
28228ac1c16Sxiaofeibao-xjtu        (if (params.needFeedBackLqIdx) x.bits.lqIdx.get === lqIdx else true.B)
283f7890d3cSXuan Hu      ).toSeq)
284dd40a82bSsinsanction      respAfterDatapath.valid := hitRespsVec.reduce(_ | _)
285dd40a82bSsinsanction      respAfterDatapath.bits  := (if (memEtyResps.size == 1) memEtyResps.head.bits
286dd40a82bSsinsanction                                  else Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq))
287*42b6cdf9Ssinsanction      issueResp := (if (!params.isVecMemIQ) Mux(issueTimer(1), respAfterDatapath, respInDatapath)
288*42b6cdf9Ssinsanction                    else Mux(issueTimer === "b11".U, respAfterDatapath, respInDatapath))
289887f9c3dSzhanglinjuan    }
2905db4956bSzhanglyGit  }
2915db4956bSzhanglyGit  else {
292dd40a82bSsinsanction    issueRespVec.lazyZip(issueTimerVec.lazyZip(deqPortIdxReadVec)).foreach { case (issueResp, (issueTimer, deqPortIdx)) =>
2935db4956bSzhanglyGit      val Resp = resps(issueTimer)(deqPortIdx)
2945db4956bSzhanglyGit      issueResp := Resp
2955db4956bSzhanglyGit    }
2965db4956bSzhanglyGit  }
2975db4956bSzhanglyGit
29840283787Ssinsanction  //deq
29928607074Ssinsanction  val enqEntryOldest          = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
30028607074Ssinsanction  val simpEntryOldest         = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
30128607074Ssinsanction  val compEntryOldest         = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
30228607074Ssinsanction  val othersEntryOldest       = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, ValidIO(new EntryBundle))))
30328607074Ssinsanction  val enqEntryOldestCancel    = Wire(Vec(params.numDeq, Bool()))
30428607074Ssinsanction  val simpEntryOldestCancel   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool())))
30528607074Ssinsanction  val compEntryOldestCancel   = OptionWrapper(params.hasCompAndSimp, Wire(Vec(params.numDeq, Bool())))
30628607074Ssinsanction  val othersEntryOldestCancel = OptionWrapper(params.isAllComp || params.isAllSimp, Wire(Vec(params.numDeq, Bool())))
30728607074Ssinsanction
30828607074Ssinsanction  io.enqEntryOldestSel.zipWithIndex.map { case (sel, deqIdx) =>
30928607074Ssinsanction    enqEntryOldest(deqIdx) := Mux1H(sel.bits, entries.take(EnqEntryNum))
310eea4a3caSzhanglyGit    enqEntryOldestCancel(deqIdx) := Mux1H(sel.bits, cancelBypassVec.take(EnqEntryNum))
31140283787Ssinsanction  }
31228607074Ssinsanction
31328607074Ssinsanction  if (params.isAllComp || params.isAllSimp) {
31428607074Ssinsanction    io.othersEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
31528607074Ssinsanction      othersEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum))
316eea4a3caSzhanglyGit      othersEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum))
317af4bd265SzhanglyGit    }
31840283787Ssinsanction  }
31928607074Ssinsanction  else {
32028607074Ssinsanction    io.simpEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
32128607074Ssinsanction      simpEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).take(SimpEntryNum))
322eea4a3caSzhanglyGit      simpEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).take(SimpEntryNum))
32328607074Ssinsanction    }
32428607074Ssinsanction    io.compEntryOldestSel.get.zipWithIndex.map { case (sel, deqIdx) =>
32528607074Ssinsanction      compEntryOldest.get(deqIdx) := Mux1H(sel.bits, entries.drop(EnqEntryNum).takeRight(CompEntryNum))
326eea4a3caSzhanglyGit      compEntryOldestCancel.get(deqIdx) := Mux1H(sel.bits, cancelBypassVec.drop(EnqEntryNum).takeRight(CompEntryNum))
32728607074Ssinsanction    }
328af4bd265SzhanglyGit  }
329cf4a131aSsinsanction
330cf4a131aSsinsanction  if (params.deqFuSame) {
331cf4a131aSsinsanction    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
332cf4a131aSsinsanction    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
333a4d38a63SzhanglyGit    val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool()))
334cf4a131aSsinsanction
335aa2bcc31SzhanglyGit    subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U
336aa2bcc31SzhanglyGit    subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U
33728607074Ssinsanction
33828607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
33928607074Ssinsanction      subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries)
34028607074Ssinsanction      subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
341eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec)
342eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse)
343cf4a131aSsinsanction
34428607074Ssinsanction      io.deqEntry(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldest.get(0), subDeqPolicyEntryVec(1))
345aa2bcc31SzhanglyGit      io.deqEntry(1) := subDeqPolicyEntryVec(0)
34628607074Ssinsanction      io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel.get(0).valid, othersEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1))
347a4d38a63SzhanglyGit      io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
34828607074Ssinsanction    }
34928607074Ssinsanction    else {
35028607074Ssinsanction      subDeqPolicyEntryVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
35128607074Ssinsanction      subDeqPolicyEntryVec(1) := PriorityMux(io.subDeqRequest.get(0), entries)
352eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(0) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.reverse)
353eea4a3caSzhanglyGit      subDeqPolicyCancelBypassVec(1) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec)
35428607074Ssinsanction
35528607074Ssinsanction      io.deqEntry(0) := Mux(io.compEntryOldestSel.get(0).valid,
35628607074Ssinsanction                            compEntryOldest.get(0),
35728607074Ssinsanction                            Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldest.get(0), subDeqPolicyEntryVec(1)))
35828607074Ssinsanction      io.deqEntry(1) := subDeqPolicyEntryVec(0)
35928607074Ssinsanction      io.cancelDeqVec(0) := Mux(io.compEntryOldestSel.get(0).valid,
36028607074Ssinsanction                                compEntryOldestCancel.get(0),
36128607074Ssinsanction                                Mux(io.simpEntryOldestSel.get(0).valid, simpEntryOldestCancel.get(0), subDeqPolicyCancelBypassVec(1)))
36228607074Ssinsanction      io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
36328607074Ssinsanction    }
364cf4a131aSsinsanction
365cf4a131aSsinsanction    when (subDeqPolicyValidVec(0)) {
366aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
36740283787Ssinsanction    }
368cf4a131aSsinsanction    when (subDeqPolicyValidVec(1)) {
369aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
370f7f73727Ssinsanction    }
371f7f73727Ssinsanction  }
372f7f73727Ssinsanction  else {
37328607074Ssinsanction    if (params.isAllComp || params.isAllSimp) {
37428607074Ssinsanction      io.othersEntryOldestSel.get.zipWithIndex.foreach { case (sel, i) =>
37528607074Ssinsanction        io.deqEntry(i)     := Mux(sel.valid, othersEntryOldest.get(i), enqEntryOldest(i))
37628607074Ssinsanction        io.cancelDeqVec(i) := Mux(sel.valid, othersEntryOldestCancel.get(i), enqEntryOldestCancel(i))
37728607074Ssinsanction      }
37828607074Ssinsanction    }
37928607074Ssinsanction    else {
38028607074Ssinsanction      io.compEntryOldestSel.get.zip(io.simpEntryOldestSel.get).zipWithIndex.foreach { case ((compSel, simpSel), i) =>
38128607074Ssinsanction        io.deqEntry(i)     := Mux(compSel.valid,
38228607074Ssinsanction                                  compEntryOldest.get(i),
38328607074Ssinsanction                                  Mux(simpSel.valid, simpEntryOldest.get(i), enqEntryOldest(i)))
38428607074Ssinsanction        io.cancelDeqVec(i) := Mux(compSel.valid,
38528607074Ssinsanction                                  compEntryOldestCancel.get(i),
38628607074Ssinsanction                                  Mux(simpSel.valid, simpEntryOldestCancel.get(i), enqEntryOldestCancel(i)))
38728607074Ssinsanction      }
388af4bd265SzhanglyGit    }
389af4bd265SzhanglyGit  }
390af4bd265SzhanglyGit
3915db4956bSzhanglyGit  io.valid                          := validVec.asUInt
392c0beb497Sxiaofeibao  io.issued                         := issuedVec.asUInt
3935db4956bSzhanglyGit  io.canIssue                       := canIssueVec.asUInt
3945db4956bSzhanglyGit  io.fuType                         := fuTypeVec
3955db4956bSzhanglyGit  io.dataSources                    := dataSourceVec
396864480f4Sxiaofeibao-xjtu  io.srcWakeUpL1ExuOH.foreach(_     := srcWakeUpL1ExuOHVec.get)
397eea4a3caSzhanglyGit  io.loadDependency                 := loadDependencyVec
398aa2bcc31SzhanglyGit  io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) =>
399aa2bcc31SzhanglyGit    isFirstIssue                    := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec)
4008d081717Sszw_kaixin  }
40128607074Ssinsanction  io.simpEntryEnqSelVec.foreach(_   := finalSimpTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(SimpEntryNum, x._2.valid)))
40228607074Ssinsanction  io.compEntryEnqSelVec.foreach(_   := finalCompTransSelVec.get.zip(compEnqVec.get).map(x => x._1 & Fill(CompEntryNum, x._2.valid)))
40328607074Ssinsanction  io.othersEntryEnqSelVec.foreach(_ := finalOthersTransSelVec.get.zip(enqEntryTransVec).map(x => x._1 & Fill(OthersEntryNum, x._2.valid)))
404aa2bcc31SzhanglyGit  io.robIdx.foreach(_               := robIdxVec)
405aa2bcc31SzhanglyGit
4067e471bf8SXuan Hu
407aa2bcc31SzhanglyGit  def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = {
408aa2bcc31SzhanglyGit    in.flush                    := io.flush
409aa2bcc31SzhanglyGit    in.wakeUpFromWB             := io.wakeUpFromWB
410aa2bcc31SzhanglyGit    in.wakeUpFromIQ             := io.wakeUpFromIQ
411b6279fc6SZiyue Zhang    in.vlIsZero                 := io.vlIsZero
412b6279fc6SZiyue Zhang    in.vlIsVlmax                := io.vlIsVlmax
413aa2bcc31SzhanglyGit    in.og0Cancel                := io.og0Cancel
414aa2bcc31SzhanglyGit    in.og1Cancel                := io.og1Cancel
415aa2bcc31SzhanglyGit    in.ldCancel                 := io.ldCancel
416aa2bcc31SzhanglyGit    in.deqSel                   := deqSelVec(entryIdx)
417aa2bcc31SzhanglyGit    in.deqPortIdxWrite          := deqPortIdxWriteVec(entryIdx)
418aa2bcc31SzhanglyGit    in.issueResp                := issueRespVec(entryIdx)
419aa2bcc31SzhanglyGit    if (params.isVecMemIQ) {
420aa2bcc31SzhanglyGit      in.fromLsq.get.sqDeqPtr   := io.vecMemIn.get.sqDeqPtr
421aa2bcc31SzhanglyGit      in.fromLsq.get.lqDeqPtr   := io.vecMemIn.get.lqDeqPtr
422aa2bcc31SzhanglyGit    }
423aa2bcc31SzhanglyGit    validVec(entryIdx)          := out.valid
424c0beb497Sxiaofeibao    issuedVec(entryIdx)         := out.issued
425aa2bcc31SzhanglyGit    canIssueVec(entryIdx)       := out.canIssue
426aa2bcc31SzhanglyGit    fuTypeVec(entryIdx)         := out.fuType
427aa2bcc31SzhanglyGit    robIdxVec(entryIdx)         := out.robIdx
428aa2bcc31SzhanglyGit    dataSourceVec(entryIdx)     := out.dataSource
429aa2bcc31SzhanglyGit    isFirstIssueVec(entryIdx)   := out.isFirstIssue
430aa2bcc31SzhanglyGit    entries(entryIdx)           := out.entry
431aa2bcc31SzhanglyGit    deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead
432aa2bcc31SzhanglyGit    issueTimerVec(entryIdx)     := out.issueTimerRead
433eea4a3caSzhanglyGit    loadDependencyVec(entryIdx) := out.entry.bits.status.mergedLoadDependency
434ec49b127Ssinsanction    cancelBypassVec(entryIdx)   := out.cancelBypass
435aa2bcc31SzhanglyGit    if (params.hasIQWakeUp) {
436aa2bcc31SzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx)     := out.srcWakeUpL1ExuOH.get
437aa2bcc31SzhanglyGit    }
43828ac1c16Sxiaofeibao-xjtu    if (params.needFeedBackSqIdx || params.needFeedBackLqIdx) {
43938f78b5dSxiaofeibao-xjtu      sqIdxVec.get(entryIdx) := out.entry.bits.payload.sqIdx
44028ac1c16Sxiaofeibao-xjtu      lqIdxVec.get(entryIdx) := out.entry.bits.payload.lqIdx
441aa2bcc31SzhanglyGit    }
442a6938b17Ssinsanction    entryInValidVec(entryIdx)       := out.entryInValid
443a6938b17Ssinsanction    entryOutDeqValidVec(entryIdx)   := out.entryOutDeqValid
444a6938b17Ssinsanction    entryOutTransValidVec(entryIdx) := out.entryOutTransValid
445e3ef3537Ssinsanction    perfWakeupByWBVec(entryIdx)     := out.perfWakeupByWB
446e3ef3537Ssinsanction    if (params.hasIQWakeUp) {
447e3ef3537Ssinsanction      perfLdCancelVec.get(entryIdx)   := out.perfLdCancel.get
448e3ef3537Ssinsanction      perfOg0CancelVec.get(entryIdx)  := out.perfOg0Cancel.get
449e3ef3537Ssinsanction      perfWakeupByIQVec.get(entryIdx) := out.perfWakeupByIQ.get
450aa2bcc31SzhanglyGit    }
451aa2bcc31SzhanglyGit  }
452a6938b17Ssinsanction
45325df626eSgood-circle  io.vecLdIn.foreach(dontTouch(_))
454a6938b17Ssinsanction
455a6938b17Ssinsanction  // entries perf counter
456a6938b17Ssinsanction  // enq
457a6938b17Ssinsanction  for (i <- 0 until params.numEnq) {
458a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_in_cnt", entryInValidVec(i))
459a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i))
460a6938b17Ssinsanction    XSPerfAccumulate(s"enqEntry_${i}_out_trans_cnt", entryOutTransValidVec(i))
461a6938b17Ssinsanction  }
462a6938b17Ssinsanction  // simple
463a6938b17Ssinsanction  for (i <- 0 until params.numSimp) {
464a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq))
465a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq))
466a6938b17Ssinsanction    XSPerfAccumulate(s"simpEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq))
467a6938b17Ssinsanction  }
468a6938b17Ssinsanction  // complex
469a6938b17Ssinsanction  for (i <- 0 until params.numComp) {
470a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_in_cnt", entryInValidVec(i + params.numEnq + params.numSimp))
471a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_out_deq_cnt", entryOutDeqValidVec(i + params.numEnq + params.numSimp))
472a6938b17Ssinsanction    XSPerfAccumulate(s"compEntry_${i}_out_trans_cnt", entryOutTransValidVec(i + params.numEnq + params.numSimp))
473a6938b17Ssinsanction  }
474a6938b17Ssinsanction  // total
475a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_in_cnt", PopCount(entryInValidVec.take(params.numEnq)))
476a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.take(params.numEnq)))
477a6938b17Ssinsanction  XSPerfAccumulate(s"enqEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.take(params.numEnq)))
478e3ef3537Ssinsanction  for (srcIdx <- 0 until params.numRegSrc) {
479e3ef3537Ssinsanction    XSPerfAccumulate(s"enqEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.take(params.numEnq).map(_(srcIdx))))
480d280e426Slewislzh    if (params.hasIQWakeUp) {
481e3ef3537Ssinsanction      XSPerfAccumulate(s"enqEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.take(params.numEnq).map(_(srcIdx))))
482e3ef3537Ssinsanction      XSPerfAccumulate(s"enqEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.take(params.numEnq).map(_(srcIdx))))
483e3ef3537Ssinsanction      for (iqIdx <- 0 until params.numWakeupFromIQ) {
484e3ef3537Ssinsanction        XSPerfAccumulate(s"enqEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.take(params.numEnq).map(_(srcIdx)(iqIdx))))
485e3ef3537Ssinsanction      }
486e3ef3537Ssinsanction    }
487d280e426Slewislzh  }
488a6938b17Ssinsanction
489a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_in_cnt", PopCount(entryInValidVec.drop(params.numEnq)))
490a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_out_deq_cnt", PopCount(entryOutDeqValidVec.drop(params.numEnq)))
491a6938b17Ssinsanction  XSPerfAccumulate(s"othersEntry_all_out_trans_cnt", PopCount(entryOutTransValidVec.drop(params.numEnq)))
4927e471bf8SXuan Hu
493e3ef3537Ssinsanction  for (srcIdx <- 0 until params.numRegSrc) {
494e3ef3537Ssinsanction    XSPerfAccumulate(s"othersEntry_all_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.drop(params.numEnq).map(_(srcIdx))))
495d280e426Slewislzh    if (params.hasIQWakeUp) {
496e3ef3537Ssinsanction      XSPerfAccumulate(s"othersEntry_all_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.drop(params.numEnq).map(_(srcIdx))))
497e3ef3537Ssinsanction      XSPerfAccumulate(s"othersEntry_all_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.drop(params.numEnq).map(_(srcIdx))))
498e3ef3537Ssinsanction      for (iqIdx <- 0 until params.numWakeupFromIQ) {
499e3ef3537Ssinsanction        XSPerfAccumulate(s"othersEntry_all_wakeup_iq_from_exu${params.wakeUpSourceExuIdx(iqIdx)}_src${srcIdx}_cnt", PopCount(perfWakeupByIQVec.get.drop(params.numEnq).map(_(srcIdx)(iqIdx))))
500e3ef3537Ssinsanction      }
501e3ef3537Ssinsanction    }
502e3ef3537Ssinsanction  }
503e3ef3537Ssinsanction
504e3ef3537Ssinsanction  for (t <- FuType.functionNameMap.keys) {
505e3ef3537Ssinsanction    val fuName = FuType.functionNameMap(t)
506e3ef3537Ssinsanction    if (params.getFuCfgs.map(_.fuType == t).reduce(_ | _) && params.getFuCfgs.size > 1) {
507e3ef3537Ssinsanction      for (srcIdx <- 0 until params.numRegSrc) {
508e3ef3537Ssinsanction        XSPerfAccumulate(s"allEntry_futype_${fuName}_wakeup_wb_src${srcIdx}_cnt", PopCount(perfWakeupByWBVec.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
509e3ef3537Ssinsanction        if (params.hasIQWakeUp) {
510e3ef3537Ssinsanction          XSPerfAccumulate(s"allEntry_futype_${fuName}_ldCancel_src${srcIdx}_cnt", PopCount(perfLdCancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
511e3ef3537Ssinsanction          XSPerfAccumulate(s"allEntry_futype_${fuName}_og0Cancel_src${srcIdx}_cnt", PopCount(perfOg0CancelVec.get.zip(fuTypeVec).map{ case(x, fu) => x(srcIdx) && fu(t.id) }))
512e3ef3537Ssinsanction          for (iqIdx <- 0 until params.numWakeupFromIQ) {
513e3ef3537Ssinsanction            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) }))
514e3ef3537Ssinsanction          }
515e3ef3537Ssinsanction        }
516e3ef3537Ssinsanction      }
517e3ef3537Ssinsanction    }
518d280e426Slewislzh  }
519aa2bcc31SzhanglyGit}
520aa2bcc31SzhanglyGit
521aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
522aa2bcc31SzhanglyGit  val flush               = Flipped(ValidIO(new Redirect))
523aa2bcc31SzhanglyGit  //enq
524aa2bcc31SzhanglyGit  val enq                 = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
525aa2bcc31SzhanglyGit  val og0Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
526aa2bcc31SzhanglyGit  val og1Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
527*42b6cdf9Ssinsanction  val og2Resp             = OptionWrapper(params.needOg2Resp, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))))
528aa2bcc31SzhanglyGit  //deq sel
529aa2bcc31SzhanglyGit  val deqReady            = Vec(params.numDeq, Input(Bool()))
530aa2bcc31SzhanglyGit  val deqSelOH            = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W))))
531aa2bcc31SzhanglyGit  val enqEntryOldestSel   = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W))))
53228607074Ssinsanction  val simpEntryOldestSel  = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numSimp.W)))))
53328607074Ssinsanction  val compEntryOldestSel  = OptionWrapper(params.hasCompAndSimp, Vec(params.numDeq, Flipped(ValidIO(UInt(params.numComp.W)))))
53428607074Ssinsanction  val othersEntryOldestSel= OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))))
535aa2bcc31SzhanglyGit  val subDeqRequest       = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
536aa2bcc31SzhanglyGit  val subDeqSelOH         = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
537aa2bcc31SzhanglyGit  // wakeup
538aa2bcc31SzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
539aa2bcc31SzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
540b6279fc6SZiyue Zhang  val vlIsZero            = Input(Bool())
541b6279fc6SZiyue Zhang  val vlIsVlmax           = Input(Bool())
542be9ff987Ssinsanction  val og0Cancel           = Input(ExuVec())
543be9ff987Ssinsanction  val og1Cancel           = Input(ExuVec())
544aa2bcc31SzhanglyGit  val ldCancel            = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO))
545aa2bcc31SzhanglyGit  //entries status
546aa2bcc31SzhanglyGit  val valid               = Output(UInt(params.numEntries.W))
547c0beb497Sxiaofeibao  val issued              = Output(UInt(params.numEntries.W))
548aa2bcc31SzhanglyGit  val canIssue            = Output(UInt(params.numEntries.W))
549aa2bcc31SzhanglyGit  val fuType              = Vec(params.numEntries, Output(FuType()))
550aa2bcc31SzhanglyGit  val dataSources         = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource())))
551ec49b127Ssinsanction  val loadDependency      = Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(LoadDependencyWidth.W)))
552864480f4Sxiaofeibao-xjtu  val srcWakeUpL1ExuOH    = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuVec()))))
553aa2bcc31SzhanglyGit  //deq status
554aa2bcc31SzhanglyGit  val isFirstIssue        = Vec(params.numDeq, Output(Bool()))
555aa2bcc31SzhanglyGit  val deqEntry            = Vec(params.numDeq, ValidIO(new EntryBundle))
556aa2bcc31SzhanglyGit  val cancelDeqVec        = Vec(params.numDeq, Output(Bool()))
557e07131b2Ssinsanction
558e07131b2Ssinsanction  // load/hybird only
559e07131b2Ssinsanction  val fromLoad = OptionWrapper(params.isLdAddrIQ || params.isHyAddrIQ, new Bundle {
560e07131b2Ssinsanction    val finalIssueResp    = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
561e07131b2Ssinsanction    val memAddrIssueResp  = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
562e07131b2Ssinsanction  })
563aa2bcc31SzhanglyGit  // mem only
564e07131b2Ssinsanction  val fromMem = OptionWrapper(params.isMemAddrIQ, new Bundle {
565aa2bcc31SzhanglyGit    val slowResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
566d3372210SzhanglyGit    val fastResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
567e07131b2Ssinsanction  })
56899944b79Ssinsanction  // vec mem only
569aa2bcc31SzhanglyGit  val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle {
570aa2bcc31SzhanglyGit    val sqDeqPtr          = Input(new SqPtr)
571aa2bcc31SzhanglyGit    val lqDeqPtr          = Input(new LqPtr)
572aa2bcc31SzhanglyGit  })
5737e471bf8SXuan Hu  val vecLdIn = OptionWrapper(params.isVecLduIQ, new Bundle {
5747e471bf8SXuan Hu    val resp              = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
5757e471bf8SXuan Hu  })
576aa2bcc31SzhanglyGit  val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr)))
577aa2bcc31SzhanglyGit
57828607074Ssinsanction  // trans
57928607074Ssinsanction  val simpEntryDeqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Input(UInt(params.numSimp.W))))
58028607074Ssinsanction  val simpEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numSimp.W))))
58128607074Ssinsanction  val compEntryEnqSelVec = OptionWrapper(params.hasCompAndSimp, Vec(params.numEnq, Output(UInt(params.numComp.W))))
58228607074Ssinsanction  val othersEntryEnqSelVec = OptionWrapper(params.isAllComp || params.isAllSimp, Vec(params.numEnq, Output(UInt((params.numEntries - params.numEnq).W))))
583aa2bcc31SzhanglyGit
584aa2bcc31SzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
5855db4956bSzhanglyGit}
586