xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision 8321ef33138ec47cf73f78a80f3cda03cf835319)
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  val canTrans = Wire(Bool())
214  val enqReadyOthersVec = Wire(Vec(OthersEntryNum, Bool()))
215  val enqTransSelVec = Wire(Vec(EnqEntryNum, Valid(UInt(OthersEntryNum.W))))
216
217  io.transEntryDeqVec := transEntryDeqVec
218
219  //enqEntries
220  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
221    enqEntry.io.enq := io.enq(entryIdx)
222    enqEntry.io.flush := io.flush
223    enqEntry.io.wakeUpFromWB := io.wakeUpFromWB
224    enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
225    enqEntry.io.og0Cancel := io.og0Cancel
226    enqEntry.io.og1Cancel := io.og1Cancel
227    enqEntry.io.ldCancel := io.ldCancel
228    enqEntry.io.enqDelayWakeUpFromWB := RegNext(io.wakeUpFromWB)
229    enqEntry.io.enqDelayWakeUpFromIQ := RegNext(io.wakeUpFromIQ)
230    enqEntry.io.enqDelayOg0Cancel := RegNext(io.og0Cancel)
231    enqEntry.io.enqDelayLdCancel := RegNext(io.ldCancel)
232    enqEntry.io.deqSel := deqSelVec(entryIdx)
233    enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx)
234    enqEntry.io.transSel := canTrans && enqTransSelVec(entryIdx).valid
235    enqEntry.io.issueResp := issueRespVec(entryIdx)
236    validVec(entryIdx) := enqEntry.io.valid
237    canIssueVec(entryIdx) := enqEntry.io.canIssue
238    clearVec(entryIdx) := enqEntry.io.clear
239    fuTypeVec(entryIdx) := enqEntry.io.fuType
240    dataSourceVec(entryIdx) := enqEntry.io.dataSource
241    robIdxVec(entryIdx) := enqEntry.io.robIdx
242    issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead
243    deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead
244    if (params.hasIQWakeUp) {
245      srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get
246      srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get
247      cancelVec.get(entryIdx) := enqEntry.io.cancel.get
248    }
249    transEntryDeqVec(entryIdx) := enqEntry.io.transEntry
250    isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue
251    entries(entryIdx) := enqEntry.io.entry
252    //for mem
253    if (params.isMemAddrIQ) {
254      enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
255      enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
256    }
257    if (params.isVecMemIQ) {
258      uopIdxVec.get(entryIdx) := enqEntry.io.uopIdx.get
259      enqEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
260      enqEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
261    }
262  }
263  //othersEntries
264  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
265    othersEntry.io.enq := transEntryEnqVec(entryIdx)
266    othersEntry.io.flush := io.flush
267    othersEntry.io.wakeUpFromWB := io.wakeUpFromWB
268    othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
269    othersEntry.io.og0Cancel := io.og0Cancel
270    othersEntry.io.og1Cancel := io.og1Cancel
271    othersEntry.io.ldCancel := io.ldCancel
272    othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum)
273    othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum)
274    othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _)
275    othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum)
276    validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid
277    canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue
278    clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear
279    enqReadyOthersVec(entryIdx) := othersEntry.io.enqReady
280    fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType
281    dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource
282    robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx
283    issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead
284    deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead
285    if (params.hasIQWakeUp) {
286      srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get
287      srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get
288      cancelVec.get(entryIdx + EnqEntryNum) := othersEntry.io.cancel.get
289    }
290    isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue
291    entries(entryIdx + EnqEntryNum) := othersEntry.io.entry
292    //for mem
293    if (params.isMemAddrIQ) {
294      othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
295      othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
296    }
297    if (params.isVecMemIQ) {
298      uopIdxVec.get(entryIdx + EnqEntryNum) := othersEntry.io.uopIdx.get
299      othersEntry.io.fromLsq.get.sqDeqPtr := io.fromLsq.get.sqDeqPtr
300      othersEntry.io.fromLsq.get.lqDeqPtr := io.fromLsq.get.lqDeqPtr
301    }
302  }
303
304
305  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
306    val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i) && x.deqReady)
307    deqPortIdxWrite := OHToUInt(deqVec)
308    deqSel := deqVec.reduce(_ | _)
309  }
310
311
312  //transPolicy
313  transPolicy.io.canEnq := enqReadyOthersVec.asUInt
314  canTrans := PopCount(validVec.take(EnqEntryNum)) <= PopCount(enqReadyOthersVec)
315  enqTransSelVec(0).valid := transPolicy.io.enqSelOHVec(0).valid
316  enqTransSelVec(0).bits := transPolicy.io.enqSelOHVec(0).bits
317  if (params.numEnq == 2) {
318    enqTransSelVec(1).valid := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).valid, transPolicy.io.enqSelOHVec(1).valid)
319    enqTransSelVec(1).bits := Mux(!validVec(0), transPolicy.io.enqSelOHVec(0).bits, transPolicy.io.enqSelOHVec(1).bits)
320  }
321
322  transSelVec.zip(enqTransSelVec).zipWithIndex.foreach { case ((selBools, selOH), enqIdx) =>
323    selBools.zipWithIndex.foreach { case (selBool, othersIdx) =>
324      selBool := canTrans && validVec(enqIdx) && selOH.valid && selOH.bits(othersIdx)
325    }
326  }
327
328  //transEntryEnq
329  transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) =>
330    val transEnqHit = transSelVec.map(x => x(othersIdx))
331    transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec)
332  }
333  if(backendParams.debugEn) {
334    dontTouch(transEntryEnqVec)
335  }
336
337  //issueRespVec
338  if (params.isVecMemIQ) {
339    // vector memory IQ
340    issueRespVec.zip(robIdxVec).zip(uopIdxVec.get).foreach { case ((issueResp, robIdx), uopIdx) =>
341      val hitRespsVec = VecInit(resps.flatten.map(x =>
342        x.valid && x.bits.robIdx === robIdx && x.bits.uopIdx === uopIdx
343      ))
344      issueResp.valid := hitRespsVec.reduce(_ | _)
345      issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits))
346    }
347  } else if (params.isMemAddrIQ) {
348    // scalar memory IQ
349    issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) =>
350      val hitRespsVec = VecInit(memEtyResps.map(x => x.valid && (x.bits.robIdx === robIdx)).toSeq)
351      issueResp.valid := hitRespsVec.reduce(_ | _)
352      issueResp.bits := Mux1H(hitRespsVec, memEtyResps.map(_.bits).toSeq)
353    }
354  }
355  else {
356    issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) =>
357      val Resp = resps(issueTimer)(deqPortIdx)
358      issueResp := Resp
359    }
360  }
361
362  //deq
363  val enqEntryOldest = io.deq.map { deq =>
364    Mux1H(deq.enqEntryOldestSel.bits, entries.take(EnqEntryNum))
365  }
366  val enqEntryOldestCancel = io.deq.map { deq =>
367    Mux1H(deq.enqEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).take(EnqEntryNum))
368  }
369  val othersEntryOldest = io.deq.map { deq =>
370    Mux1H(deq.othersEntryOldestSel.bits, entries.drop(EnqEntryNum))
371  }
372  val othersEntryOldestCancel = io.deq.map { deq =>
373    Mux1H(deq.othersEntryOldestSel.bits, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).drop(EnqEntryNum))
374  }
375
376  if (params.deqFuSame) {
377    val subDeqPolicyEntryVec = Wire(Vec(params.numDeq, ValidIO(new EntryBundle)))
378    val subDeqPolicyValidVec = Wire(Vec(params.numDeq, Bool()))
379    val subDeqPolicyCancelByOg0Vec = Wire(Vec(params.numDeq, Bool()))
380
381    subDeqPolicyEntryVec(0) := PriorityMux(io.deq(0).subDeqRequest.get, entries)
382    subDeqPolicyEntryVec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), entries.reverse)
383    subDeqPolicyValidVec(0) := PopCount(io.deq(0).subDeqRequest.get) >= 1.U
384    subDeqPolicyValidVec(1) := PopCount(io.deq(0).subDeqRequest.get) >= 2.U
385    subDeqPolicyCancelByOg0Vec(0) := PriorityMux(io.deq(0).subDeqRequest.get, cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))))
386    subDeqPolicyCancelByOg0Vec(1) := PriorityMux(Reverse(io.deq(0).subDeqRequest.get), cancelByOg0Vec.getOrElse(VecInit(Seq.fill(params.numEntries)(false.B))).reverse)
387
388    io.deq(0).deqEntry := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldest(0), subDeqPolicyEntryVec(1))
389    io.deq(1).deqEntry := subDeqPolicyEntryVec(0)
390    io.cancelDeqVec(0) := Mux(io.deq(0).othersEntryOldestSel.valid, othersEntryOldestCancel(0), subDeqPolicyCancelByOg0Vec(1))
391    io.cancelDeqVec(1) := subDeqPolicyCancelByOg0Vec(0)
392
393    when (subDeqPolicyValidVec(0)) {
394      assert(Mux1H(io.deq(0).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(0).bits.status.robIdx, "subDeqSelOH(0) is not the same\n")
395    }
396    when (subDeqPolicyValidVec(1)) {
397      assert(Mux1H(io.deq(1).subDeqSelOH.get, entries).bits.status.robIdx === subDeqPolicyEntryVec(1).bits.status.robIdx, "subDeqSelOH(1) is not the same\n")
398    }
399  }
400  else {
401    io.deq.zipWithIndex.foreach { case (x, i) =>
402      x.deqEntry := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldest(i), enqEntryOldest(i))
403      io.cancelDeqVec(i) := Mux(io.deq(i).othersEntryOldestSel.valid, othersEntryOldestCancel(i), enqEntryOldestCancel(i))
404    }
405  }
406
407  if (params.hasIQWakeUp) {
408    cancelByOg0Vec.get.zip(srcWakeUpL1ExuOHVec.get).zip(srcTimerVec.get).foreach{ case ((cancelByOg0: Bool, l1ExuOH: Vec[UInt]), srcTimer: Vec[UInt]) =>
409      cancelByOg0 := l1ExuOH.zip(srcTimer).map {
410        case(exuOH, srcTimer) =>
411          (exuOH.asUInt & io.og0Cancel.asUInt).orR && srcTimer === 1.U
412      }.reduce(_ | _)
413    }
414  }
415
416  io.valid := validVec.asUInt
417  io.canIssue := canIssueVec.asUInt
418  io.clear := clearVec.asUInt
419  io.fuType := fuTypeVec
420  io.dataSources := dataSourceVec
421  io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get)
422  io.srcTimer.foreach(_ := srcTimerVec.get)
423  io.cancel.foreach(_ := cancelVec.get)
424  io.robIdx.foreach(_ := robIdxVec)
425  io.uopIdx.foreach(_ := uopIdxVec.get)
426  io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo
427  io.deq.foreach{ x =>
428    x.isFirstIssue := x.deqSelOH.valid && Mux1H(x.deqSelOH.bits, isFirstIssueVec)
429  }
430  if(backendParams.debugEn) {
431    dontTouch(io.deq)
432  }
433  io.transSelVec.zip(transSelVec).foreach { case (sink, source) =>
434    sink := source.asUInt
435  }
436}
437