xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 7f8233d5a8887332319d249b84f17f57e5c5dd26)
1730cfbc0SXuan Hupackage xiangshan.backend.issue
2730cfbc0SXuan Hu
3730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters
4730cfbc0SXuan Huimport chisel3._
5730cfbc0SXuan Huimport chisel3.util._
6730cfbc0SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp}
7730cfbc0SXuan Huimport xiangshan._
810fe9778SXuan Huimport xiangshan.backend.Bundles._
939c59369SXuan Huimport xiangshan.backend.datapath.DataConfig.{IntData, VAddrData, VecData}
1039c59369SXuan Huimport xiangshan.backend.datapath.WbConfig.{IntWB, VfWB}
11730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig
12730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable
13730cfbc0SXuan Huimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr}
14730cfbc0SXuan Hu
15730cfbc0SXuan Husealed trait SchedulerType
16730cfbc0SXuan Hu
17730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType
18730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType
19730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType
20730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType
21730cfbc0SXuan Hu
22730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
2339c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
2439c59369SXuan Hu  val numVfStateWrite = backendParams.numPregWb(VecData())
25730cfbc0SXuan Hu
26730cfbc0SXuan Hu  val dispatch2Iq = LazyModule(new Dispatch2Iq(params))
27730cfbc0SXuan Hu  val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName)))
28730cfbc0SXuan Hu
29730cfbc0SXuan Hu  lazy val module = params.schdType match {
30730cfbc0SXuan Hu    case IntScheduler() => new SchedulerArithImp(this)(params, p)
31730cfbc0SXuan Hu    case MemScheduler() => new SchedulerMemImp(this)(params, p)
32730cfbc0SXuan Hu    case VfScheduler() => new SchedulerArithImp(this)(params, p)
33730cfbc0SXuan Hu    case _ => null
34730cfbc0SXuan Hu  }
35730cfbc0SXuan Hu}
36730cfbc0SXuan Hu
37*7f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle {
3868d13085SXuan Hu  // params alias
39*7f8233d5SHaojin Tang  private val LoadQueueSize = VirtualLoadQueueSize
4068d13085SXuan Hu
41730cfbc0SXuan Hu  val fromTop = new Bundle {
42730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
43730cfbc0SXuan Hu  }
442e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
452e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
462e0a7dc5Sfdy  }
47dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
48dd970561SzhanglyGit
49730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
50730cfbc0SXuan Hu    val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
51730cfbc0SXuan Hu    val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
52730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
53730cfbc0SXuan Hu  }
54730cfbc0SXuan Hu  val fromDispatch = new Bundle {
55730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
56730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
57730cfbc0SXuan Hu  }
5839c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
59730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
6039c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
61730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
6210fe9778SXuan Hu  val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
6359ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
6459ef6009Sxiaofeibao-xjtu  val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)))
65730cfbc0SXuan Hu
66bf35baadSXuan Hu  val fromSchedulers = new Bundle {
67c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
68bf35baadSXuan Hu  }
69bf35baadSXuan Hu
70bf35baadSXuan Hu  val toSchedulers = new Bundle {
71c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
72bf35baadSXuan Hu  }
73bf35baadSXuan Hu
74c0be7f33SXuan Hu  val fromDataPath = new Bundle {
7510fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
76ea46c302SXuan Hu    val og0Cancel = Input(ExuVec(backendParams.numExu))
77ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
78ea46c302SXuan Hu    val og1Cancel = Input(ExuVec(backendParams.numExu))
79c0be7f33SXuan Hu    // just be compatible to old code
80c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
81c0be7f33SXuan Hu  }
82c0be7f33SXuan Hu
83c0be7f33SXuan Hu
84730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
85730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
86730cfbc0SXuan Hu  }) else None
87730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
887b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
897b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
90730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
91730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
92730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
93730cfbc0SXuan Hu    // from lsq
94730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
95730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
96730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
97730cfbc0SXuan Hu  }) else None
98730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
99730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
100730cfbc0SXuan Hu  }) else None
101730cfbc0SXuan Hu}
102730cfbc0SXuan Hu
103730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
104730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
105730cfbc0SXuan Hu    with HasXSParameter
106730cfbc0SXuan Hu{
107730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
108730cfbc0SXuan Hu
109730cfbc0SXuan Hu  // alias
110c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
111c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
112730cfbc0SXuan Hu  private val schdType = params.schdType
113730cfbc0SXuan Hu
114730cfbc0SXuan Hu  // Modules
115730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
116730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
117730cfbc0SXuan Hu
118730cfbc0SXuan Hu  // BusyTable Modules
119730cfbc0SXuan Hu  val intBusyTable = schdType match {
12039c59369SXuan Hu    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs)))
121730cfbc0SXuan Hu    case _ => None
122730cfbc0SXuan Hu  }
123730cfbc0SXuan Hu
124730cfbc0SXuan Hu  val vfBusyTable = schdType match {
12539c59369SXuan Hu    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs)))
126730cfbc0SXuan Hu    case _ => None
127730cfbc0SXuan Hu  }
128730cfbc0SXuan Hu
129730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
130730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
131730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
132730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
133730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
134730cfbc0SXuan Hu  }
135730cfbc0SXuan Hu
136730cfbc0SXuan Hu  intBusyTable match {
137730cfbc0SXuan Hu    case Some(bt) =>
138730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
139730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
140730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
141730cfbc0SXuan Hu      }
142730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
143730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
144730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
145730cfbc0SXuan Hu      }
146730cfbc0SXuan Hu    case None =>
147730cfbc0SXuan Hu  }
148730cfbc0SXuan Hu
149730cfbc0SXuan Hu  vfBusyTable match {
150730cfbc0SXuan Hu    case Some(bt) =>
151730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
152730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
153730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
154730cfbc0SXuan Hu      }
155730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
156730cfbc0SXuan Hu        wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen)
157730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
158730cfbc0SXuan Hu      }
159730cfbc0SXuan Hu    case None =>
160730cfbc0SXuan Hu  }
161730cfbc0SXuan Hu
162c0be7f33SXuan Hu  val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle)
163730cfbc0SXuan Hu  val writeback = params.schdType match {
164730cfbc0SXuan Hu    case IntScheduler() => io.intWriteBack
165730cfbc0SXuan Hu    case MemScheduler() => io.intWriteBack ++ io.vfWriteBack
166730cfbc0SXuan Hu    case VfScheduler() => io.vfWriteBack
167730cfbc0SXuan Hu    case _ => Seq()
168730cfbc0SXuan Hu  }
169730cfbc0SXuan Hu  wakeupFromWBVec.zip(writeback).foreach { case (sink, source) =>
170730cfbc0SXuan Hu    sink.valid := source.wen
171730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
172730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
173730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
174730cfbc0SXuan Hu    sink.bits.pdest := source.addr
175730cfbc0SXuan Hu  }
176730cfbc0SXuan Hu
177bf35baadSXuan Hu  // Connect bundles having the same wakeup source
17859ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
179bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
180c0be7f33SXuan Hu      wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx)
181bf35baadSXuan Hu    }
182ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
183ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
18459ef6009Sxiaofeibao-xjtu    iq.io.fromCancelNetwork <> io.fromCancelNetwork(i)
185bf35baadSXuan Hu  }
186bf35baadSXuan Hu
187c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
188bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
189c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
190bf35baadSXuan Hu      .toMap
191bf35baadSXuan Hu
192bf35baadSXuan Hu  // Connect bundles having the same wakeup source
193bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
194c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
195bf35baadSXuan Hu  }
196bf35baadSXuan Hu
197730cfbc0SXuan Hu  io.toDataPath.zipWithIndex.foreach { case (toDp, i) =>
198730cfbc0SXuan Hu    toDp <> issueQueues(i).io.deq
199730cfbc0SXuan Hu  }
20059ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
20159ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
20259ef6009Sxiaofeibao-xjtu  }
203bf35baadSXuan Hu
204c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
205bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
206bf35baadSXuan Hu
207bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
208c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
209730cfbc0SXuan Hu}
210730cfbc0SXuan Hu
211730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
212730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
213730cfbc0SXuan Hu    with HasXSParameter
214730cfbc0SXuan Hu{
2152e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
216730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
217730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
218730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
219730cfbc0SXuan Hu
220730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
221730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
222730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
223bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
224730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
225ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
226ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
2275db4956bSzhanglyGit      deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx
2288d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2298d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2308d29ec32Sczw
231730cfbc0SXuan Hu    }
232730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
233730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
234730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
2355db4956bSzhanglyGit      og0Resp.bits.robIdx := io.fromDataPath(i)(j).og0resp.bits.robIdx
2368d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2378d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2388d29ec32Sczw
239730cfbc0SXuan Hu    }
240730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
241730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
242730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
2435db4956bSzhanglyGit      og1Resp.bits.robIdx := io.fromDataPath(i)(j).og1resp.bits.robIdx
2448d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
2458d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
2468d29ec32Sczw
247730cfbc0SXuan Hu    }
2482e0a7dc5Sfdy
2492e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
250dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
251730cfbc0SXuan Hu  }
252730cfbc0SXuan Hu
253730cfbc0SXuan Hu  val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map {
254730cfbc0SXuan Hu    case imp: IssueQueueIntImp => imp.io.enqJmp
255730cfbc0SXuan Hu    case _ => None
256730cfbc0SXuan Hu  }.filter(_.nonEmpty).flatMap(_.get)
257730cfbc0SXuan Hu  println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}")
258730cfbc0SXuan Hu
259730cfbc0SXuan Hu  iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) =>
260730cfbc0SXuan Hu    iqJmp.pc := pc
261730cfbc0SXuan Hu    iqJmp.target := target
262730cfbc0SXuan Hu  }
263730cfbc0SXuan Hu}
264730cfbc0SXuan Hu
265730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
266730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
267730cfbc0SXuan Hu    with HasXSParameter
268730cfbc0SXuan Hu{
269730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
270730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
271730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
272730cfbc0SXuan Hu
273730cfbc0SXuan Hu  val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0)
274730cfbc0SXuan Hu  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
2757b753bebSXuan Hu  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
276730cfbc0SXuan Hu  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
277730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
278730cfbc0SXuan Hu
279730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
280730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
281ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
282ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
2835db4956bSzhanglyGit      deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx
2848d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2858d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2868d29ec32Sczw
287730cfbc0SXuan Hu    }
288730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
289730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
290730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
2915db4956bSzhanglyGit      og0Resp.bits.robIdx := io.fromDataPath(i)(j).og0resp.bits.robIdx
2928d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2938d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2948d29ec32Sczw
295730cfbc0SXuan Hu    }
296730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
297730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
298730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
2995db4956bSzhanglyGit      og1Resp.bits.robIdx := io.fromDataPath(i)(j).og1resp.bits.robIdx
3008d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
3018d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
3028d29ec32Sczw
303730cfbc0SXuan Hu    }
3042e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
305dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
306730cfbc0SXuan Hu  }
307730cfbc0SXuan Hu
308730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
309730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
310730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
311bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
312730cfbc0SXuan Hu  }
313730cfbc0SXuan Hu
3147b753bebSXuan Hu  ldAddrIQs.foreach {
315de784418SXuan Hu    case imp: IssueQueueMemAddrImp =>
316de784418SXuan Hu      imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback
317de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
3187b753bebSXuan Hu    case _ =>
3197b753bebSXuan Hu  }
3207b753bebSXuan Hu
3217b753bebSXuan Hu  stAddrIQs.foreach {
3227b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback
3237b753bebSXuan Hu    case _ =>
3247b753bebSXuan Hu  }
325730cfbc0SXuan Hu
3269b258a00Sxgkiri  private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk)
3279b258a00Sxgkiri
3289b258a00Sxgkiri  for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) {
3299b258a00Sxgkiri    dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) =>
330730cfbc0SXuan Hu      val isAllReady = staIQ.ready && stdIQ.ready
331730cfbc0SXuan Hu      di.ready := isAllReady
332730cfbc0SXuan Hu      staIQ.valid := di.valid && isAllReady
333730cfbc0SXuan Hu      stdIQ.valid := di.valid && isAllReady
334730cfbc0SXuan Hu    }
3359b258a00Sxgkiri  }
336730cfbc0SXuan Hu
337730cfbc0SXuan Hu  require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " +
338730cfbc0SXuan Hu    s"should be equal to number of data IQs(${stDataIQs})")
339730cfbc0SXuan Hu  stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) =>
340730cfbc0SXuan Hu    stdIQ.io.flush <> io.fromCtrlBlock.flush
341730cfbc0SXuan Hu
342730cfbc0SXuan Hu    stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) =>
343730cfbc0SXuan Hu      stdIQEnq.bits  := staIQEnq.bits
344730cfbc0SXuan Hu      // Store data reuses store addr src(1) in dispatch2iq
345730cfbc0SXuan Hu      // [dispatch2iq] --src*------src*(0)--> [staIQ]
346730cfbc0SXuan Hu      //                       \
347730cfbc0SXuan Hu      //                        ---src*(1)--> [stdIQ]
348730cfbc0SXuan Hu      // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
349730cfbc0SXuan Hu      // instead of dispatch2Iq.io.out(x).bits.src*(1)
350730cfbc0SXuan Hu      stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1)
351730cfbc0SXuan Hu      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1)
352730cfbc0SXuan Hu      stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1)
353730cfbc0SXuan Hu      stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
354730cfbc0SXuan Hu    }
355bf35baadSXuan Hu    stdIQ.io.wakeupFromWB := wakeupFromWBVec
356730cfbc0SXuan Hu  }
357730cfbc0SXuan Hu
358730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
359730cfbc0SXuan Hu
360730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
361730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
362730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
363730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
364730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
365730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
366730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
367730cfbc0SXuan Hu}
368