xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Entries.scala (revision 5db4956b8ea14332169fca361912b6eefd5d475f)
1*5db4956bSzhanglyGitpackage xiangshan.backend.issue
2*5db4956bSzhanglyGit
3*5db4956bSzhanglyGitimport chipsalliance.rocketchip.config.Parameters
4*5db4956bSzhanglyGitimport chisel3._
5*5db4956bSzhanglyGitimport chisel3.util._
6*5db4956bSzhanglyGitimport utility.HasCircularQueuePtrHelper
7*5db4956bSzhanglyGitimport utils.{MathUtils, OptionWrapper, XSError}
8*5db4956bSzhanglyGitimport xiangshan._
9*5db4956bSzhanglyGitimport xiangshan.backend.Bundles._
10*5db4956bSzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData
11*5db4956bSzhanglyGitimport xiangshan.backend.datapath.DataSource
12*5db4956bSzhanglyGitimport xiangshan.backend.fu.FuType
13*5db4956bSzhanglyGitimport xiangshan.backend.fu.vector.Utils.NOnes
14*5db4956bSzhanglyGitimport xiangshan.backend.rob.RobPtr
15*5db4956bSzhanglyGitimport xiangshan.mem.{MemWaitUpdateReq, SqPtr}
16*5db4956bSzhanglyGit
17*5db4956bSzhanglyGitclass StatusMemPart(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
18*5db4956bSzhanglyGit  val waitForSqIdx = new SqPtr   // generated by store data valid check
19*5db4956bSzhanglyGit  val waitForRobIdx = new RobPtr // generated by store set
20*5db4956bSzhanglyGit  val waitForStd = Bool()
21*5db4956bSzhanglyGit  val strictWait = Bool()
22*5db4956bSzhanglyGit  val sqIdx = new SqPtr
23*5db4956bSzhanglyGit}
24*5db4956bSzhanglyGit
25*5db4956bSzhanglyGitclass Status(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
26*5db4956bSzhanglyGit  val srcState = Vec(params.numRegSrc, SrcState())
27*5db4956bSzhanglyGit
28*5db4956bSzhanglyGit  val psrc = Vec(params.numRegSrc, UInt(params.rdPregIdxWidth.W))
29*5db4956bSzhanglyGit  val srcType = Vec(params.numRegSrc, SrcType())
30*5db4956bSzhanglyGit  val fuType = FuType()
31*5db4956bSzhanglyGit  val robIdx = new RobPtr
32*5db4956bSzhanglyGit  val issued = Bool()           // for predict issue
33*5db4956bSzhanglyGit  val firstIssue = Bool()
34*5db4956bSzhanglyGit  val blocked = Bool()          // for some block reason
35*5db4956bSzhanglyGit  // read reg or get data from bypass network
36*5db4956bSzhanglyGit  val dataSources = Vec(params.numRegSrc, DataSource())
37*5db4956bSzhanglyGit  // if waked up by iq, set when waked up by iq
38*5db4956bSzhanglyGit  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, ExuVec()))
39*5db4956bSzhanglyGit  // src timer, used by cancel signal. It increases every cycle after wakeup src inst issued.
40*5db4956bSzhanglyGit  val srcTimer = OptionWrapper(params.hasIQWakeUp, Vec(params.numRegSrc, UInt(3.W)))
41*5db4956bSzhanglyGit  val issueTimer = UInt(2.W)
42*5db4956bSzhanglyGit  val deqPortIdx = UInt(1.W)
43*5db4956bSzhanglyGit
44*5db4956bSzhanglyGit
45*5db4956bSzhanglyGit  // mem only
46*5db4956bSzhanglyGit  val mem = if (params.isMemAddrIQ) Some(new StatusMemPart) else None
47*5db4956bSzhanglyGit
48*5db4956bSzhanglyGit  // need pc
49*5db4956bSzhanglyGit  val pc = if (params.needPc) Some(UInt(VAddrData().dataWidth.W)) else None
50*5db4956bSzhanglyGit  val target = if(params.needPc) Some(UInt(VAddrData().dataWidth.W)) else None
51*5db4956bSzhanglyGit
52*5db4956bSzhanglyGit  def srcReady: Bool = {
53*5db4956bSzhanglyGit    VecInit(srcState.map(SrcState.isReady)).asUInt.andR
54*5db4956bSzhanglyGit  }
55*5db4956bSzhanglyGit
56*5db4956bSzhanglyGit  def canIssue: Bool = {
57*5db4956bSzhanglyGit    srcReady && !issued && !blocked
58*5db4956bSzhanglyGit  }
59*5db4956bSzhanglyGit}
60*5db4956bSzhanglyGit
61*5db4956bSzhanglyGitclass EntryDeqRespBundle(implicit p:Parameters, params: IssueBlockParams) extends Bundle {
62*5db4956bSzhanglyGit  val robIdx = new RobPtr
63*5db4956bSzhanglyGit  val respType = RSFeedbackType()   // update credit if needs replay
64*5db4956bSzhanglyGit  val dataInvalidSqIdx = new SqPtr
65*5db4956bSzhanglyGit  val rfWen = Bool()
66*5db4956bSzhanglyGit  val fuType = FuType()
67*5db4956bSzhanglyGit}
68*5db4956bSzhanglyGit
69*5db4956bSzhanglyGitclass EntryBundle(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
70*5db4956bSzhanglyGit  val status = new Status()
71*5db4956bSzhanglyGit  val imm = UInt(XLEN.W)
72*5db4956bSzhanglyGit  val payload = new DynInst()
73*5db4956bSzhanglyGit}
74*5db4956bSzhanglyGit
75*5db4956bSzhanglyGitclass DeqBundle(implicit p:Parameters, params: IssueBlockParams) extends XSBundle {
76*5db4956bSzhanglyGit  val isFirstIssue = Output(Bool())
77*5db4956bSzhanglyGit  val deqSelOH = Flipped(ValidIO(UInt(params.numEntries.W)))
78*5db4956bSzhanglyGit}
79*5db4956bSzhanglyGit
80*5db4956bSzhanglyGitclass EntriesIO(implicit p: Parameters, params: IssueBlockParams) extends XSBundle {
81*5db4956bSzhanglyGit  val flush = Flipped(ValidIO(new Redirect))
82*5db4956bSzhanglyGit  // status
83*5db4956bSzhanglyGit  val valid = Output(UInt(params.numEntries.W))
84*5db4956bSzhanglyGit  val canIssue = Output(UInt(params.numEntries.W))
85*5db4956bSzhanglyGit  val clear = Output(UInt(params.numEntries.W))
86*5db4956bSzhanglyGit  val fuType = Output(Vec(params.numEntries, FuType()))
87*5db4956bSzhanglyGit  val dataSources = Output(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
88*5db4956bSzhanglyGit  val srcWakeUpL1ExuOH = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec()))))
89*5db4956bSzhanglyGit  val srcTimer = OptionWrapper(params.hasIQWakeUp, Output(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
90*5db4956bSzhanglyGit  //enq
91*5db4956bSzhanglyGit  val enq = Vec(params.numEnq, Flipped(ValidIO(new EntryBundle)))
92*5db4956bSzhanglyGit  // wakeup
93*5db4956bSzhanglyGit  val wakeUpFromWB: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = Flipped(params.genWBWakeUpSinkValidBundle)
94*5db4956bSzhanglyGit  val wakeUpFromIQ: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpSinkValidBundle)
95*5db4956bSzhanglyGit  val og0Cancel = Input(ExuVec(backendParams.numExu))
96*5db4956bSzhanglyGit  val og1Cancel = Input(ExuVec(backendParams.numExu))
97*5db4956bSzhanglyGit  //deq
98*5db4956bSzhanglyGit  val deq = Vec(params.numDeq, new DeqBundle)
99*5db4956bSzhanglyGit  val deqResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
100*5db4956bSzhanglyGit  val og0Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
101*5db4956bSzhanglyGit  val og1Resp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
102*5db4956bSzhanglyGit  val transEntryDeqVec = Vec(params.numEnq, ValidIO(new EntryBundle))
103*5db4956bSzhanglyGit  val deqEntry = Vec(params.numDeq, ValidIO(new EntryBundle))
104*5db4956bSzhanglyGit  val transSelVec = Output(Vec(params.numEnq, UInt((params.numEntries-params.numEnq).W)))
105*5db4956bSzhanglyGit
106*5db4956bSzhanglyGit
107*5db4956bSzhanglyGit  val rsFeedback = Output(Vec(5, Bool()))
108*5db4956bSzhanglyGit  // mem only
109*5db4956bSzhanglyGit  val fromMem = if (params.isMemAddrIQ) Some(new Bundle {
110*5db4956bSzhanglyGit    val stIssuePtr = Input(new SqPtr)
111*5db4956bSzhanglyGit    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
112*5db4956bSzhanglyGit    val slowResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
113*5db4956bSzhanglyGit    val fastResp = Vec(params.numDeq, Flipped(ValidIO(new EntryDeqRespBundle)))
114*5db4956bSzhanglyGit  }) else None
115*5db4956bSzhanglyGit
116*5db4956bSzhanglyGit  def wakeup = wakeUpFromWB ++ wakeUpFromIQ
117*5db4956bSzhanglyGit}
118*5db4956bSzhanglyGit
119*5db4956bSzhanglyGitclass Entries(implicit p: Parameters, params: IssueBlockParams) extends XSModule {
120*5db4956bSzhanglyGit  private val EnqEntryNum = params.numEnq
121*5db4956bSzhanglyGit  private val OthersEntryNum = params.numEntries - params.numEnq
122*5db4956bSzhanglyGit  val io = IO(new EntriesIO)
123*5db4956bSzhanglyGit
124*5db4956bSzhanglyGit  val resps: Vec[Vec[ValidIO[EntryDeqRespBundle]]] = if(params.isMemAddrIQ) VecInit(io.deqResp, io.og0Resp, io.og1Resp, io.fromMem.get.fastResp, io.fromMem.get.slowResp)
125*5db4956bSzhanglyGit                                                     else VecInit(io.deqResp, io.og0Resp, io.og1Resp, 0.U.asTypeOf(io.deqResp))
126*5db4956bSzhanglyGit
127*5db4956bSzhanglyGit  //Module
128*5db4956bSzhanglyGit  val enqEntries = Seq.fill(EnqEntryNum)(Module(EnqEntry(p, params)))
129*5db4956bSzhanglyGit  val othersEntries = Seq.fill(OthersEntryNum)(Module(OthersEntry(p, params)))
130*5db4956bSzhanglyGit  val transPolicy = Module(new EnqPolicy)
131*5db4956bSzhanglyGit
132*5db4956bSzhanglyGit  //Wire
133*5db4956bSzhanglyGit  val deqSelVec = Wire(Vec(params.numEntries, Bool()))
134*5db4956bSzhanglyGit  val transSelVec = Wire(Vec(EnqEntryNum, Vec(OthersEntryNum, Bool())))
135*5db4956bSzhanglyGit  val issueRespVec = Wire(Vec(params.numEntries, ValidIO(new EntryDeqRespBundle)))
136*5db4956bSzhanglyGit  val transEntryDeqVec = Wire(Vec(EnqEntryNum, ValidIO(new EntryBundle)))
137*5db4956bSzhanglyGit  val transEntryEnqVec = Wire(Vec(OthersEntryNum, ValidIO(new EntryBundle)))
138*5db4956bSzhanglyGit  val entries = Wire(Vec(params.numEntries, ValidIO(new EntryBundle)))
139*5db4956bSzhanglyGit
140*5db4956bSzhanglyGit  val validVec = Wire(Vec(params.numEntries, Bool()))
141*5db4956bSzhanglyGit  val canIssueVec = Wire(Vec(params.numEntries, Bool()))
142*5db4956bSzhanglyGit  val clearVec = Wire(Vec(params.numEntries, Bool()))
143*5db4956bSzhanglyGit  val fuTypeVec = Wire(Vec(params.numEntries, FuType()))
144*5db4956bSzhanglyGit  val dataSourceVec = Wire(Vec(params.numEntries, Vec(params.numRegSrc, DataSource())))
145*5db4956bSzhanglyGit  val srcWakeUpL1ExuOHVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, ExuVec()))))
146*5db4956bSzhanglyGit  val srcTimerVec = OptionWrapper(params.hasIQWakeUp, Wire(Vec(params.numEntries, Vec(params.numRegSrc, UInt(3.W)))))
147*5db4956bSzhanglyGit  val isFirstIssueVec = Wire(Vec(params.numEntries, Bool()))
148*5db4956bSzhanglyGit  val robIdxVec = Wire(Vec(params.numEntries, new RobPtr))
149*5db4956bSzhanglyGit  val issueTimerVec = Wire(Vec(params.numEntries, UInt(2.W)))
150*5db4956bSzhanglyGit  val deqPortIdxWriteVec = Wire(Vec(params.numEntries, UInt(1.W)))
151*5db4956bSzhanglyGit  val deqPortIdxReadVec = Wire(Vec(params.numEntries, UInt(1.W)))
152*5db4956bSzhanglyGit
153*5db4956bSzhanglyGit  io.transEntryDeqVec := transEntryDeqVec
154*5db4956bSzhanglyGit
155*5db4956bSzhanglyGit  //enqEntries
156*5db4956bSzhanglyGit  enqEntries.zipWithIndex.foreach { case (enqEntry, entryIdx) =>
157*5db4956bSzhanglyGit    enqEntry.io.enq := io.enq(entryIdx)
158*5db4956bSzhanglyGit    enqEntry.io.flush := io.flush
159*5db4956bSzhanglyGit    enqEntry.io.wakeUpFromWB := io.wakeUpFromWB
160*5db4956bSzhanglyGit    enqEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
161*5db4956bSzhanglyGit    enqEntry.io.og0Cancel := io.og0Cancel
162*5db4956bSzhanglyGit    enqEntry.io.og1Cancel := io.og1Cancel
163*5db4956bSzhanglyGit    enqEntry.io.deqSel := deqSelVec(entryIdx)
164*5db4956bSzhanglyGit    enqEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx)
165*5db4956bSzhanglyGit    enqEntry.io.transSel := transSelVec(entryIdx).asUInt.orR
166*5db4956bSzhanglyGit    enqEntry.io.issueResp := issueRespVec(entryIdx)
167*5db4956bSzhanglyGit    validVec(entryIdx) := enqEntry.io.valid
168*5db4956bSzhanglyGit    canIssueVec(entryIdx) := enqEntry.io.canIssue
169*5db4956bSzhanglyGit    clearVec(entryIdx) := enqEntry.io.clear
170*5db4956bSzhanglyGit    fuTypeVec(entryIdx) := enqEntry.io.fuType
171*5db4956bSzhanglyGit    dataSourceVec(entryIdx) := enqEntry.io.dataSource
172*5db4956bSzhanglyGit    robIdxVec(entryIdx) := enqEntry.io.robIdx
173*5db4956bSzhanglyGit    issueTimerVec(entryIdx) := enqEntry.io.issueTimerRead
174*5db4956bSzhanglyGit    deqPortIdxReadVec(entryIdx) := enqEntry.io.deqPortIdxRead
175*5db4956bSzhanglyGit    if(params.hasIQWakeUp){
176*5db4956bSzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx) := enqEntry.io.srcWakeUpL1ExuOH.get
177*5db4956bSzhanglyGit      srcTimerVec.get(entryIdx) := enqEntry.io.srcTimer.get
178*5db4956bSzhanglyGit    }
179*5db4956bSzhanglyGit    transEntryDeqVec(entryIdx) := enqEntry.io.transEntry
180*5db4956bSzhanglyGit    isFirstIssueVec(entryIdx) := enqEntry.io.isFirstIssue
181*5db4956bSzhanglyGit    entries(entryIdx) := enqEntry.io.entry
182*5db4956bSzhanglyGit    //for mem
183*5db4956bSzhanglyGit    if(params.isMemAddrIQ) {
184*5db4956bSzhanglyGit      enqEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
185*5db4956bSzhanglyGit      enqEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
186*5db4956bSzhanglyGit    }
187*5db4956bSzhanglyGit
188*5db4956bSzhanglyGit  }
189*5db4956bSzhanglyGit  //othersEntries
190*5db4956bSzhanglyGit  othersEntries.zipWithIndex.foreach { case (othersEntry, entryIdx) =>
191*5db4956bSzhanglyGit    othersEntry.io.enq := transEntryEnqVec(entryIdx)
192*5db4956bSzhanglyGit    othersEntry.io.flush := io.flush
193*5db4956bSzhanglyGit    othersEntry.io.wakeUpFromWB := io.wakeUpFromWB
194*5db4956bSzhanglyGit    othersEntry.io.wakeUpFromIQ := io.wakeUpFromIQ
195*5db4956bSzhanglyGit    othersEntry.io.og0Cancel := io.og0Cancel
196*5db4956bSzhanglyGit    othersEntry.io.og1Cancel := io.og1Cancel
197*5db4956bSzhanglyGit    othersEntry.io.deqSel := deqSelVec(entryIdx + EnqEntryNum)
198*5db4956bSzhanglyGit    othersEntry.io.deqPortIdxWrite := deqPortIdxWriteVec(entryIdx + EnqEntryNum)
199*5db4956bSzhanglyGit    othersEntry.io.transSel := transSelVec.map(x => x(entryIdx)).reduce(_ | _)
200*5db4956bSzhanglyGit    othersEntry.io.issueResp := issueRespVec(entryIdx + EnqEntryNum)
201*5db4956bSzhanglyGit    validVec(entryIdx + EnqEntryNum) := othersEntry.io.valid
202*5db4956bSzhanglyGit    canIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.canIssue
203*5db4956bSzhanglyGit    clearVec(entryIdx + EnqEntryNum) := othersEntry.io.clear
204*5db4956bSzhanglyGit    fuTypeVec(entryIdx + EnqEntryNum) := othersEntry.io.fuType
205*5db4956bSzhanglyGit    dataSourceVec(entryIdx + EnqEntryNum) := othersEntry.io.dataSource
206*5db4956bSzhanglyGit    robIdxVec(entryIdx + EnqEntryNum) := othersEntry.io.robIdx
207*5db4956bSzhanglyGit    issueTimerVec(entryIdx + EnqEntryNum) := othersEntry.io.issueTimerRead
208*5db4956bSzhanglyGit    deqPortIdxReadVec(entryIdx + EnqEntryNum) := othersEntry.io.deqPortIdxRead
209*5db4956bSzhanglyGit    if (params.hasIQWakeUp) {
210*5db4956bSzhanglyGit      srcWakeUpL1ExuOHVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcWakeUpL1ExuOH.get
211*5db4956bSzhanglyGit      srcTimerVec.get(entryIdx + EnqEntryNum) := othersEntry.io.srcTimer.get
212*5db4956bSzhanglyGit    }
213*5db4956bSzhanglyGit    isFirstIssueVec(entryIdx + EnqEntryNum) := othersEntry.io.isFirstIssue
214*5db4956bSzhanglyGit    entries(entryIdx + EnqEntryNum) := othersEntry.io.entry
215*5db4956bSzhanglyGit    //for mem
216*5db4956bSzhanglyGit    if (params.isMemAddrIQ) {
217*5db4956bSzhanglyGit      othersEntry.io.fromMem.get.stIssuePtr := io.fromMem.get.stIssuePtr
218*5db4956bSzhanglyGit      othersEntry.io.fromMem.get.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
219*5db4956bSzhanglyGit    }
220*5db4956bSzhanglyGit
221*5db4956bSzhanglyGit  }
222*5db4956bSzhanglyGit
223*5db4956bSzhanglyGit
224*5db4956bSzhanglyGit  deqSelVec.zip(deqPortIdxWriteVec).zipWithIndex.foreach { case ((deqSel, deqPortIdxWrite), i) =>
225*5db4956bSzhanglyGit    val deqVec = io.deq.map(x => x.deqSelOH.valid && x.deqSelOH.bits(i))
226*5db4956bSzhanglyGit    deqPortIdxWrite := OHToUInt(deqVec)
227*5db4956bSzhanglyGit    deqSel := deqVec.reduce(_ | _)
228*5db4956bSzhanglyGit  }
229*5db4956bSzhanglyGit
230*5db4956bSzhanglyGit
231*5db4956bSzhanglyGit  //transPolicy
232*5db4956bSzhanglyGit  transPolicy.io.valid := VecInit(validVec.slice(EnqEntryNum, params.numEntries)).asUInt
233*5db4956bSzhanglyGit  transSelVec.zip(transPolicy.io.enqSelOHVec).foreach { case (selBools, selOH) =>
234*5db4956bSzhanglyGit    selBools.zipWithIndex.foreach { case (selBool, i) =>
235*5db4956bSzhanglyGit      selBool := transPolicy.io.enqSelOHVec.map(_.valid).reduce(_ & _) && selOH.bits(i)
236*5db4956bSzhanglyGit    }
237*5db4956bSzhanglyGit  }
238*5db4956bSzhanglyGit
239*5db4956bSzhanglyGit  //transEntryEnq
240*5db4956bSzhanglyGit  transEntryEnqVec.zipWithIndex.foreach { case (transEntryEnq, othersIdx) =>
241*5db4956bSzhanglyGit    val transEnqHit = transSelVec.map(x => x(othersIdx))
242*5db4956bSzhanglyGit    transEntryEnq := Mux1H(transEnqHit, transEntryDeqVec)
243*5db4956bSzhanglyGit  }
244*5db4956bSzhanglyGit  dontTouch(transEntryEnqVec)
245*5db4956bSzhanglyGit
246*5db4956bSzhanglyGit  //issueRespVec
247*5db4956bSzhanglyGit  if(params.isMemAddrIQ){
248*5db4956bSzhanglyGit    issueRespVec.zip(robIdxVec).foreach { case (issueResp, robIdx) =>
249*5db4956bSzhanglyGit      val hitRespsVec = VecInit(resps.flatten.map(x => x.valid && (x.bits.robIdx === robIdx)))
250*5db4956bSzhanglyGit      issueResp.valid := hitRespsVec.reduce(_ | _)
251*5db4956bSzhanglyGit      issueResp.bits := Mux1H(hitRespsVec, resps.flatten.map(_.bits))
252*5db4956bSzhanglyGit    }
253*5db4956bSzhanglyGit  }
254*5db4956bSzhanglyGit  else {
255*5db4956bSzhanglyGit    issueRespVec.zip(issueTimerVec).zip(deqPortIdxReadVec).foreach { case ((issueResp, issueTimer), deqPortIdx) =>
256*5db4956bSzhanglyGit      val Resp = resps(issueTimer)(deqPortIdx)
257*5db4956bSzhanglyGit      issueResp := Resp
258*5db4956bSzhanglyGit    }
259*5db4956bSzhanglyGit  }
260*5db4956bSzhanglyGit
261*5db4956bSzhanglyGit  io.valid := validVec.asUInt
262*5db4956bSzhanglyGit  io.canIssue := canIssueVec.asUInt
263*5db4956bSzhanglyGit  io.clear := clearVec.asUInt
264*5db4956bSzhanglyGit  io.fuType := fuTypeVec
265*5db4956bSzhanglyGit  io.dataSources := dataSourceVec
266*5db4956bSzhanglyGit  io.srcWakeUpL1ExuOH.foreach(_ := srcWakeUpL1ExuOHVec.get)
267*5db4956bSzhanglyGit  io.srcTimer.foreach(_ := srcTimerVec.get)
268*5db4956bSzhanglyGit  io.rsFeedback := 0.U.asTypeOf(io.rsFeedback) //todo
269*5db4956bSzhanglyGit  io.deq.foreach{ x =>
270*5db4956bSzhanglyGit    x.isFirstIssue := Mux(x.deqSelOH.valid, Mux1H(x.deqSelOH.bits, isFirstIssueVec), false.B)
271*5db4956bSzhanglyGit  }
272*5db4956bSzhanglyGit  dontTouch(io.deq)
273*5db4956bSzhanglyGit  io.deqEntry.zip(io.deq.map(_.deqSelOH)).foreach{ case (deqEntry, deqSelOH) =>
274*5db4956bSzhanglyGit    deqEntry.valid := deqSelOH.valid && entries(OHToUInt(deqSelOH.bits)).valid
275*5db4956bSzhanglyGit    deqEntry.bits := entries(OHToUInt(deqSelOH.bits)).bits
276*5db4956bSzhanglyGit  }
277*5db4956bSzhanglyGit  io.transSelVec.zip(transSelVec).foreach { case (sink, source) =>
278*5db4956bSzhanglyGit    sink := source.asUInt
279*5db4956bSzhanglyGit  }
280*5db4956bSzhanglyGit}