xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision 402837879bf6bd3f78695deeea5e29429b72c1d0)
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
152d270511Ssinsanctionimport xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr}
165db4956bSzhanglyGit
175db4956bSzhanglyGitclass StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
185db4956bSzhanglyGit  val waitForSqIdx = new SqPtr   // generated by store data valid check
195db4956bSzhanglyGit  val waitForRobIdx = new RobPtr // generated by store set
205db4956bSzhanglyGit  val waitForStd = Bool()
215db4956bSzhanglyGit  val strictWait = Bool()
225db4956bSzhanglyGit  val sqIdx = new SqPtr
235db4956bSzhanglyGit}
245db4956bSzhanglyGit
252d270511Ssinsanctionclass StatusVecMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
262d270511Ssinsanction  val sqIdx = new SqPtr
272d270511Ssinsanction  val lqIdx = new LqPtr
282d270511Ssinsanction}
292d270511Ssinsanction
300f55a0d3SHaojin Tangclass Status(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
315db4956bSzhanglyGit  val srcState = Vec(params.numRegSrc, SrcState())
325db4956bSzhanglyGit
335db4956bSzhanglyGit  val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W))
345db4956bSzhanglyGit  val srcType = Vec(params.numRegSrc, SrcType())
355db4956bSzhanglyGit  val fuType = FuType()
365db4956bSzhanglyGit  val robIdx = new RobPtr
372d270511Ssinsanction  val uopIdx = OptionWrapper(params.isVecMemIQ, UopIdx())
385db4956bSzhanglyGit  val issued = Bool()           // for predict issue
395db4956bSzhanglyGit  val firstIssue = Bool()
405db4956bSzhanglyGit  val blocked = Bool()          // for some block reason
415db4956bSzhanglyGit  // read reg or get data from bypass network
425db4956bSzhanglyGit  val dataSources = Vec(params.numRegSrc, DataSource())
435db4956bSzhanglyGit  // if waked up by iq, set when waked up by iq
447a96cc7fSHaojin Tang  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuOH()))
455db4956bSzhanglyGit  // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued.
465db4956bSzhanglyGit  val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W)))
475db4956bSzhanglyGit  val issueTimer = UInt(2.W)
485db4956bSzhanglyGit  val deqPortIdx = UInt(1.W)
490f55a0d3SHaojin Tang  val srcLoadDependency = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))
505db4956bSzhanglyGit
515db4956bSzhanglyGit
525db4956bSzhanglyGit  // mem only
535db4956bSzhanglyGit  val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None
545db4956bSzhanglyGit
552d270511Ssinsanction  // vector mem only
562d270511Ssinsanction  val vecMem = if (params.isVecMemIQ) Some(new StatusVecMemPart) else None
572d270511Ssinsanction
585db4956bSzhanglyGit  // need pc
595db4956bSzhanglyGit  val pc = if (params.needPc) Some(UInt(VAddrData().dataWidth.W)) else None
605db4956bSzhanglyGit
615db4956bSzhanglyGit  def srcReady: Bool = {
625db4956bSzhanglyGit    VecInit(srcState.map(SrcState.isReady)).asUInt.andR
635db4956bSzhanglyGit  }
645db4956bSzhanglyGit
655db4956bSzhanglyGit  def canIssue: Bool = {
665db4956bSzhanglyGit    srcReady && !issued && !blocked
675db4956bSzhanglyGit  }
680f55a0d3SHaojin Tang
6983ba63b3SXuan Hu  def mergedLoadDependency = {
7083ba63b3SXuan Hu    srcLoadDependency.map(_.map(_.toSeq).reduce({
7183ba63b3SXuan Hu      case (l: Vec[UInt], r: Vec[UInt]) => VecInit(l.zip(r).map(x => x._1 | x._2))
7283ba63b3SXuan Hu    }: (Vec[UInt], Vec[UInt]) => Vec[UInt]))
7383ba63b3SXuan Hu  }
745db4956bSzhanglyGit}
755db4956bSzhanglyGit
765db4956bSzhanglyGitclass EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
775db4956bSzhanglyGit  val robIdx = new RobPtr
78887f9c3dSzhanglinjuan  val uopIdx = UopIdx()
795db4956bSzhanglyGit  val respType = RSFeedbackType()   // update credit if needs replay
805db4956bSzhanglyGit  val dataInvalidSqIdx = new SqPtr
815db4956bSzhanglyGit  val rfWen = Bool()
825db4956bSzhanglyGit  val fuType = FuType()
835db4956bSzhanglyGit}
845db4956bSzhanglyGit
855db4956bSzhanglyGitclass EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
865db4956bSzhanglyGit  val status = new Status()
875db4956bSzhanglyGit  val imm = UInt(XLEN.W)
885db4956bSzhanglyGit  val payload = new DynInst()
895db4956bSzhanglyGit}
905db4956bSzhanglyGit
915db4956bSzhanglyGitclass DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
92*40283787Ssinsanction  //input
93*40283787Ssinsanction  val enqEntryOldestSel = Flipped(ValidIO(UInt(params.numEnq.W)))
94*40283787Ssinsanction  val othersEntryOldestSel = Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))
95*40283787Ssinsanction  val subDeqPolicyRequest = Input(UInt(params.numEntries.W))
96*40283787Ssinsanction  val subDeqSelOH = Vec(params.numDeq, Input(UInt(params.numEntries.W)))
97*40283787Ssinsanction  val finalDeqSelOH = Flipped(ValidIO(UInt(params.numEntries.W)))
98*40283787Ssinsanction  //output
995db4956bSzhanglyGit  val isFirstIssue = Output(Bool())
100*40283787Ssinsanction  val deqEntry = ValidIO(new EntryBundle)
1015db4956bSzhanglyGit}
1025db4956bSzhanglyGit
1035db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
1045db4956bSzhanglyGit  val flush = Flipped(ValidIO(new Redirect))
1055db4956bSzhanglyGit  // status
1065db4956bSzhanglyGit  val valid = Output(UInt(params.numEntries.W))
1075db4956bSzhanglyGit  val canIssue = Output(UInt(params.numEntries.W))
1085db4956bSzhanglyGit  val clear = Output(UInt(params.numEntries.W))
1095db4956bSzhanglyGit  val fuType = Output(Vec(params.numEntries, FuType()))
1105db4956bSzhanglyGit  val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
1117a96cc7fSHaojin Tang  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH()))))
1125db4956bSzhanglyGit  val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
1132d270511Ssinsanction  val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr)))
1142d270511Ssinsanction  val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx())))
1155db4956bSzhanglyGit  //enq
1165db4956bSzhanglyGit  val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
1175db4956bSzhanglyGit  // wakeup
1185db4956bSzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
1195db4956bSzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
1207a96cc7fSHaojin Tang  val og0Cancel = Input(ExuOH(backendParams.numExu))
1217a96cc7fSHaojin Tang  val og1Cancel = Input(ExuOH(backendParams.numExu))
1226810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
1235db4956bSzhanglyGit  //deq
1245db4956bSzhanglyGit  val deq = Vec(params.numDeq, new DeqBundle)
1255db4956bSzhanglyGit  val deqResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1265db4956bSzhanglyGit  val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1275db4956bSzhanglyGit  val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1288a66c02cSXuan Hu  val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle))))
1298a66c02cSXuan Hu  val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle))))
1305db4956bSzhanglyGit  val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle))
1315db4956bSzhanglyGit  val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W)))
1325db4956bSzhanglyGit
1335db4956bSzhanglyGit
1345db4956bSzhanglyGit  val rsFeedback = Output(Vec(5, Bool()))
1355db4956bSzhanglyGit  // mem only
1365db4956bSzhanglyGit  val fromMem = if (params.isMemAddrIQ) Some(new Bundle {
1375db4956bSzhanglyGit    val stIssuePtr = Input(new SqPtr)
1385db4956bSzhanglyGit    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
1395db4956bSzhanglyGit    val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1405db4956bSzhanglyGit    val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1415db4956bSzhanglyGit  }) else None
1425db4956bSzhanglyGit
1432d270511Ssinsanction  // vector mem only
1442d270511Ssinsanction  val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle {
1452d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
1462d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1472d270511Ssinsanction  })
1482d270511Ssinsanction
14989740385Ssinsanction  // debug
15089740385Ssinsanction  val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool())))
15189740385Ssinsanction
1525db4956bSzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
1535db4956bSzhanglyGit}
1545db4956bSzhanglyGit
1555db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
1565db4956bSzhanglyGit  private val EnqEntryNum = params.numEnq
1575db4956bSzhanglyGit  private val OthersEntryNum = params.numEntries - params.numEnq
1585db4956bSzhanglyGit  val io = IO(new EntriesIO)
1595db4956bSzhanglyGit
160c838dea1SXuan Hu  // only memAddrIQ use it
161c838dea1SXuan Hu  val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = {
16256715025SXuan Hu    if (params.isLdAddrIQ && !params.isStAddrIQ)
16356715025SXuan Hu      MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get)
16456715025SXuan Hu    else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ)
16556715025SXuan Hu      MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
16656715025SXuan Hu    else if (params.isMemAddrIQ)
16756715025SXuan Hu      MixedVecInit(io.deqResp ++ io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
168c838dea1SXuan Hu    else MixedVecInit(Seq())
169c838dea1SXuan Hu  }
170c838dea1SXuan Hu
171c838dea1SXuan Hu  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.deqResp, io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.deqResp))
1725db4956bSzhanglyGit
1735db4956bSzhanglyGit  //Module
1745db4956bSzhanglyGit  val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params)))
1755db4956bSzhanglyGit  val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params)))
1765db4956bSzhanglyGit  val transPolicy = Module(new EnqPolicy)
1775db4956bSzhanglyGit
1785db4956bSzhanglyGit  //Wire
1795db4956bSzhanglyGit  val deqSelVec = Wire(Vec(params.numEntries, Bool()))
1805db4956bSzhanglyGit  val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool())))
1815db4956bSzhanglyGit  val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
1825db4956bSzhanglyGit  val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle)))
1835db4956bSzhanglyGit  val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle)))
1845db4956bSzhanglyGit  val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle)))
1855db4956bSzhanglyGit
1865db4956bSzhanglyGit  val validVec = Wire(Vec(params.numEntries, Bool()))
1875db4956bSzhanglyGit  val canIssueVec = Wire(Vec(params.numEntries, Bool()))
1885db4956bSzhanglyGit  val clearVec = Wire(Vec(params.numEntries, Bool()))
1895db4956bSzhanglyGit  val fuTypeVec = Wire(Vec(params.numEntries, FuType()))
1905db4956bSzhanglyGit  val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
1917a96cc7fSHaojin Tang  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH()))))
1925db4956bSzhanglyGit  val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
1935db4956bSzhanglyGit  val isFirstIssueVec = Wire(Vec(params.numEntries, Bool()))
1945db4956bSzhanglyGit  val robIdxVec = Wire(Vec(params.numEntries, new RobPtr))
1955db4956bSzhanglyGit  val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W)))
1965db4956bSzhanglyGit  val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W)))
1975db4956bSzhanglyGit  val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W)))
19889740385Ssinsanction  val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
1992d270511Ssinsanction  val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx())))
2005db4956bSzhanglyGit
2015db4956bSzhanglyGit  io.transEntryDeqVec := transEntryDeqVec
2025db4956bSzhanglyGit
2035db4956bSzhanglyGit  //enqEntries
2045db4956bSzhanglyGit  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
2055db4956bSzhanglyGit    enqEntry.io.enq := io.enq(entryIdx)
2065db4956bSzhanglyGit    enqEntry.io.flush := io.flush
2075db4956bSzhanglyGit    enqEntry.io.wakeUpFromWB := io.wakeUpFromWB
2085db4956bSzhanglyGit    enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
2095db4956bSzhanglyGit    enqEntry.io.og0Cancel := io.og0Cancel
2105db4956bSzhanglyGit    enqEntry.io.og1Cancel := io.og1Cancel
2110f55a0d3SHaojin Tang    enqEntry.io.ldCancel := io.ldCancel
2125db4956bSzhanglyGit    enqEntry.io.deqSel := deqSelVec(entryIdx)
2135db4956bSzhanglyGit    enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx)
2145db4956bSzhanglyGit    enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR
2155db4956bSzhanglyGit    enqEntry.io.issueResp := issueRespVec(entryIdx)
2165db4956bSzhanglyGit    validVec(entryIdx) := enqEntry.io.valid
2175db4956bSzhanglyGit    canIssueVec(entryIdx) := enqEntry.io.canIssue
2185db4956bSzhanglyGit    clearVec(entryIdx) := enqEntry.io.clear
2195db4956bSzhanglyGit    fuTypeVec(entryIdx) := enqEntry.io.fuType
2205db4956bSzhanglyGit    dataSourceVec(entryIdx) := enqEntry.io.dataSource
2215db4956bSzhanglyGit    robIdxVec(entryIdx) := enqEntry.io.robIdx
2225db4956bSzhanglyGit    issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead
2235db4956bSzhanglyGit    deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead
2245db4956bSzhanglyGit    if (params.hasIQWakeUp) {
2255db4956bSzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get
2265db4956bSzhanglyGit      srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get
22789740385Ssinsanction      cancelVec.get(entryIdx) := enqEntry.io.cancel.get
2285db4956bSzhanglyGit    }
2295db4956bSzhanglyGit    transEntryDeqVec(entryIdx) := enqEntry.io.transEntry
2305db4956bSzhanglyGit    isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue
2315db4956bSzhanglyGit    entries(entryIdx) := enqEntry.io.entry
2325db4956bSzhanglyGit    //for mem
2335db4956bSzhanglyGit    if (params.isMemAddrIQ) {
2345db4956bSzhanglyGit      enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
2355db4956bSzhanglyGit      enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
2365db4956bSzhanglyGit    }
2372d270511Ssinsanction    if (params.isVecMemIQ) {
2382d270511Ssinsanction      uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get
2392d270511Ssinsanction      enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
2402d270511Ssinsanction      enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
2412d270511Ssinsanction    }
2425db4956bSzhanglyGit  }
2435db4956bSzhanglyGit  //othersEntries
2445db4956bSzhanglyGit  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
2455db4956bSzhanglyGit    othersEntry.io.enq := transEntryEnqVec(entryIdx)
2465db4956bSzhanglyGit    othersEntry.io.flush := io.flush
2475db4956bSzhanglyGit    othersEntry.io.wakeUpFromWB := io.wakeUpFromWB
2485db4956bSzhanglyGit    othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
2495db4956bSzhanglyGit    othersEntry.io.og0Cancel := io.og0Cancel
2505db4956bSzhanglyGit    othersEntry.io.og1Cancel := io.og1Cancel
2510f55a0d3SHaojin Tang    othersEntry.io.ldCancel := io.ldCancel
2525db4956bSzhanglyGit    othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum)
2535db4956bSzhanglyGit    othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum)
2545db4956bSzhanglyGit    othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _)
2555db4956bSzhanglyGit    othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum)
2565db4956bSzhanglyGit    validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid
2575db4956bSzhanglyGit    canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue
2585db4956bSzhanglyGit    clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear
2595db4956bSzhanglyGit    fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType
2605db4956bSzhanglyGit    dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource
2615db4956bSzhanglyGit    robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx
2625db4956bSzhanglyGit    issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead
2635db4956bSzhanglyGit    deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead
2645db4956bSzhanglyGit    if (params.hasIQWakeUp) {
2655db4956bSzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get
2665db4956bSzhanglyGit      srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get
26789740385Ssinsanction      cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get
2685db4956bSzhanglyGit    }
2695db4956bSzhanglyGit    isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue
2705db4956bSzhanglyGit    entries(entryIdx + EnqEntryNum) := othersEntry.io.entry
2715db4956bSzhanglyGit    //for mem
2725db4956bSzhanglyGit    if (params.isMemAddrIQ) {
2735db4956bSzhanglyGit      othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
2745db4956bSzhanglyGit      othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
2755db4956bSzhanglyGit    }
2762d270511Ssinsanction    if (params.isVecMemIQ) {
2772d270511Ssinsanction      uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get
2782d270511Ssinsanction      othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
2792d270511Ssinsanction      othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
2802d270511Ssinsanction    }
2815db4956bSzhanglyGit  }
2825db4956bSzhanglyGit
2835db4956bSzhanglyGit
2845db4956bSzhanglyGit  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
285*40283787Ssinsanction    val deqVec = io.deq.map(x => x.finalDeqSelOH.valid && x.finalDeqSelOH.bits(i))
2865db4956bSzhanglyGit    deqPortIdxWrite := OHToUInt(deqVec)
2875db4956bSzhanglyGit    deqSel := deqVec.reduce(_ | _)
2885db4956bSzhanglyGit  }
2895db4956bSzhanglyGit
2905db4956bSzhanglyGit
2915db4956bSzhanglyGit  //transPolicy
2925db4956bSzhanglyGit  transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt
2935db4956bSzhanglyGit  transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) =>
2945db4956bSzhanglyGit    selBools.zipWithIndex.foreach { case (selBool, i) =>
2955db4956bSzhanglyGit      selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i)
2965db4956bSzhanglyGit    }
2975db4956bSzhanglyGit  }
2985db4956bSzhanglyGit
2995db4956bSzhanglyGit  //transEntryEnq
3005db4956bSzhanglyGit  transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) =>
3015db4956bSzhanglyGit    val transEnqHit = transSelVec.map(x => x(othersIdx))
3025db4956bSzhanglyGit    transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec)
3035db4956bSzhanglyGit  }
3045db4956bSzhanglyGit  dontTouch(transEntryEnqVec)
3055db4956bSzhanglyGit
3065db4956bSzhanglyGit  //issueRespVec
307887f9c3dSzhanglinjuan  if (params.isVecMemIQ) {
308887f9c3dSzhanglinjuan    // vector memory IQ
309887f9c3dSzhanglinjuan    issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) =>
310887f9c3dSzhanglinjuan      val hitRespsVec = VecInit(resps.flatten.map(x =>
311887f9c3dSzhanglinjuan        x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx
312887f9c3dSzhanglinjuan      ))
313887f9c3dSzhanglinjuan      issueResp.valid := hitRespsVec.reduce(_ | _)
314887f9c3dSzhanglinjuan      issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits))
315887f9c3dSzhanglinjuan    }
316887f9c3dSzhanglinjuan  } else if (params.isMemAddrIQ) {
317887f9c3dSzhanglinjuan    // scalar memory IQ
3185db4956bSzhanglyGit    issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) =>
319c838dea1SXuan Hu      val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq)
3205db4956bSzhanglyGit      issueResp.valid := hitRespsVec.reduce(_ | _)
321c838dea1SXuan Hu      issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)
3225db4956bSzhanglyGit    }
3235db4956bSzhanglyGit  }
3245db4956bSzhanglyGit  else {
3255db4956bSzhanglyGit    issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) =>
3265db4956bSzhanglyGit      val Resp = resps(issueTimer)(deqPortIdx)
3275db4956bSzhanglyGit      issueResp := Resp
3285db4956bSzhanglyGit    }
3295db4956bSzhanglyGit  }
3305db4956bSzhanglyGit
331*40283787Ssinsanction  //deq
332*40283787Ssinsanction  val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, Vec(params.numDeq, ValidIO(new EntryBundle))))
333*40283787Ssinsanction  val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Vec(params.numDeq, Bool())))
334*40283787Ssinsanction  val deqSelEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
335*40283787Ssinsanction
336*40283787Ssinsanction  val enqEntryOldest = io.deq.map { deq =>
337*40283787Ssinsanction    Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum))
338*40283787Ssinsanction  }
339*40283787Ssinsanction  val othersEntryOldest = io.deq.map { deq =>
340*40283787Ssinsanction    Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum))
341*40283787Ssinsanction  }
342*40283787Ssinsanction  subDeqPolicyEntryVec.zip(subDeqPolicyValidVec).zipWithIndex.foreach { case ((entry, valid), i) =>
343*40283787Ssinsanction    entry(0) := PriorityMux(io.deq(i).subDeqPolicyRequest, entries)
344*40283787Ssinsanction    valid(0) := PopCount(io.deq(i).subDeqPolicyRequest) >= 1.U
345*40283787Ssinsanction    if (params.numDeq == 2) {
346*40283787Ssinsanction      entry(1) := PriorityMux(Reverse(io.deq(i).subDeqPolicyRequest), entries.reverse)
347*40283787Ssinsanction      valid(1) := PopCount(io.deq(i).subDeqPolicyRequest) >= 2.U
348*40283787Ssinsanction    }
349*40283787Ssinsanction  }
350*40283787Ssinsanction
351*40283787Ssinsanction  deqSelEntryVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0),
352*40283787Ssinsanction                       Mux(io.deq(0).enqEntryOldestSel.valid, enqEntryOldest(0), subDeqPolicyEntryVec(0)(0)))
353*40283787Ssinsanction  io.deq(0).deqEntry.valid := (io.deq(0).othersEntryOldestSel.valid || io.deq(0).enqEntryOldestSel.valid || subDeqPolicyValidVec(0)(0)) && deqSelEntryVec(0).valid
354*40283787Ssinsanction  io.deq(0).deqEntry.bits := deqSelEntryVec(0).bits
355*40283787Ssinsanction
356*40283787Ssinsanction  if (params.numDeq == 2) {
357*40283787Ssinsanction    val chooseOthersOldest = io.deq(1).othersEntryOldestSel.valid && Cat(io.deq(1).othersEntryOldestSel.bits, 0.U((params.numEnq).W)) =/= io.deq(0).finalDeqSelOH.bits
358*40283787Ssinsanction    val chooseEnqOldest = io.deq(1).enqEntryOldestSel.valid && Cat(0.U((params.numEntries-params.numEnq).W), io.deq(1).enqEntryOldestSel.bits) =/= io.deq(0).finalDeqSelOH.bits
359*40283787Ssinsanction    val choose1stSub = io.deq(1).subDeqSelOH(0) =/= io.deq(0).finalDeqSelOH.bits
360*40283787Ssinsanction
361*40283787Ssinsanction    when (subDeqPolicyValidVec(0)(0)) {
362*40283787Ssinsanction      assert(Mux1H(io.deq(0).subDeqSelOH(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(0)(0).bits.status.robIdx, "subDeqSelOH isnot the same 0 0\n")
363*40283787Ssinsanction    }
364*40283787Ssinsanction    when (subDeqPolicyValidVec(1)(0)) {
365*40283787Ssinsanction      assert(Mux1H(io.deq(1).subDeqSelOH(0), entries).bits.status.robIdx === subDeqPolicyEntryVec(1)(0).bits.status.robIdx, "subDeqSelOH isnot the same 1 0\n")
366*40283787Ssinsanction    }
367*40283787Ssinsanction    when (subDeqPolicyValidVec(1)(1)) {
368*40283787Ssinsanction      assert(Mux1H(io.deq(1).subDeqSelOH(1), entries).bits.status.robIdx === subDeqPolicyEntryVec(1)(1).bits.status.robIdx, "subDeqSelOH isnot the same 1 1\n")
369*40283787Ssinsanction    }
370*40283787Ssinsanction
371*40283787Ssinsanction    deqSelEntryVec(1) := Mux(chooseOthersOldest, othersEntryOldest(1),
372*40283787Ssinsanction                         Mux(chooseEnqOldest, enqEntryOldest(1),
373*40283787Ssinsanction                         Mux(choose1stSub, subDeqPolicyEntryVec(1)(0), subDeqPolicyEntryVec(1)(1))))
374*40283787Ssinsanction    io.deq(1).deqEntry.valid := io.deq(1).finalDeqSelOH.valid && deqSelEntryVec(1).valid
375*40283787Ssinsanction    io.deq(1).deqEntry.bits := deqSelEntryVec(1).bits
376*40283787Ssinsanction  }
377*40283787Ssinsanction
3785db4956bSzhanglyGit  io.valid := validVec.asUInt
3795db4956bSzhanglyGit  io.canIssue := canIssueVec.asUInt
3805db4956bSzhanglyGit  io.clear := clearVec.asUInt
3815db4956bSzhanglyGit  io.fuType := fuTypeVec
3825db4956bSzhanglyGit  io.dataSources := dataSourceVec
3835db4956bSzhanglyGit  io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get)
3845db4956bSzhanglyGit  io.srcTimer.foreach(_ := srcTimerVec.get)
38589740385Ssinsanction  io.cancel.foreach(_ := cancelVec.get)
3862d270511Ssinsanction  io.robIdx.foreach(_ := robIdxVec)
3872d270511Ssinsanction  io.uopIdx.foreach(_ := uopIdxVec.get)
3885db4956bSzhanglyGit  io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo
3895db4956bSzhanglyGit  io.deq.foreach{ x =>
390*40283787Ssinsanction    x.isFirstIssue := x.finalDeqSelOH.valid && Mux1H(x.finalDeqSelOH.bits, isFirstIssueVec)
3915db4956bSzhanglyGit  }
3925db4956bSzhanglyGit  dontTouch(io.deq)
3935db4956bSzhanglyGit  io.transSelVec.zip(transSelVec).foreach { case (sink, source) =>
3945db4956bSzhanglyGit    sink := source.asUInt
3955db4956bSzhanglyGit  }
3965db4956bSzhanglyGit}
397