xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision 8321ef33138ec47cf73f78a80f3cda03cf835319)
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
17543f3ac7Ssinsanctionobject IQFuType {
18543f3ac7Ssinsanction  def num = FuType.num
19543f3ac7Ssinsanction
20543f3ac7Ssinsanction  def apply() = Vec(num, Bool())
21543f3ac7Ssinsanction
22543f3ac7Ssinsanction  def readFuType(fuType: Vec[Bool], fus: Seq[FuType.OHType]): Vec[Bool] = {
23543f3ac7Ssinsanction    val res = 0.U.asTypeOf(fuType)
24543f3ac7Ssinsanction    fus.foreach(x => res(x.id) := fuType(x.id))
25543f3ac7Ssinsanction    res
26543f3ac7Ssinsanction  }
27543f3ac7Ssinsanction}
28543f3ac7Ssinsanction
295db4956bSzhanglyGitclass StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
305db4956bSzhanglyGit  val waitForSqIdx = new SqPtr   // generated by store data valid check
315db4956bSzhanglyGit  val waitForRobIdx = new RobPtr // generated by store set
325db4956bSzhanglyGit  val waitForStd = Bool()
335db4956bSzhanglyGit  val strictWait = Bool()
345db4956bSzhanglyGit  val sqIdx = new SqPtr
355db4956bSzhanglyGit}
365db4956bSzhanglyGit
372d270511Ssinsanctionclass StatusVecMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
382d270511Ssinsanction  val sqIdx = new SqPtr
392d270511Ssinsanction  val lqIdx = new LqPtr
402d270511Ssinsanction}
412d270511Ssinsanction
420f55a0d3SHaojin Tangclass Status(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
435db4956bSzhanglyGit  val srcState = Vec(params.numRegSrc, SrcState())
445db4956bSzhanglyGit
455db4956bSzhanglyGit  val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W))
465db4956bSzhanglyGit  val srcType = Vec(params.numRegSrc, SrcType())
47543f3ac7Ssinsanction  val fuType = IQFuType()
485db4956bSzhanglyGit  val robIdx = new RobPtr
492d270511Ssinsanction  val uopIdx = OptionWrapper(params.isVecMemIQ, UopIdx())
505db4956bSzhanglyGit  val issued = Bool()           // for predict issue
515db4956bSzhanglyGit  val firstIssue = Bool()
525db4956bSzhanglyGit  val blocked = Bool()          // for some block reason
535db4956bSzhanglyGit  // read reg or get data from bypass network
545db4956bSzhanglyGit  val dataSources = Vec(params.numRegSrc, DataSource())
555db4956bSzhanglyGit  // if waked up by iq, set when waked up by iq
561f35da39Sxiaofeibao-xjtu  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuVec()))
575db4956bSzhanglyGit  // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued.
585db4956bSzhanglyGit  val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W)))
595db4956bSzhanglyGit  val issueTimer = UInt(2.W)
605db4956bSzhanglyGit  val deqPortIdx = UInt(1.W)
610f55a0d3SHaojin Tang  val srcLoadDependency = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))
625db4956bSzhanglyGit
635db4956bSzhanglyGit  // mem only
645db4956bSzhanglyGit  val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None
655db4956bSzhanglyGit
662d270511Ssinsanction  // vector mem only
672d270511Ssinsanction  val vecMem = if (params.isVecMemIQ) Some(new StatusVecMemPart) else None
682d270511Ssinsanction
695db4956bSzhanglyGit  def srcReady: Bool = {
705db4956bSzhanglyGit    VecInit(srcState.map(SrcState.isReady)).asUInt.andR
715db4956bSzhanglyGit  }
725db4956bSzhanglyGit
735db4956bSzhanglyGit  def canIssue: Bool = {
745db4956bSzhanglyGit    srcReady && !issued && !blocked
755db4956bSzhanglyGit  }
760f55a0d3SHaojin Tang
7783ba63b3SXuan Hu  def mergedLoadDependency = {
7883ba63b3SXuan Hu    srcLoadDependency.map(_.map(_.toSeq).reduce({
7983ba63b3SXuan Hu      case (l: Vec[UInt], r: Vec[UInt]) => VecInit(l.zip(r).map(x => x._1 | x._2))
8083ba63b3SXuan Hu    }: (Vec[UInt], Vec[UInt]) => Vec[UInt]))
8183ba63b3SXuan Hu  }
825db4956bSzhanglyGit}
835db4956bSzhanglyGit
845db4956bSzhanglyGitclass EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
855db4956bSzhanglyGit  val robIdx = new RobPtr
86887f9c3dSzhanglinjuan  val uopIdx = UopIdx()
875db4956bSzhanglyGit  val respType = RSFeedbackType()   // update credit if needs replay
885db4956bSzhanglyGit  val dataInvalidSqIdx = new SqPtr
895db4956bSzhanglyGit  val rfWen = Bool()
905db4956bSzhanglyGit  val fuType = FuType()
915db4956bSzhanglyGit}
925db4956bSzhanglyGit
935db4956bSzhanglyGitclass EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
945db4956bSzhanglyGit  val status = new Status()
95520f7dacSsinsanction  val imm = OptionWrapper(params.needImm, UInt((params.deqImmTypesMaxLen).W))
965db4956bSzhanglyGit  val payload = new DynInst()
975db4956bSzhanglyGit}
985db4956bSzhanglyGit
995db4956bSzhanglyGitclass DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
10040283787Ssinsanction  //input
10140283787Ssinsanction  val enqEntryOldestSel = Flipped(ValidIO(UInt(params.numEnq.W)))
10240283787Ssinsanction  val othersEntryOldestSel = Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))
103cf4a131aSsinsanction  val subDeqRequest = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W)))
104cf4a131aSsinsanction  val subDeqSelOH = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W)))
105ea159d42Ssinsanction  val deqReady = Input(Bool())
106f7f73727Ssinsanction  val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W)))
10740283787Ssinsanction  //output
1085db4956bSzhanglyGit  val isFirstIssue = Output(Bool())
10940283787Ssinsanction  val deqEntry = ValidIO(new EntryBundle)
1105db4956bSzhanglyGit}
1115db4956bSzhanglyGit
1125db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
1135db4956bSzhanglyGit  val flush = Flipped(ValidIO(new Redirect))
1145db4956bSzhanglyGit  // status
1155db4956bSzhanglyGit  val valid = Output(UInt(params.numEntries.W))
1165db4956bSzhanglyGit  val canIssue = Output(UInt(params.numEntries.W))
1175db4956bSzhanglyGit  val clear = Output(UInt(params.numEntries.W))
1185db4956bSzhanglyGit  val fuType = Output(Vec(params.numEntries, FuType()))
1195db4956bSzhanglyGit  val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
1207a96cc7fSHaojin Tang  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH()))))
1215db4956bSzhanglyGit  val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
1222d270511Ssinsanction  val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr)))
1232d270511Ssinsanction  val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx())))
1245db4956bSzhanglyGit  //enq
1255db4956bSzhanglyGit  val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
1265db4956bSzhanglyGit  // wakeup
1275db4956bSzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
1285db4956bSzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
1297a96cc7fSHaojin Tang  val og0Cancel = Input(ExuOH(backendParams.numExu))
1307a96cc7fSHaojin Tang  val og1Cancel = Input(ExuOH(backendParams.numExu))
1316810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
1325db4956bSzhanglyGit  //deq
1335db4956bSzhanglyGit  val deq = Vec(params.numDeq, new DeqBundle)
1345db4956bSzhanglyGit  val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1355db4956bSzhanglyGit  val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1368a66c02cSXuan Hu  val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle))))
1378a66c02cSXuan Hu  val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle))))
1385db4956bSzhanglyGit  val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle))
1395db4956bSzhanglyGit  val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W)))
140af4bd265SzhanglyGit  val cancelDeqVec = Output(Vec(params.numDeq, Bool()))
1415db4956bSzhanglyGit
1425db4956bSzhanglyGit
1435db4956bSzhanglyGit  val rsFeedback = Output(Vec(5, Bool()))
1445db4956bSzhanglyGit  // mem only
1455db4956bSzhanglyGit  val fromMem = if (params.isMemAddrIQ) Some(new Bundle {
1465db4956bSzhanglyGit    val stIssuePtr = Input(new SqPtr)
1475db4956bSzhanglyGit    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
1485db4956bSzhanglyGit    val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1495db4956bSzhanglyGit    val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
1505db4956bSzhanglyGit  }) else None
1515db4956bSzhanglyGit
1522d270511Ssinsanction  // vector mem only
1532d270511Ssinsanction  val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle {
1542d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
1552d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1562d270511Ssinsanction  })
1572d270511Ssinsanction
15889740385Ssinsanction  // debug
15989740385Ssinsanction  val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool())))
16089740385Ssinsanction
1615db4956bSzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
1625db4956bSzhanglyGit}
1635db4956bSzhanglyGit
1645db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
1650721d1aaSXuan Hu  override def desiredName: String = params.getEntryName
1660721d1aaSXuan Hu
1675db4956bSzhanglyGit  private val EnqEntryNum = params.numEnq
1685db4956bSzhanglyGit  private val OthersEntryNum = params.numEntries - params.numEnq
1695db4956bSzhanglyGit  val io = IO(new EntriesIO)
1705db4956bSzhanglyGit
171c838dea1SXuan Hu  // only memAddrIQ use it
172c838dea1SXuan Hu  val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = {
17356715025SXuan Hu    if (params.isLdAddrIQ && !params.isStAddrIQ)
174ea159d42Ssinsanction      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get)
17556715025SXuan Hu    else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ)
176ea159d42Ssinsanction      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
17756715025SXuan Hu    else if (params.isMemAddrIQ)
178ea159d42Ssinsanction      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
179c838dea1SXuan Hu    else MixedVecInit(Seq())
180c838dea1SXuan Hu  }
181c838dea1SXuan Hu
182ea159d42Ssinsanction  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp))
1835db4956bSzhanglyGit
1845db4956bSzhanglyGit  //Module
1855db4956bSzhanglyGit  val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params)))
1865db4956bSzhanglyGit  val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params)))
1875db4956bSzhanglyGit  val transPolicy = Module(new EnqPolicy)
1885db4956bSzhanglyGit
1895db4956bSzhanglyGit  //Wire
1905db4956bSzhanglyGit  val deqSelVec = Wire(Vec(params.numEntries, Bool()))
1915db4956bSzhanglyGit  val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool())))
1925db4956bSzhanglyGit  val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
1935db4956bSzhanglyGit  val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle)))
1945db4956bSzhanglyGit  val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle)))
1955db4956bSzhanglyGit  val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle)))
1965db4956bSzhanglyGit
1975db4956bSzhanglyGit  val validVec = Wire(Vec(params.numEntries, Bool()))
1985db4956bSzhanglyGit  val canIssueVec = Wire(Vec(params.numEntries, Bool()))
1995db4956bSzhanglyGit  val clearVec = Wire(Vec(params.numEntries, Bool()))
2005db4956bSzhanglyGit  val fuTypeVec = Wire(Vec(params.numEntries, FuType()))
2015db4956bSzhanglyGit  val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
2027a96cc7fSHaojin Tang  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH()))))
2035db4956bSzhanglyGit  val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
204af4bd265SzhanglyGit  val cancelByOg0Vec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
2055db4956bSzhanglyGit  val isFirstIssueVec = Wire(Vec(params.numEntries, Bool()))
2065db4956bSzhanglyGit  val robIdxVec = Wire(Vec(params.numEntries, new RobPtr))
2075db4956bSzhanglyGit  val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W)))
2085db4956bSzhanglyGit  val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W)))
2095db4956bSzhanglyGit  val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W)))
21089740385Ssinsanction  val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
2112d270511Ssinsanction  val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx())))
2125db4956bSzhanglyGit
213*8321ef33Ssinsanction  val canTrans = Wire(Bool())
214*8321ef33Ssinsanction  val enqReadyOthersVec = Wire(Vec(OthersEntryNum, Bool()))
215*8321ef33Ssinsanction  val enqTransSelVec = Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W))))
216*8321ef33Ssinsanction
2175db4956bSzhanglyGit  io.transEntryDeqVec := transEntryDeqVec
2185db4956bSzhanglyGit
2195db4956bSzhanglyGit  //enqEntries
2205db4956bSzhanglyGit  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
2215db4956bSzhanglyGit    enqEntry.io.enq := io.enq(entryIdx)
2225db4956bSzhanglyGit    enqEntry.io.flush := io.flush
2235db4956bSzhanglyGit    enqEntry.io.wakeUpFromWB := io.wakeUpFromWB
2245db4956bSzhanglyGit    enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
2255db4956bSzhanglyGit    enqEntry.io.og0Cancel := io.og0Cancel
2265db4956bSzhanglyGit    enqEntry.io.og1Cancel := io.og1Cancel
2270f55a0d3SHaojin Tang    enqEntry.io.ldCancel := io.ldCancel
228aa2b5219Ssinsanction    enqEntry.io.enqDelayWakeUpFromWB := RegNext(io.wakeUpFromWB)
229aa2b5219Ssinsanction    enqEntry.io.enqDelayWakeUpFromIQ := RegNext(io.wakeUpFromIQ)
230aa2b5219Ssinsanction    enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel)
231aa2b5219Ssinsanction    enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel)
2325db4956bSzhanglyGit    enqEntry.io.deqSel := deqSelVec(entryIdx)
2335db4956bSzhanglyGit    enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx)
234*8321ef33Ssinsanction    enqEntry.io.transSel := canTrans && enqTransSelVec(entryIdx).valid
2355db4956bSzhanglyGit    enqEntry.io.issueResp := issueRespVec(entryIdx)
2365db4956bSzhanglyGit    validVec(entryIdx) := enqEntry.io.valid
2375db4956bSzhanglyGit    canIssueVec(entryIdx) := enqEntry.io.canIssue
2385db4956bSzhanglyGit    clearVec(entryIdx) := enqEntry.io.clear
2395db4956bSzhanglyGit    fuTypeVec(entryIdx) := enqEntry.io.fuType
2405db4956bSzhanglyGit    dataSourceVec(entryIdx) := enqEntry.io.dataSource
2415db4956bSzhanglyGit    robIdxVec(entryIdx) := enqEntry.io.robIdx
2425db4956bSzhanglyGit    issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead
2435db4956bSzhanglyGit    deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead
2445db4956bSzhanglyGit    if (params.hasIQWakeUp) {
2455db4956bSzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get
2465db4956bSzhanglyGit      srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get
24789740385Ssinsanction      cancelVec.get(entryIdx) := enqEntry.io.cancel.get
2485db4956bSzhanglyGit    }
2495db4956bSzhanglyGit    transEntryDeqVec(entryIdx) := enqEntry.io.transEntry
2505db4956bSzhanglyGit    isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue
2515db4956bSzhanglyGit    entries(entryIdx) := enqEntry.io.entry
2525db4956bSzhanglyGit    //for mem
2535db4956bSzhanglyGit    if (params.isMemAddrIQ) {
2545db4956bSzhanglyGit      enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
2555db4956bSzhanglyGit      enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
2565db4956bSzhanglyGit    }
2572d270511Ssinsanction    if (params.isVecMemIQ) {
2582d270511Ssinsanction      uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get
2592d270511Ssinsanction      enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
2602d270511Ssinsanction      enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
2612d270511Ssinsanction    }
2625db4956bSzhanglyGit  }
2635db4956bSzhanglyGit  //othersEntries
2645db4956bSzhanglyGit  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
2655db4956bSzhanglyGit    othersEntry.io.enq := transEntryEnqVec(entryIdx)
2665db4956bSzhanglyGit    othersEntry.io.flush := io.flush
2675db4956bSzhanglyGit    othersEntry.io.wakeUpFromWB := io.wakeUpFromWB
2685db4956bSzhanglyGit    othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
2695db4956bSzhanglyGit    othersEntry.io.og0Cancel := io.og0Cancel
2705db4956bSzhanglyGit    othersEntry.io.og1Cancel := io.og1Cancel
2710f55a0d3SHaojin Tang    othersEntry.io.ldCancel := io.ldCancel
2725db4956bSzhanglyGit    othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum)
2735db4956bSzhanglyGit    othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum)
2745db4956bSzhanglyGit    othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _)
2755db4956bSzhanglyGit    othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum)
2765db4956bSzhanglyGit    validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid
2775db4956bSzhanglyGit    canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue
2785db4956bSzhanglyGit    clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear
279*8321ef33Ssinsanction    enqReadyOthersVec(entryIdx) := othersEntry.io.enqReady
2805db4956bSzhanglyGit    fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType
2815db4956bSzhanglyGit    dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource
2825db4956bSzhanglyGit    robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx
2835db4956bSzhanglyGit    issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead
2845db4956bSzhanglyGit    deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead
2855db4956bSzhanglyGit    if (params.hasIQWakeUp) {
2865db4956bSzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get
2875db4956bSzhanglyGit      srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get
28889740385Ssinsanction      cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get
2895db4956bSzhanglyGit    }
2905db4956bSzhanglyGit    isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue
2915db4956bSzhanglyGit    entries(entryIdx + EnqEntryNum) := othersEntry.io.entry
2925db4956bSzhanglyGit    //for mem
2935db4956bSzhanglyGit    if (params.isMemAddrIQ) {
2945db4956bSzhanglyGit      othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
2955db4956bSzhanglyGit      othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
2965db4956bSzhanglyGit    }
2972d270511Ssinsanction    if (params.isVecMemIQ) {
2982d270511Ssinsanction      uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get
2992d270511Ssinsanction      othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
3002d270511Ssinsanction      othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
3012d270511Ssinsanction    }
3025db4956bSzhanglyGit  }
3035db4956bSzhanglyGit
3045db4956bSzhanglyGit
3055db4956bSzhanglyGit  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
306ea159d42Ssinsanction    val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i) && x.deqReady)
3075db4956bSzhanglyGit    deqPortIdxWrite := OHToUInt(deqVec)
3085db4956bSzhanglyGit    deqSel := deqVec.reduce(_ | _)
3095db4956bSzhanglyGit  }
3105db4956bSzhanglyGit
3115db4956bSzhanglyGit
3125db4956bSzhanglyGit  //transPolicy
313*8321ef33Ssinsanction  transPolicy.io.canEnq := enqReadyOthersVec.asUInt
314*8321ef33Ssinsanction  canTrans := PopCount(validVec.take(EnqEntryNum)) <= PopCount(enqReadyOthersVec)
315*8321ef33Ssinsanction  enqTransSelVec(0).valid := transPolicy.io.enqSelOHVec(0).valid
316*8321ef33Ssinsanction  enqTransSelVec(0).bits := transPolicy.io.enqSelOHVec(0).bits
317*8321ef33Ssinsanction  if (params.numEnq == 2) {
318*8321ef33Ssinsanction    enqTransSelVec(1).valid := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).valid, transPolicy.io.enqSelOHVec(1).valid)
319*8321ef33Ssinsanction    enqTransSelVec(1).bits := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).bits, transPolicy.io.enqSelOHVec(1).bits)
320*8321ef33Ssinsanction  }
321*8321ef33Ssinsanction
322*8321ef33Ssinsanction  transSelVec.zip(enqTransSelVec).zipWithIndex.foreach { case ((selBools, selOH), enqIdx) =>
323*8321ef33Ssinsanction    selBools.zipWithIndex.foreach { case (selBool, othersIdx) =>
324*8321ef33Ssinsanction      selBool := canTrans && validVec(enqIdx) && selOH.valid && selOH.bits(othersIdx)
3255db4956bSzhanglyGit    }
3265db4956bSzhanglyGit  }
3275db4956bSzhanglyGit
3285db4956bSzhanglyGit  //transEntryEnq
3295db4956bSzhanglyGit  transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) =>
3305db4956bSzhanglyGit    val transEnqHit = transSelVec.map(x => x(othersIdx))
3315db4956bSzhanglyGit    transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec)
3325db4956bSzhanglyGit  }
3338d081717Sszw_kaixin  if(backendParams.debugEn) {
3345db4956bSzhanglyGit    dontTouch(transEntryEnqVec)
3358d081717Sszw_kaixin  }
3365db4956bSzhanglyGit
3375db4956bSzhanglyGit  //issueRespVec
338887f9c3dSzhanglinjuan  if (params.isVecMemIQ) {
339887f9c3dSzhanglinjuan    // vector memory IQ
340887f9c3dSzhanglinjuan    issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) =>
341887f9c3dSzhanglinjuan      val hitRespsVec = VecInit(resps.flatten.map(x =>
342887f9c3dSzhanglinjuan        x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx
343887f9c3dSzhanglinjuan      ))
344887f9c3dSzhanglinjuan      issueResp.valid := hitRespsVec.reduce(_ | _)
345887f9c3dSzhanglinjuan      issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits))
346887f9c3dSzhanglinjuan    }
347887f9c3dSzhanglinjuan  } else if (params.isMemAddrIQ) {
348887f9c3dSzhanglinjuan    // scalar memory IQ
3495db4956bSzhanglyGit    issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) =>
350c838dea1SXuan Hu      val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq)
3515db4956bSzhanglyGit      issueResp.valid := hitRespsVec.reduce(_ | _)
352c838dea1SXuan Hu      issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)
3535db4956bSzhanglyGit    }
3545db4956bSzhanglyGit  }
3555db4956bSzhanglyGit  else {
3565db4956bSzhanglyGit    issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) =>
3575db4956bSzhanglyGit      val Resp = resps(issueTimer)(deqPortIdx)
3585db4956bSzhanglyGit      issueResp := Resp
3595db4956bSzhanglyGit    }
3605db4956bSzhanglyGit  }
3615db4956bSzhanglyGit
36240283787Ssinsanction  //deq
36340283787Ssinsanction  val enqEntryOldest = io.deq.map { deq =>
36440283787Ssinsanction    Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum))
36540283787Ssinsanction  }
366af4bd265SzhanglyGit  val enqEntryOldestCancel = io.deq.map { deq =>
367af4bd265SzhanglyGit    Mux1H(deq.enqEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum))
368af4bd265SzhanglyGit  }
36940283787Ssinsanction  val othersEntryOldest = io.deq.map { deq =>
37040283787Ssinsanction    Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum))
37140283787Ssinsanction  }
372af4bd265SzhanglyGit  val othersEntryOldestCancel = io.deq.map { deq =>
373af4bd265SzhanglyGit    Mux1H(deq.othersEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum))
374af4bd265SzhanglyGit  }
375cf4a131aSsinsanction
376cf4a131aSsinsanction  if (params.deqFuSame) {
377cf4a131aSsinsanction    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
378cf4a131aSsinsanction    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
379af4bd265SzhanglyGit    val subDeqPolicyCancelByOg0Vec = Wire(Vec(params.numDeq, Bool()))
380cf4a131aSsinsanction
381cf4a131aSsinsanction    subDeqPolicyEntryVec(0) := PriorityMux(io.deq(0).subDeqRequest.get, entries)
382cf4a131aSsinsanction    subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), entries.reverse)
383cf4a131aSsinsanction    subDeqPolicyValidVec(0) := PopCount(io.deq(0).subDeqRequest.get) >= 1.U
384cf4a131aSsinsanction    subDeqPolicyValidVec(1) := PopCount(io.deq(0).subDeqRequest.get) >= 2.U
385af4bd265SzhanglyGit    subDeqPolicyCancelByOg0Vec(0) := PriorityMux(io.deq(0).subDeqRequest.get, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))))
386af4bd265SzhanglyGit    subDeqPolicyCancelByOg0Vec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse)
387cf4a131aSsinsanction
3885a6da888Ssinsanction    io.deq(0).deqEntry := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), subDeqPolicyEntryVec(1))
3895a6da888Ssinsanction    io.deq(1).deqEntry := subDeqPolicyEntryVec(0)
390af4bd265SzhanglyGit    io.cancelDeqVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldestCancel(0), subDeqPolicyCancelByOg0Vec(1))
391af4bd265SzhanglyGit    io.cancelDeqVec(1) := subDeqPolicyCancelByOg0Vec(0)
392cf4a131aSsinsanction
393cf4a131aSsinsanction    when (subDeqPolicyValidVec(0)) {
394cf4a131aSsinsanction      assert(Mux1H(io.deq(0).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
39540283787Ssinsanction    }
396cf4a131aSsinsanction    when (subDeqPolicyValidVec(1)) {
397cf4a131aSsinsanction      assert(Mux1H(io.deq(1).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
398f7f73727Ssinsanction    }
399f7f73727Ssinsanction  }
400f7f73727Ssinsanction  else {
401f7f73727Ssinsanction    io.deq.zipWithIndex.foreach { case (x, i) =>
402cf4a131aSsinsanction      x.deqEntry := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldest(i), enqEntryOldest(i))
403af4bd265SzhanglyGit      io.cancelDeqVec(i) := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i))
404af4bd265SzhanglyGit    }
405af4bd265SzhanglyGit  }
406af4bd265SzhanglyGit
407af4bd265SzhanglyGit  if (params.hasIQWakeUp) {
408af4bd265SzhanglyGit    cancelByOg0Vec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).foreach{ case ((cancelByOg0: Bool, l1ExuOH: Vec[UInt]), srcTimer: Vec[UInt]) =>
409af4bd265SzhanglyGit      cancelByOg0 := l1ExuOH.zip(srcTimer).map {
410af4bd265SzhanglyGit        case(exuOH, srcTimer) =>
411af4bd265SzhanglyGit          (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U
412af4bd265SzhanglyGit      }.reduce(_ | _)
41340283787Ssinsanction    }
41440283787Ssinsanction  }
41540283787Ssinsanction
4165db4956bSzhanglyGit  io.valid := validVec.asUInt
4175db4956bSzhanglyGit  io.canIssue := canIssueVec.asUInt
4185db4956bSzhanglyGit  io.clear := clearVec.asUInt
4195db4956bSzhanglyGit  io.fuType := fuTypeVec
4205db4956bSzhanglyGit  io.dataSources := dataSourceVec
4215db4956bSzhanglyGit  io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get)
4225db4956bSzhanglyGit  io.srcTimer.foreach(_ := srcTimerVec.get)
42389740385Ssinsanction  io.cancel.foreach(_ := cancelVec.get)
4242d270511Ssinsanction  io.robIdx.foreach(_ := robIdxVec)
4252d270511Ssinsanction  io.uopIdx.foreach(_ := uopIdxVec.get)
4265db4956bSzhanglyGit  io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo
4275db4956bSzhanglyGit  io.deq.foreach{ x =>
428cf4a131aSsinsanction    x.isFirstIssue := x.deqSelOH.valid && Mux1H(x.deqSelOH.bits, isFirstIssueVec)
4295db4956bSzhanglyGit  }
4308d081717Sszw_kaixin  if(backendParams.debugEn) {
4315db4956bSzhanglyGit    dontTouch(io.deq)
4328d081717Sszw_kaixin  }
4335db4956bSzhanglyGit  io.transSelVec.zip(transSelVec).foreach { case (sink, source) =>
4345db4956bSzhanglyGit    sink := source.asUInt
4355db4956bSzhanglyGit  }
4365db4956bSzhanglyGit}
437