xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision 3d81019fd0cfe92c8131f3e2e0159ae4bb88da14)
15db4956bSzhanglyGitpackage xiangshan.backend.issue
25db4956bSzhanglyGit
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
45db4956bSzhanglyGitimport chisel3._
55db4956bSzhanglyGitimport chisel3.util._
65db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper
75db4956bSzhanglyGitimport utils.{MathUtils, OptionWrapper, XSError}
85db4956bSzhanglyGitimport xiangshan._
95db4956bSzhanglyGitimport xiangshan.backend.Bundles._
105db4956bSzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData
115db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource
125db4956bSzhanglyGitimport xiangshan.backend.fu.FuType
135db4956bSzhanglyGitimport xiangshan.backend.fu.vector.Utils.NOnes
145db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr
15aa2bcc31SzhanglyGitimport xiangshan.mem.{LqPtr, MemWaitUpdateReq, SqPtr}
16aa2bcc31SzhanglyGitimport xiangshan.backend.issue.EntryBundles._
175db4956bSzhanglyGit
185db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
190721d1aaSXuan Hu  override def desiredName: String = params.getEntryName
200721d1aaSXuan Hu
2127811ea4SXuan Hu  require(params.numEnq <= 2, "number of enq should be no more than 2")
2227811ea4SXuan Hu
235db4956bSzhanglyGit  private val EnqEntryNum         = params.numEnq
245db4956bSzhanglyGit  private val OthersEntryNum      = params.numEntries - params.numEnq
255db4956bSzhanglyGit  val io = IO(new EntriesIO)
265db4956bSzhanglyGit
27c838dea1SXuan Hu  // only memAddrIQ use it
28c838dea1SXuan Hu  val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = {
2956715025SXuan Hu    if (params.isLdAddrIQ && !params.isStAddrIQ)
30aa2bcc31SzhanglyGit      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.finalIssueResp.get)
3156715025SXuan Hu    else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ)
32aa2bcc31SzhanglyGit      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
3356715025SXuan Hu    else if (params.isMemAddrIQ)
34ea159d42Ssinsanction      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
35c838dea1SXuan Hu    else MixedVecInit(Seq())
36c838dea1SXuan Hu  }
37c838dea1SXuan Hu
38ea159d42Ssinsanction  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp))
395db4956bSzhanglyGit
405db4956bSzhanglyGit  //Module
415db4956bSzhanglyGit  val enqEntries          = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params)))
425db4956bSzhanglyGit  val othersEntries       = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params)))
435db4956bSzhanglyGit  val transPolicy         = Module(new EnqPolicy)
445db4956bSzhanglyGit
455db4956bSzhanglyGit  //Wire
46aa2bcc31SzhanglyGit  //entries status
475db4956bSzhanglyGit  val entries             = Wire(Vec(params.numEntries, ValidIO(new EntryBundle)))
48aa2bcc31SzhanglyGit  val robIdxVec           = Wire(Vec(params.numEntries, new RobPtr))
495db4956bSzhanglyGit  val validVec            = Wire(Vec(params.numEntries, Bool()))
505db4956bSzhanglyGit  val canIssueVec         = Wire(Vec(params.numEntries, Bool()))
515db4956bSzhanglyGit  val fuTypeVec           = Wire(Vec(params.numEntries, FuType()))
525db4956bSzhanglyGit  val isFirstIssueVec     = Wire(Vec(params.numEntries, Bool()))
535db4956bSzhanglyGit  val issueTimerVec       = Wire(Vec(params.numEntries, UInt(2.W)))
54aa2bcc31SzhanglyGit  //src status
55aa2bcc31SzhanglyGit  val dataSourceVec       = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
56aa2bcc31SzhanglyGit  val srcTimerVec         = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
57aa2bcc31SzhanglyGit  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec()))))
58a4d38a63SzhanglyGit  val srcLoadDependencyVec= OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))))
59*3d81019fSzhanglyGit  val loadDependencyVec   = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(3.W)))))
60aa2bcc31SzhanglyGit  //deq sel
61aa2bcc31SzhanglyGit  val deqSelVec           = Wire(Vec(params.numEntries, Bool()))
62aa2bcc31SzhanglyGit  val issueRespVec        = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
635db4956bSzhanglyGit  val deqPortIdxWriteVec  = Wire(Vec(params.numEntries, UInt(1.W)))
645db4956bSzhanglyGit  val deqPortIdxReadVec   = Wire(Vec(params.numEntries, UInt(1.W)))
65aa2bcc31SzhanglyGit  //trans sel
66aa2bcc31SzhanglyGit  val transSelVec         = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool())))
67aa2bcc31SzhanglyGit  val transEntryDeqVec    = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle)))
68aa2bcc31SzhanglyGit  val transEntryEnqVec    = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle)))
69aa2bcc31SzhanglyGit  //debug
7089740385Ssinsanction  val cancelVec           = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
71a4d38a63SzhanglyGit  //cancel bypass
72a4d38a63SzhanglyGit  val cancelBypassVec     = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
732d270511Ssinsanction  val uopIdxVec           = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx())))
745db4956bSzhanglyGit
758321ef33Ssinsanction  val canTrans            = Wire(Bool())
768321ef33Ssinsanction  val enqReadyOthersVec   = Wire(Vec(OthersEntryNum, Bool()))
778321ef33Ssinsanction  val enqTransSelVec      = Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W))))
788321ef33Ssinsanction
795db4956bSzhanglyGit  io.transEntryDeqVec := transEntryDeqVec
805db4956bSzhanglyGit
815db4956bSzhanglyGit  //enqEntries
825db4956bSzhanglyGit  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
83aa2bcc31SzhanglyGit    enqEntry.io.commonIn.enq                  := io.enq(entryIdx)
84aa2bcc31SzhanglyGit    enqEntry.io.commonIn.transSel             := canTrans && enqTransSelVec(entryIdx).valid
85aa2bcc31SzhanglyGit    EntriesConnect(enqEntry.io.commonIn, enqEntry.io.commonOut, entryIdx)
86aa2b5219Ssinsanction    enqEntry.io.enqDelayWakeUpFromWB          := RegNext(io.wakeUpFromWB)
87aa2b5219Ssinsanction    enqEntry.io.enqDelayWakeUpFromIQ          := RegNext(io.wakeUpFromIQ)
88aa2bcc31SzhanglyGit    enqEntry.io.enqDelayOg0Cancel             := RegNext(io.og0Cancel.asUInt)
89aa2b5219Ssinsanction    enqEntry.io.enqDelayLdCancel              := RegNext(io.ldCancel)
905db4956bSzhanglyGit    transEntryDeqVec(entryIdx)                := enqEntry.io.transEntry
91aa2bcc31SzhanglyGit    // TODO: move it into EntriesConnect
922d270511Ssinsanction    if (params.isVecMemIQ) {
93aa2bcc31SzhanglyGit      enqEntry.io.commonIn.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr
94aa2bcc31SzhanglyGit      enqEntry.io.commonIn.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr
952d270511Ssinsanction    }
965db4956bSzhanglyGit  }
975db4956bSzhanglyGit  //othersEntries
985db4956bSzhanglyGit  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
99aa2bcc31SzhanglyGit    othersEntry.io.commonIn.enq               := transEntryEnqVec(entryIdx)
100aa2bcc31SzhanglyGit    EntriesConnect(othersEntry.io.commonIn, othersEntry.io.commonOut, entryIdx + EnqEntryNum)
101aa2bcc31SzhanglyGit    othersEntry.io.commonIn.transSel          := transSelVec.map(x => x(entryIdx)).reduce(_ | _)
1028321ef33Ssinsanction    enqReadyOthersVec(entryIdx)               := othersEntry.io.enqReady
1032d270511Ssinsanction    if (params.isVecMemIQ) {
104aa2bcc31SzhanglyGit      othersEntry.io.commonIn.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr
105aa2bcc31SzhanglyGit      othersEntry.io.commonIn.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr
1062d270511Ssinsanction    }
1075db4956bSzhanglyGit  }
1085db4956bSzhanglyGit
1095db4956bSzhanglyGit
1105db4956bSzhanglyGit  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
111aa2bcc31SzhanglyGit    val deqVec = io.deqSelOH.zip(io.deqReady).map(x => x._1.valid && x._1.bits(i) && x._2)
1125db4956bSzhanglyGit    deqPortIdxWrite := OHToUInt(deqVec)
1135db4956bSzhanglyGit    deqSel := deqVec.reduce(_ | _)
1145db4956bSzhanglyGit  }
1155db4956bSzhanglyGit
1165db4956bSzhanglyGit
1175db4956bSzhanglyGit  //transPolicy
1188321ef33Ssinsanction  transPolicy.io.canEnq := enqReadyOthersVec.asUInt
1198321ef33Ssinsanction  canTrans := PopCount(validVec.take(EnqEntryNum)) <= PopCount(enqReadyOthersVec)
1208321ef33Ssinsanction  enqTransSelVec(0).valid := transPolicy.io.enqSelOHVec(0).valid
1218321ef33Ssinsanction  enqTransSelVec(0).bits := transPolicy.io.enqSelOHVec(0).bits
12227811ea4SXuan Hu  // Todo: comments why enqTransSelVec(1).valid relies on validVec(0)
1238321ef33Ssinsanction  if (params.numEnq == 2) {
1248321ef33Ssinsanction    enqTransSelVec(1).valid := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).valid, transPolicy.io.enqSelOHVec(1).valid)
1258321ef33Ssinsanction    enqTransSelVec(1).bits := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).bits, transPolicy.io.enqSelOHVec(1).bits)
1268321ef33Ssinsanction  }
1278321ef33Ssinsanction
1288321ef33Ssinsanction  transSelVec.zip(enqTransSelVec).zipWithIndex.foreach { case ((selBools, selOH), enqIdx) =>
1298321ef33Ssinsanction    selBools.zipWithIndex.foreach { case (selBool, othersIdx) =>
1308321ef33Ssinsanction      selBool := canTrans && validVec(enqIdx) && selOH.valid && selOH.bits(othersIdx)
1315db4956bSzhanglyGit    }
1325db4956bSzhanglyGit  }
1335db4956bSzhanglyGit
1345db4956bSzhanglyGit  //transEntryEnq
1355db4956bSzhanglyGit  transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) =>
1365db4956bSzhanglyGit    val transEnqHit = transSelVec.map(x => x(othersIdx))
1375db4956bSzhanglyGit    transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec)
1385db4956bSzhanglyGit  }
1398d081717Sszw_kaixin  if(backendParams.debugEn) {
1405db4956bSzhanglyGit    dontTouch(transEntryEnqVec)
1418d081717Sszw_kaixin  }
1425db4956bSzhanglyGit
1435db4956bSzhanglyGit  //issueRespVec
144887f9c3dSzhanglinjuan  if (params.isVecMemIQ) {
145887f9c3dSzhanglinjuan    // vector memory IQ
146887f9c3dSzhanglinjuan    issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) =>
147887f9c3dSzhanglinjuan      val hitRespsVec = VecInit(resps.flatten.map(x =>
148aa2bcc31SzhanglyGit        x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx.get === uopIdx
149887f9c3dSzhanglinjuan      ))
150887f9c3dSzhanglinjuan      issueResp.valid := hitRespsVec.reduce(_ | _)
151887f9c3dSzhanglinjuan      issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits))
152887f9c3dSzhanglinjuan    }
153887f9c3dSzhanglinjuan  } else if (params.isMemAddrIQ) {
154887f9c3dSzhanglinjuan    // scalar memory IQ
1555db4956bSzhanglyGit    issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) =>
156c838dea1SXuan Hu      val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq)
1575db4956bSzhanglyGit      issueResp.valid := hitRespsVec.reduce(_ | _)
158c838dea1SXuan Hu      issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)
1595db4956bSzhanglyGit    }
1605db4956bSzhanglyGit  }
1615db4956bSzhanglyGit  else {
1625db4956bSzhanglyGit    issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) =>
1635db4956bSzhanglyGit      val Resp = resps(issueTimer)(deqPortIdx)
1645db4956bSzhanglyGit      issueResp := Resp
1655db4956bSzhanglyGit    }
1665db4956bSzhanglyGit  }
1675db4956bSzhanglyGit
16840283787Ssinsanction  //deq
169aa2bcc31SzhanglyGit  val enqEntryOldest = io.enqEntryOldestSel.map { x =>
170aa2bcc31SzhanglyGit    Mux1H(x.bits, entries.take(EnqEntryNum))
17140283787Ssinsanction  }
172aa2bcc31SzhanglyGit  val enqEntryOldestCancel = io.enqEntryOldestSel.map { x =>
173a4d38a63SzhanglyGit    Mux1H(x.bits, cancelBypassVec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum))
174af4bd265SzhanglyGit  }
175aa2bcc31SzhanglyGit  val othersEntryOldest = io.othersEntryOldestSel.map { x =>
176aa2bcc31SzhanglyGit    Mux1H(x.bits, entries.drop(EnqEntryNum))
17740283787Ssinsanction  }
178aa2bcc31SzhanglyGit  val othersEntryOldestCancel = io.othersEntryOldestSel.map { x =>
179a4d38a63SzhanglyGit    Mux1H(x.bits, cancelBypassVec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum))
180af4bd265SzhanglyGit  }
181cf4a131aSsinsanction
182cf4a131aSsinsanction  if (params.deqFuSame) {
183cf4a131aSsinsanction    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
184cf4a131aSsinsanction    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
185a4d38a63SzhanglyGit    val subDeqPolicyCancelBypassVec = Wire(Vec(params.numDeq, Bool()))
186cf4a131aSsinsanction
187aa2bcc31SzhanglyGit    subDeqPolicyEntryVec(0) := PriorityMux(io.subDeqRequest.get(0), entries)
188aa2bcc31SzhanglyGit    subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), entries.reverse)
189aa2bcc31SzhanglyGit    subDeqPolicyValidVec(0) := PopCount(io.subDeqRequest.get(0)) >= 1.U
190aa2bcc31SzhanglyGit    subDeqPolicyValidVec(1) := PopCount(io.subDeqRequest.get(0)) >= 2.U
191a4d38a63SzhanglyGit    subDeqPolicyCancelBypassVec(0) := PriorityMux(io.subDeqRequest.get(0), cancelBypassVec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))))
192a4d38a63SzhanglyGit    subDeqPolicyCancelBypassVec(1) := PriorityMux(Reverse(io.subDeqRequest.get(0)), cancelBypassVec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse)
193cf4a131aSsinsanction
194aa2bcc31SzhanglyGit    io.deqEntry(0) := Mux(io.othersEntryOldestSel(0).valid, othersEntryOldest(0), subDeqPolicyEntryVec(1))
195aa2bcc31SzhanglyGit    io.deqEntry(1) := subDeqPolicyEntryVec(0)
196a4d38a63SzhanglyGit    io.cancelDeqVec(0) := Mux(io.othersEntryOldestSel(0).valid, othersEntryOldestCancel(0), subDeqPolicyCancelBypassVec(1))
197a4d38a63SzhanglyGit    io.cancelDeqVec(1) := subDeqPolicyCancelBypassVec(0)
198cf4a131aSsinsanction
199cf4a131aSsinsanction    when (subDeqPolicyValidVec(0)) {
200aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
20140283787Ssinsanction    }
202cf4a131aSsinsanction    when (subDeqPolicyValidVec(1)) {
203aa2bcc31SzhanglyGit      assert(Mux1H(io.subDeqSelOH.get(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
204f7f73727Ssinsanction    }
205f7f73727Ssinsanction  }
206f7f73727Ssinsanction  else {
207aa2bcc31SzhanglyGit    io.othersEntryOldestSel.zipWithIndex.foreach { case (x, i) =>
208aa2bcc31SzhanglyGit      io.deqEntry(i) := Mux(x.valid, othersEntryOldest(i), enqEntryOldest(i))
209aa2bcc31SzhanglyGit      io.cancelDeqVec(i) := Mux(x.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i))
210af4bd265SzhanglyGit    }
211af4bd265SzhanglyGit  }
212af4bd265SzhanglyGit
213af4bd265SzhanglyGit  if (params.hasIQWakeUp) {
214a4d38a63SzhanglyGit    cancelBypassVec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).zip(srcLoadDependencyVec.get).foreach{ case (((cancelBypass: Bool, l1ExuOH: Vec[Vec[Bool]]), srcTimer: Vec[UInt]), srcLoadDependency: Vec[Vec[UInt]]) =>
215a4d38a63SzhanglyGit      val cancelByOg0 = l1ExuOH.zip(srcTimer).map {
216af4bd265SzhanglyGit        case(exuOH, srcTimer) =>
217af4bd265SzhanglyGit          (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U
218af4bd265SzhanglyGit      }.reduce(_ | _)
219a4d38a63SzhanglyGit      val cancelByLd = srcLoadDependency.map(x => LoadShouldCancel(Some(x), io.ldCancel)).reduce(_ | _)
220a4d38a63SzhanglyGit      cancelBypass := cancelByOg0 || cancelByLd
22140283787Ssinsanction    }
22240283787Ssinsanction  }
22340283787Ssinsanction
2245db4956bSzhanglyGit  io.valid                      := validVec.asUInt
2255db4956bSzhanglyGit  io.canIssue                   := canIssueVec.asUInt
2265db4956bSzhanglyGit  io.fuType                     := fuTypeVec
2275db4956bSzhanglyGit  io.dataSources                := dataSourceVec
228aa2bcc31SzhanglyGit  io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get.map(x => VecInit(x.map(_.asUInt))))
2295db4956bSzhanglyGit  io.srcTimer.foreach(_         := srcTimerVec.get)
230*3d81019fSzhanglyGit  io.loadDependency.foreach(_   := loadDependencyVec.get)
231aa2bcc31SzhanglyGit  io.isFirstIssue.zipWithIndex.foreach{ case (isFirstIssue, deqIdx) =>
232aa2bcc31SzhanglyGit    isFirstIssue                := io.deqSelOH(deqIdx).valid && Mux1H(io.deqSelOH(deqIdx).bits, isFirstIssueVec)
2338d081717Sszw_kaixin  }
2345db4956bSzhanglyGit  io.transSelVec.zip(transSelVec).foreach { case (sink, source) =>
2355db4956bSzhanglyGit    sink                        := source.asUInt
2365db4956bSzhanglyGit  }
237aa2bcc31SzhanglyGit  io.robIdx.foreach(_           := robIdxVec)
238aa2bcc31SzhanglyGit  io.uopIdx.foreach(_           := uopIdxVec.get)
239aa2bcc31SzhanglyGit  io.rsFeedback                 := 0.U.asTypeOf(io.rsFeedback)  //should be removed
240aa2bcc31SzhanglyGit  io.cancel.foreach(_           := cancelVec.get)               //for debug
241aa2bcc31SzhanglyGit
242aa2bcc31SzhanglyGit  def EntriesConnect(in: CommonInBundle, out: CommonOutBundle, entryIdx: Int) = {
243aa2bcc31SzhanglyGit    in.flush                    := io.flush
244aa2bcc31SzhanglyGit    in.wakeUpFromWB             := io.wakeUpFromWB
245aa2bcc31SzhanglyGit    in.wakeUpFromIQ             := io.wakeUpFromIQ
246aa2bcc31SzhanglyGit    in.og0Cancel                := io.og0Cancel
247aa2bcc31SzhanglyGit    in.og1Cancel                := io.og1Cancel
248aa2bcc31SzhanglyGit    in.ldCancel                 := io.ldCancel
249aa2bcc31SzhanglyGit    in.deqSel                   := deqSelVec(entryIdx)
250aa2bcc31SzhanglyGit    in.deqPortIdxWrite          := deqPortIdxWriteVec(entryIdx)
251aa2bcc31SzhanglyGit    in.issueResp                := issueRespVec(entryIdx)
252aa2bcc31SzhanglyGit    if (params.isMemAddrIQ) {
253aa2bcc31SzhanglyGit      in.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
254aa2bcc31SzhanglyGit      in.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
255aa2bcc31SzhanglyGit    }
256aa2bcc31SzhanglyGit    if (params.isVecMemIQ) {
257aa2bcc31SzhanglyGit      in.fromLsq.get.sqDeqPtr := io.vecMemIn.get.sqDeqPtr
258aa2bcc31SzhanglyGit      in.fromLsq.get.lqDeqPtr := io.vecMemIn.get.lqDeqPtr
259aa2bcc31SzhanglyGit    }
260aa2bcc31SzhanglyGit    validVec(entryIdx)          := out.valid
261aa2bcc31SzhanglyGit    canIssueVec(entryIdx)       := out.canIssue
262aa2bcc31SzhanglyGit    fuTypeVec(entryIdx)         := out.fuType
263aa2bcc31SzhanglyGit    robIdxVec(entryIdx)         := out.robIdx
264aa2bcc31SzhanglyGit    dataSourceVec(entryIdx)     := out.dataSource
265aa2bcc31SzhanglyGit    isFirstIssueVec(entryIdx)   := out.isFirstIssue
266aa2bcc31SzhanglyGit    entries(entryIdx)           := out.entry
267aa2bcc31SzhanglyGit    deqPortIdxReadVec(entryIdx) := out.deqPortIdxRead
268aa2bcc31SzhanglyGit    issueTimerVec(entryIdx)     := out.issueTimerRead
269aa2bcc31SzhanglyGit    if (params.hasIQWakeUp) {
270aa2bcc31SzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx)       := out.srcWakeUpL1ExuOH.get
271aa2bcc31SzhanglyGit      srcTimerVec.get(entryIdx)               := out.srcTimer.get
272a4d38a63SzhanglyGit      srcLoadDependencyVec.get(entryIdx)      := out.srcLoadDependency.get
273*3d81019fSzhanglyGit      loadDependencyVec.get(entryIdx)         := out.entry.bits.status.mergedLoadDependency.get
274aa2bcc31SzhanglyGit      cancelVec.get(entryIdx)                 := out.cancel.get
275aa2bcc31SzhanglyGit    }
276aa2bcc31SzhanglyGit    if (params.isVecMemIQ) {
277aa2bcc31SzhanglyGit      uopIdxVec.get(entryIdx)   := out.uopIdx.get
278aa2bcc31SzhanglyGit    }
279aa2bcc31SzhanglyGit  }
280aa2bcc31SzhanglyGit}
281aa2bcc31SzhanglyGit
282aa2bcc31SzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
283aa2bcc31SzhanglyGit  val flush               = Flipped(ValidIO(new Redirect))
284aa2bcc31SzhanglyGit  //enq
285aa2bcc31SzhanglyGit  val enq                 = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
286aa2bcc31SzhanglyGit  val og0Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
287aa2bcc31SzhanglyGit  val og1Resp             = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
288aa2bcc31SzhanglyGit  val finalIssueResp      = OptionWrapper(params.LdExuCnt > 0, Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle))))
289aa2bcc31SzhanglyGit  //deq sel
290aa2bcc31SzhanglyGit  val deqReady            = Vec(params.numDeq, Input(Bool()))
291aa2bcc31SzhanglyGit  val deqSelOH            = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEntries.W))))
292aa2bcc31SzhanglyGit  val enqEntryOldestSel   = Vec(params.numDeq, Flipped(ValidIO(UInt(params.numEnq.W))))
293aa2bcc31SzhanglyGit  val othersEntryOldestSel= Vec(params.numDeq, Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W))))
294aa2bcc31SzhanglyGit  val subDeqRequest       = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
295aa2bcc31SzhanglyGit  val subDeqSelOH         = OptionWrapper(params.deqFuSame, Vec(params.numDeq, Input(UInt(params.numEntries.W))))
296aa2bcc31SzhanglyGit  // wakeup
297aa2bcc31SzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
298aa2bcc31SzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
299aa2bcc31SzhanglyGit  val og0Cancel           = Input(ExuOH(backendParams.numExu))
300aa2bcc31SzhanglyGit  val og1Cancel           = Input(ExuOH(backendParams.numExu))
301aa2bcc31SzhanglyGit  val ldCancel            = Vec(backendParams.LdExuCnt, Flipped(new LoadCancelIO))
302aa2bcc31SzhanglyGit  //trans output
303aa2bcc31SzhanglyGit  val transEntryDeqVec    = Vec(params.numEnq, ValidIO(new EntryBundle))
304aa2bcc31SzhanglyGit  val transSelVec         = Output(Vec(params.numEnq, UInt((params.numEntries - params.numEnq).W)))
305aa2bcc31SzhanglyGit  //entries status
306aa2bcc31SzhanglyGit  val valid               = Output(UInt(params.numEntries.W))
307aa2bcc31SzhanglyGit  val canIssue            = Output(UInt(params.numEntries.W))
308aa2bcc31SzhanglyGit  val fuType              = Vec(params.numEntries, Output(FuType()))
309aa2bcc31SzhanglyGit  val dataSources         = Vec(params.numEntries, Vec(params.numRegSrc, Output(DataSource())))
310aa2bcc31SzhanglyGit  val srcWakeUpL1ExuOH    = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(ExuOH()))))
311aa2bcc31SzhanglyGit  val srcTimer            = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(params.numRegSrc, Output(UInt(3.W)))))
312*3d81019fSzhanglyGit  val loadDependency      = OptionWrapper(params.hasIQWakeUp, Vec(params.numEntries, Vec(LoadPipelineWidth, UInt(3.W))))
313aa2bcc31SzhanglyGit  //deq status
314aa2bcc31SzhanglyGit  val isFirstIssue        = Vec(params.numDeq, Output(Bool()))
315aa2bcc31SzhanglyGit  val deqEntry            = Vec(params.numDeq, ValidIO(new EntryBundle))
316aa2bcc31SzhanglyGit  val cancelDeqVec        = Vec(params.numDeq, Output(Bool()))
317aa2bcc31SzhanglyGit  // mem only
318aa2bcc31SzhanglyGit  val fromMem = if (params.isMemAddrIQ) Some(new Bundle {
319aa2bcc31SzhanglyGit    val stIssuePtr        = Input(new SqPtr)
320aa2bcc31SzhanglyGit    val memWaitUpdateReq  = Flipped(new MemWaitUpdateReq)
321aa2bcc31SzhanglyGit    val slowResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
322aa2bcc31SzhanglyGit    val fastResp          = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
323aa2bcc31SzhanglyGit  }) else None
324aa2bcc31SzhanglyGit  val vecMemIn = OptionWrapper(params.isVecMemIQ, new Bundle {
325aa2bcc31SzhanglyGit    val sqDeqPtr = Input(new SqPtr)
326aa2bcc31SzhanglyGit    val lqDeqPtr = Input(new LqPtr)
327aa2bcc31SzhanglyGit  })
328aa2bcc31SzhanglyGit
329aa2bcc31SzhanglyGit  val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr)))
330aa2bcc31SzhanglyGit  val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx())))
331aa2bcc31SzhanglyGit
332aa2bcc31SzhanglyGit  val rsFeedback          = Output(Vec(5, Bool()))
333aa2bcc31SzhanglyGit
334aa2bcc31SzhanglyGit  // debug
335aa2bcc31SzhanglyGit  val cancel              = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool())))
336aa2bcc31SzhanglyGit
337aa2bcc31SzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
3385db4956bSzhanglyGit}
339