xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision 0721d1aaa70503e5b5e665af75f9bf4a290f5a57)
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  override def desiredName: String = params.getEntryName
166
167  private val EnqEntryNum = params.numEnq
168  private val OthersEntryNum = params.numEntries - params.numEnq
169  val io = IO(new EntriesIO)
170
171  // only memAddrIQ use it
172  val memEtyResps: MixedVec[ValidIO[EntryDeqRespBundle]] = {
173    if (params.isLdAddrIQ && !params.isStAddrIQ)
174      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get)
175    else if (params.isLdAddrIQ && params.isStAddrIQ || params.isHyAddrIQ)
176      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.memAddrIssueResp.get ++ io.finalIssueResp.get ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
177    else if (params.isMemAddrIQ)
178      MixedVecInit(io.og0Resp ++ io.og1Resp ++ io.fromMem.get.fastResp ++ io.fromMem.get.slowResp)
179    else MixedVecInit(Seq())
180  }
181
182  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = VecInit(io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.og0Resp), 0.U.asTypeOf(io.og0Resp))
183
184  //Module
185  val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params)))
186  val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params)))
187  val transPolicy = Module(new EnqPolicy)
188
189  //Wire
190  val deqSelVec = Wire(Vec(params.numEntries, Bool()))
191  val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool())))
192  val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
193  val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle)))
194  val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle)))
195  val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle)))
196
197  val validVec = Wire(Vec(params.numEntries, Bool()))
198  val canIssueVec = Wire(Vec(params.numEntries, Bool()))
199  val clearVec = Wire(Vec(params.numEntries, Bool()))
200  val fuTypeVec = Wire(Vec(params.numEntries, FuType()))
201  val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
202  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuOH()))))
203  val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
204  val cancelByOg0Vec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
205  val isFirstIssueVec = Wire(Vec(params.numEntries, Bool()))
206  val robIdxVec = Wire(Vec(params.numEntries, new RobPtr))
207  val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W)))
208  val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W)))
209  val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W)))
210  val cancelVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Bool())))
211  val uopIdxVec = OptionWrapper(params.isVecMemIQ, Wire(Vec(params.numEntries, UopIdx())))
212
213  io.transEntryDeqVec := transEntryDeqVec
214
215  //enqEntries
216  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
217    enqEntry.io.enq := io.enq(entryIdx)
218    enqEntry.io.flush := io.flush
219    enqEntry.io.wakeUpFromWB := io.wakeUpFromWB
220    enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
221    enqEntry.io.og0Cancel := io.og0Cancel
222    enqEntry.io.og1Cancel := io.og1Cancel
223    enqEntry.io.ldCancel := io.ldCancel
224    enqEntry.io.enqDelayWakeUpFromWB := RegNext(io.wakeUpFromWB)
225    enqEntry.io.enqDelayWakeUpFromIQ := RegNext(io.wakeUpFromIQ)
226    enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel)
227    enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel)
228    enqEntry.io.deqSel := deqSelVec(entryIdx)
229    enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx)
230    enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR
231    enqEntry.io.issueResp := issueRespVec(entryIdx)
232    validVec(entryIdx) := enqEntry.io.valid
233    canIssueVec(entryIdx) := enqEntry.io.canIssue
234    clearVec(entryIdx) := enqEntry.io.clear
235    fuTypeVec(entryIdx) := enqEntry.io.fuType
236    dataSourceVec(entryIdx) := enqEntry.io.dataSource
237    robIdxVec(entryIdx) := enqEntry.io.robIdx
238    issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead
239    deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead
240    if (params.hasIQWakeUp) {
241      srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get
242      srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get
243      cancelVec.get(entryIdx) := enqEntry.io.cancel.get
244    }
245    transEntryDeqVec(entryIdx) := enqEntry.io.transEntry
246    isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue
247    entries(entryIdx) := enqEntry.io.entry
248    //for mem
249    if (params.isMemAddrIQ) {
250      enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
251      enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
252    }
253    if (params.isVecMemIQ) {
254      uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get
255      enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
256      enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
257    }
258  }
259  //othersEntries
260  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
261    othersEntry.io.enq := transEntryEnqVec(entryIdx)
262    othersEntry.io.flush := io.flush
263    othersEntry.io.wakeUpFromWB := io.wakeUpFromWB
264    othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
265    othersEntry.io.og0Cancel := io.og0Cancel
266    othersEntry.io.og1Cancel := io.og1Cancel
267    othersEntry.io.ldCancel := io.ldCancel
268    othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum)
269    othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum)
270    othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _)
271    othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum)
272    validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid
273    canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue
274    clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear
275    fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType
276    dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource
277    robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx
278    issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead
279    deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead
280    if (params.hasIQWakeUp) {
281      srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get
282      srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get
283      cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get
284    }
285    isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue
286    entries(entryIdx + EnqEntryNum) := othersEntry.io.entry
287    //for mem
288    if (params.isMemAddrIQ) {
289      othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
290      othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
291    }
292    if (params.isVecMemIQ) {
293      uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get
294      othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
295      othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
296    }
297  }
298
299
300  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
301    val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i) && x.deqReady)
302    deqPortIdxWrite := OHToUInt(deqVec)
303    deqSel := deqVec.reduce(_ | _)
304  }
305
306
307  //transPolicy
308  transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt
309  transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) =>
310    selBools.zipWithIndex.foreach { case (selBool, i) =>
311      selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i)
312    }
313  }
314
315  //transEntryEnq
316  transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) =>
317    val transEnqHit = transSelVec.map(x => x(othersIdx))
318    transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec)
319  }
320  if(backendParams.debugEn) {
321    dontTouch(transEntryEnqVec)
322  }
323
324  //issueRespVec
325  if (params.isVecMemIQ) {
326    // vector memory IQ
327    issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) =>
328      val hitRespsVec = VecInit(resps.flatten.map(x =>
329        x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx
330      ))
331      issueResp.valid := hitRespsVec.reduce(_ | _)
332      issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits))
333    }
334  } else if (params.isMemAddrIQ) {
335    // scalar memory IQ
336    issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) =>
337      val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq)
338      issueResp.valid := hitRespsVec.reduce(_ | _)
339      issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)
340    }
341  }
342  else {
343    issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) =>
344      val Resp = resps(issueTimer)(deqPortIdx)
345      issueResp := Resp
346    }
347  }
348
349  //deq
350  val enqEntryOldest = io.deq.map { deq =>
351    Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum))
352  }
353  val enqEntryOldestCancel = io.deq.map { deq =>
354    Mux1H(deq.enqEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum))
355  }
356  val othersEntryOldest = io.deq.map { deq =>
357    Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum))
358  }
359  val othersEntryOldestCancel = io.deq.map { deq =>
360    Mux1H(deq.othersEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum))
361  }
362
363  if (params.deqFuSame) {
364    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
365    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
366    val subDeqPolicyCancelByOg0Vec = Wire(Vec(params.numDeq, Bool()))
367
368    subDeqPolicyEntryVec(0) := PriorityMux(io.deq(0).subDeqRequest.get, entries)
369    subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), entries.reverse)
370    subDeqPolicyValidVec(0) := PopCount(io.deq(0).subDeqRequest.get) >= 1.U
371    subDeqPolicyValidVec(1) := PopCount(io.deq(0).subDeqRequest.get) >= 2.U
372    subDeqPolicyCancelByOg0Vec(0) := PriorityMux(io.deq(0).subDeqRequest.get, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))))
373    subDeqPolicyCancelByOg0Vec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse)
374
375    io.deq(0).deqEntry := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), subDeqPolicyEntryVec(1))
376    io.deq(1).deqEntry := subDeqPolicyEntryVec(0)
377    io.cancelDeqVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldestCancel(0), subDeqPolicyCancelByOg0Vec(1))
378    io.cancelDeqVec(1) := subDeqPolicyCancelByOg0Vec(0)
379
380    when (subDeqPolicyValidVec(0)) {
381      assert(Mux1H(io.deq(0).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
382    }
383    when (subDeqPolicyValidVec(1)) {
384      assert(Mux1H(io.deq(1).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
385    }
386  }
387  else {
388    io.deq.zipWithIndex.foreach { case (x, i) =>
389      x.deqEntry := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldest(i), enqEntryOldest(i))
390      io.cancelDeqVec(i) := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i))
391    }
392  }
393
394  if (params.hasIQWakeUp) {
395    cancelByOg0Vec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).foreach{ case ((cancelByOg0: Bool, l1ExuOH: Vec[UInt]), srcTimer: Vec[UInt]) =>
396      cancelByOg0 := l1ExuOH.zip(srcTimer).map {
397        case(exuOH, srcTimer) =>
398          (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U
399      }.reduce(_ | _)
400    }
401  }
402
403  io.valid := validVec.asUInt
404  io.canIssue := canIssueVec.asUInt
405  io.clear := clearVec.asUInt
406  io.fuType := fuTypeVec
407  io.dataSources := dataSourceVec
408  io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get)
409  io.srcTimer.foreach(_ := srcTimerVec.get)
410  io.cancel.foreach(_ := cancelVec.get)
411  io.robIdx.foreach(_ := robIdxVec)
412  io.uopIdx.foreach(_ := uopIdxVec.get)
413  io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo
414  io.deq.foreach{ x =>
415    x.isFirstIssue := x.deqSelOH.valid && Mux1H(x.deqSelOH.bits, isFirstIssueVec)
416  }
417  if(backendParams.debugEn) {
418    dontTouch(io.deq)
419  }
420  io.transSelVec.zip(transSelVec).foreach { case (sink, source) =>
421    sink := source.asUInt
422  }
423}
424