xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision 2aaa83c0374a83bf896bf5106d9ce211df8ac6bb)
1package xiangshan.backend.issue
2
3import org.chipsalliance.cde.config.Parameters
4import chisel3._
5import chisel3.util._
6import utility.HasCircularQueuePtrHelper
7import utils.{MathUtils, OptionWrapper, XSError}
8import xiangshan._
9import xiangshan.backend.Bundles._
10import xiangshan.backend.datapath.DataConfig.VAddrData
11import xiangshan.backend.datapath.DataSource
12import xiangshan.backend.fu.FuType
13import xiangshan.backend.fu.vector.Utils.NOnes
14import xiangshan.backend.rob.RobPtr
15import xiangshan.mem.{MemWaitUpdateReq, SqPtr, LqPtr}
16
17object IQFuType {
18  def num = FuType.num
19
20  def apply() = Vec(num, Bool())
21
22  def readFuType(fuType: Vec[Bool], fus: Seq[FuType.OHType]): Vec[Bool] = {
23    val res = 0.U.asTypeOf(fuType)
24    fus.foreach(x => res(x.id) := fuType(x.id))
25    res
26  }
27}
28
29class StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
30  val waitForSqIdx = new SqPtr   // generated by store data valid check
31  val waitForRobIdx = new RobPtr // generated by store set
32  val waitForStd = Bool()
33  val strictWait = Bool()
34  val sqIdx = new SqPtr
35}
36
37class StatusVecMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
38  val sqIdx = new SqPtr
39  val lqIdx = new LqPtr
40}
41
42class Status(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
43  val srcState = Vec(params.numRegSrc, SrcState())
44
45  val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W))
46  val srcType = Vec(params.numRegSrc, SrcType())
47  val fuType = IQFuType()
48  val robIdx = new RobPtr
49  val uopIdx = OptionWrapper(params.isVecMemIQ, UopIdx())
50  val issued = Bool()           // for predict issue
51  val firstIssue = Bool()
52  val blocked = Bool()          // for some block reason
53  // read reg or get data from bypass network
54  val dataSources = Vec(params.numRegSrc, DataSource())
55  // if waked up by iq, set when waked up by iq
56  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuVec()))
57  // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued.
58  val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W)))
59  val issueTimer = UInt(2.W)
60  val deqPortIdx = UInt(1.W)
61  val srcLoadDependency = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, Vec(LoadPipelineWidth, UInt(3.W))))
62
63  // mem only
64  val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None
65
66  // vector mem only
67  val vecMem = if (params.isVecMemIQ) Some(new StatusVecMemPart) else None
68
69  def srcReady: Bool = {
70    VecInit(srcState.map(SrcState.isReady)).asUInt.andR
71  }
72
73  def canIssue: Bool = {
74    srcReady && !issued && !blocked
75  }
76
77  def mergedLoadDependency = {
78    srcLoadDependency.map(_.map(_.toSeq).reduce({
79      case (l: Vec[UInt], r: Vec[UInt]) => VecInit(l.zip(r).map(x => x._1 | x._2))
80    }: (Vec[UInt], Vec[UInt]) => Vec[UInt]))
81  }
82}
83
84class EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
85  val robIdx = new RobPtr
86  val uopIdx = UopIdx()
87  val respType = RSFeedbackType()   // update credit if needs replay
88  val dataInvalidSqIdx = new SqPtr
89  val rfWen = Bool()
90  val fuType = FuType()
91}
92
93class EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
94  val status = new Status()
95  val imm = OptionWrapper(params.needImm, UInt((params.deqImmTypesMaxLen).W))
96  val payload = new DynInst()
97}
98
99class DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
100  //input
101  val enqEntryOldestSel = Flipped(ValidIO(UInt(params.numEnq.W)))
102  val othersEntryOldestSel = Flipped(ValidIO(UInt((params.numEntries - params.numEnq).W)))
103  val subDeqRequest = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W)))
104  val subDeqSelOH = OptionWrapper(params.deqFuSame, Input(UInt(params.numEntries.W)))
105  val deqReady = Input(Bool())
106  val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W)))
107  //output
108  val isFirstIssue = Output(Bool())
109  val deqEntry = ValidIO(new EntryBundle)
110}
111
112class EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
113  val flush = Flipped(ValidIO(new Redirect))
114  // status
115  val valid = Output(UInt(params.numEntries.W))
116  val canIssue = Output(UInt(params.numEntries.W))
117  val clear = Output(UInt(params.numEntries.W))
118  val fuType = Output(Vec(params.numEntries, FuType()))
119  val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
120  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH()))))
121  val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
122  val robIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, new RobPtr)))
123  val uopIdx = OptionWrapper(params.isVecMemIQ, Output(Vec(params.numEntries, UopIdx())))
124  //enq
125  val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
126  // wakeup
127  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
128  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
129  val og0Cancel = Input(ExuOH(backendParams.numExu))
130  val og1Cancel = Input(ExuOH(backendParams.numExu))
131  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
132  //deq
133  val deq = Vec(params.numDeq, new DeqBundle)
134  val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
135  val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
136  val finalIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle))))
137  val memAddrIssueResp = OptionWrapper(params.LdExuCnt > 0, Vec(params.LdExuCnt, Flipped(ValidIO(new EntryDeqRespBundle))))
138  val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle))
139  val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W)))
140  val cancelDeqVec = Output(Vec(params.numDeq, Bool()))
141
142
143  val rsFeedback = Output(Vec(5, Bool()))
144  // mem only
145  val fromMem = if (params.isMemAddrIQ) Some(new Bundle {
146    val stIssuePtr = Input(new SqPtr)
147    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
148    val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
149    val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
150  }) else None
151
152  // vector mem only
153  val fromLsq = OptionWrapper(params.isVecMemIQ, new Bundle {
154    val sqDeqPtr = Input(new SqPtr)
155    val lqDeqPtr = Input(new LqPtr)
156  })
157
158  // debug
159  val cancel = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Bool())))
160
161  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
162}
163
164class Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
165  private val EnqEntryNum = params.numEnq
166  private val OthersEntryNum = params.numEntries - params.numEnq
167  val io = IO(new EntriesIO)
168
169  // only memAddrIQ use it
170  val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = {
171    if (params.isLdAddrIQ && !params.isStAddrIQ)
172      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get)
173    else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ)
174      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
175    else if (params.isMemAddrIQ)
176      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
177    else MixedVecInit(Seq())
178  }
179
180  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp))
181
182  //Module
183  val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params)))
184  val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params)))
185  val transPolicy = Module(new EnqPolicy)
186
187  //Wire
188  val deqSelVec = Wire(Vec(params.numEntries, Bool()))
189  val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool())))
190  val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
191  val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle)))
192  val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle)))
193  val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle)))
194
195  val validVec = Wire(Vec(params.numEntries, Bool()))
196  val canIssueVec = Wire(Vec(params.numEntries, Bool()))
197  val clearVec = Wire(Vec(params.numEntries, Bool()))
198  val fuTypeVec = Wire(Vec(params.numEntries, FuType()))
199  val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
200  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH()))))
201  val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
202  val cancelByOg0Vec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
203  val isFirstIssueVec = Wire(Vec(params.numEntries, Bool()))
204  val robIdxVec = Wire(Vec(params.numEntries, new RobPtr))
205  val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W)))
206  val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W)))
207  val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W)))
208  val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
209  val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx())))
210
211  io.transEntryDeqVec := transEntryDeqVec
212
213  //enqEntries
214  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
215    enqEntry.io.enq := io.enq(entryIdx)
216    enqEntry.io.flush := io.flush
217    enqEntry.io.wakeUpFromWB := io.wakeUpFromWB
218    enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
219    enqEntry.io.og0Cancel := io.og0Cancel
220    enqEntry.io.og1Cancel := io.og1Cancel
221    enqEntry.io.ldCancel := io.ldCancel
222    enqEntry.io.enqDelayWakeUpFromWB := RegNext(io.wakeUpFromWB)
223    enqEntry.io.enqDelayWakeUpFromIQ := RegNext(io.wakeUpFromIQ)
224    enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel)
225    enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel)
226    enqEntry.io.deqSel := deqSelVec(entryIdx)
227    enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx)
228    enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR
229    enqEntry.io.issueResp := issueRespVec(entryIdx)
230    validVec(entryIdx) := enqEntry.io.valid
231    canIssueVec(entryIdx) := enqEntry.io.canIssue
232    clearVec(entryIdx) := enqEntry.io.clear
233    fuTypeVec(entryIdx) := enqEntry.io.fuType
234    dataSourceVec(entryIdx) := enqEntry.io.dataSource
235    robIdxVec(entryIdx) := enqEntry.io.robIdx
236    issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead
237    deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead
238    if (params.hasIQWakeUp) {
239      srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get
240      srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get
241      cancelVec.get(entryIdx) := enqEntry.io.cancel.get
242    }
243    transEntryDeqVec(entryIdx) := enqEntry.io.transEntry
244    isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue
245    entries(entryIdx) := enqEntry.io.entry
246    //for mem
247    if (params.isMemAddrIQ) {
248      enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
249      enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
250    }
251    if (params.isVecMemIQ) {
252      uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get
253      enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
254      enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
255    }
256  }
257  //othersEntries
258  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
259    othersEntry.io.enq := transEntryEnqVec(entryIdx)
260    othersEntry.io.flush := io.flush
261    othersEntry.io.wakeUpFromWB := io.wakeUpFromWB
262    othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
263    othersEntry.io.og0Cancel := io.og0Cancel
264    othersEntry.io.og1Cancel := io.og1Cancel
265    othersEntry.io.ldCancel := io.ldCancel
266    othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum)
267    othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum)
268    othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _)
269    othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum)
270    validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid
271    canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue
272    clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear
273    fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType
274    dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource
275    robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx
276    issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead
277    deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead
278    if (params.hasIQWakeUp) {
279      srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get
280      srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get
281      cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get
282    }
283    isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue
284    entries(entryIdx + EnqEntryNum) := othersEntry.io.entry
285    //for mem
286    if (params.isMemAddrIQ) {
287      othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
288      othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
289    }
290    if (params.isVecMemIQ) {
291      uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get
292      othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
293      othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
294    }
295  }
296
297
298  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
299    val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i) && x.deqReady)
300    deqPortIdxWrite := OHToUInt(deqVec)
301    deqSel := deqVec.reduce(_ | _)
302  }
303
304
305  //transPolicy
306  transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt
307  transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) =>
308    selBools.zipWithIndex.foreach { case (selBool, i) =>
309      selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i)
310    }
311  }
312
313  //transEntryEnq
314  transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) =>
315    val transEnqHit = transSelVec.map(x => x(othersIdx))
316    transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec)
317  }
318  if(backendParams.debugEn) {
319    dontTouch(transEntryEnqVec)
320  }
321
322  //issueRespVec
323  if (params.isVecMemIQ) {
324    // vector memory IQ
325    issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) =>
326      val hitRespsVec = VecInit(resps.flatten.map(x =>
327        x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx
328      ))
329      issueResp.valid := hitRespsVec.reduce(_ | _)
330      issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits))
331    }
332  } else if (params.isMemAddrIQ) {
333    // scalar memory IQ
334    issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) =>
335      val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq)
336      issueResp.valid := hitRespsVec.reduce(_ | _)
337      issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)
338    }
339  }
340  else {
341    issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) =>
342      val Resp = resps(issueTimer)(deqPortIdx)
343      issueResp := Resp
344    }
345  }
346
347  //deq
348  val enqEntryOldest = io.deq.map { deq =>
349    Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum))
350  }
351  val enqEntryOldestCancel = io.deq.map { deq =>
352    Mux1H(deq.enqEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum))
353  }
354  val othersEntryOldest = io.deq.map { deq =>
355    Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum))
356  }
357  val othersEntryOldestCancel = io.deq.map { deq =>
358    Mux1H(deq.othersEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum))
359  }
360
361  if (params.deqFuSame) {
362    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
363    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
364    val subDeqPolicyCancelByOg0Vec = Wire(Vec(params.numDeq, Bool()))
365
366    subDeqPolicyEntryVec(0) := PriorityMux(io.deq(0).subDeqRequest.get, entries)
367    subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), entries.reverse)
368    subDeqPolicyValidVec(0) := PopCount(io.deq(0).subDeqRequest.get) >= 1.U
369    subDeqPolicyValidVec(1) := PopCount(io.deq(0).subDeqRequest.get) >= 2.U
370    subDeqPolicyCancelByOg0Vec(0) := PriorityMux(io.deq(0).subDeqRequest.get, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))))
371    subDeqPolicyCancelByOg0Vec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse)
372
373    io.deq(0).deqEntry := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), subDeqPolicyEntryVec(1))
374    io.deq(1).deqEntry := subDeqPolicyEntryVec(0)
375    io.cancelDeqVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldestCancel(0), subDeqPolicyCancelByOg0Vec(1))
376    io.cancelDeqVec(1) := subDeqPolicyCancelByOg0Vec(0)
377
378    when (subDeqPolicyValidVec(0)) {
379      assert(Mux1H(io.deq(0).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
380    }
381    when (subDeqPolicyValidVec(1)) {
382      assert(Mux1H(io.deq(1).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
383    }
384  }
385  else {
386    io.deq.zipWithIndex.foreach { case (x, i) =>
387      x.deqEntry := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldest(i), enqEntryOldest(i))
388      io.cancelDeqVec(i) := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i))
389    }
390  }
391
392  if (params.hasIQWakeUp) {
393    cancelByOg0Vec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).foreach{ case ((cancelByOg0: Bool, l1ExuOH: Vec[UInt]), srcTimer: Vec[UInt]) =>
394      cancelByOg0 := l1ExuOH.zip(srcTimer).map {
395        case(exuOH, srcTimer) =>
396          (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U
397      }.reduce(_ | _)
398    }
399  }
400
401  io.valid := validVec.asUInt
402  io.canIssue := canIssueVec.asUInt
403  io.clear := clearVec.asUInt
404  io.fuType := fuTypeVec
405  io.dataSources := dataSourceVec
406  io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get)
407  io.srcTimer.foreach(_ := srcTimerVec.get)
408  io.cancel.foreach(_ := cancelVec.get)
409  io.robIdx.foreach(_ := robIdxVec)
410  io.uopIdx.foreach(_ := uopIdxVec.get)
411  io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo
412  io.deq.foreach{ x =>
413    x.isFirstIssue := x.deqSelOH.valid && Mux1H(x.deqSelOH.bits, isFirstIssueVec)
414  }
415  if(backendParams.debugEn) {
416    dontTouch(io.deq)
417  }
418  io.transSelVec.zip(transSelVec).foreach { case (sink, source) =>
419    sink := source.asUInt
420  }
421}
422