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