xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 39c59369af6e7d78fa72e13aae3735f1a6e98f5c)
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._
9*39c59369SXuan Huimport xiangshan.backend.datapath.DataConfig.{IntData, VAddrData, VecData}
10*39c59369SXuan 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 {
23*39c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
24*39c59369SXuan 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
37ea46c302SXuan Huclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends Bundle {
3868d13085SXuan Hu  // params alias
39ea46c302SXuan Hu  private val backendParams = params.backendParam
40ea46c302SXuan Hu  private val LoadQueueSize = p(XSCoreParamsKey).VirtualLoadQueueSize
41ea46c302SXuan Hu  private val RenameWidth = p(XSCoreParamsKey).RenameWidth
42ea46c302SXuan Hu  private val CommitWidth = p(XSCoreParamsKey).CommitWidth
43ea46c302SXuan Hu  private val EnsbufferWidth = p(XSCoreParamsKey).EnsbufferWidth
44ea46c302SXuan Hu  private val StoreQueueSize = p(XSCoreParamsKey).StoreQueueSize
4568d13085SXuan Hu
46730cfbc0SXuan Hu  val fromTop = new Bundle {
47730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
48730cfbc0SXuan Hu  }
492e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
502e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
512e0a7dc5Sfdy  }
52dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
53dd970561SzhanglyGit
54730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
55730cfbc0SXuan Hu    val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
56730cfbc0SXuan Hu    val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
57730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
58730cfbc0SXuan Hu  }
59730cfbc0SXuan Hu  val fromDispatch = new Bundle {
60730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
61730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
62730cfbc0SXuan Hu  }
63*39c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
64730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
65*39c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
66730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
6710fe9778SXuan Hu  val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
6859ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
6959ef6009Sxiaofeibao-xjtu  val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)))
70730cfbc0SXuan Hu
71bf35baadSXuan Hu  val fromSchedulers = new Bundle {
72c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
73bf35baadSXuan Hu  }
74bf35baadSXuan Hu
75bf35baadSXuan Hu  val toSchedulers = new Bundle {
76c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
77bf35baadSXuan Hu  }
78bf35baadSXuan Hu
79c0be7f33SXuan Hu  val fromDataPath = new Bundle {
8010fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
81ea46c302SXuan Hu    val og0Cancel = Input(ExuVec(backendParams.numExu))
82ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
83ea46c302SXuan Hu    val og1Cancel = Input(ExuVec(backendParams.numExu))
84c0be7f33SXuan Hu    // just be compatible to old code
85c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
86c0be7f33SXuan Hu  }
87c0be7f33SXuan Hu
88c0be7f33SXuan Hu
89730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
90730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
91730cfbc0SXuan Hu  }) else None
92730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
937b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
947b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
95730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
96730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
97730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
98730cfbc0SXuan Hu    // from lsq
99730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
100730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
101730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
102730cfbc0SXuan Hu  }) else None
103730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
104730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
105730cfbc0SXuan Hu  }) else None
106730cfbc0SXuan Hu}
107730cfbc0SXuan Hu
108730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
109730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
110730cfbc0SXuan Hu    with HasXSParameter
111730cfbc0SXuan Hu{
112730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
113730cfbc0SXuan Hu
114730cfbc0SXuan Hu  // alias
115c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
116c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
117730cfbc0SXuan Hu  private val schdType = params.schdType
118730cfbc0SXuan Hu
119730cfbc0SXuan Hu  // Modules
120730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
121730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
122730cfbc0SXuan Hu
123730cfbc0SXuan Hu  // BusyTable Modules
124730cfbc0SXuan Hu  val intBusyTable = schdType match {
125*39c59369SXuan Hu    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs)))
126730cfbc0SXuan Hu    case _ => None
127730cfbc0SXuan Hu  }
128730cfbc0SXuan Hu
129730cfbc0SXuan Hu  val vfBusyTable = schdType match {
130*39c59369SXuan Hu    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs)))
131730cfbc0SXuan Hu    case _ => None
132730cfbc0SXuan Hu  }
133730cfbc0SXuan Hu
134730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
135730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
136730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
137730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
138730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
139730cfbc0SXuan Hu  }
140730cfbc0SXuan Hu
141730cfbc0SXuan Hu  intBusyTable match {
142730cfbc0SXuan Hu    case Some(bt) =>
143730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
144730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
145730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
146730cfbc0SXuan Hu      }
147730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
148730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
149730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
150730cfbc0SXuan Hu      }
151730cfbc0SXuan Hu    case None =>
152730cfbc0SXuan Hu  }
153730cfbc0SXuan Hu
154730cfbc0SXuan Hu  vfBusyTable match {
155730cfbc0SXuan Hu    case Some(bt) =>
156730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
157730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
158730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
159730cfbc0SXuan Hu      }
160730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
161730cfbc0SXuan Hu        wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen)
162730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
163730cfbc0SXuan Hu      }
164730cfbc0SXuan Hu    case None =>
165730cfbc0SXuan Hu  }
166730cfbc0SXuan Hu
167c0be7f33SXuan Hu  val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle)
168730cfbc0SXuan Hu  val writeback = params.schdType match {
169730cfbc0SXuan Hu    case IntScheduler() => io.intWriteBack
170730cfbc0SXuan Hu    case MemScheduler() => io.intWriteBack ++ io.vfWriteBack
171730cfbc0SXuan Hu    case VfScheduler() => io.vfWriteBack
172730cfbc0SXuan Hu    case _ => Seq()
173730cfbc0SXuan Hu  }
174730cfbc0SXuan Hu  wakeupFromWBVec.zip(writeback).foreach { case (sink, source) =>
175730cfbc0SXuan Hu    sink.valid := source.wen
176730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
177730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
178730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
179730cfbc0SXuan Hu    sink.bits.pdest := source.addr
180730cfbc0SXuan Hu  }
181730cfbc0SXuan Hu
182bf35baadSXuan Hu  // Connect bundles having the same wakeup source
18359ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
184bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
185c0be7f33SXuan Hu      wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx)
186bf35baadSXuan Hu    }
187ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
188ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
18959ef6009Sxiaofeibao-xjtu    iq.io.fromCancelNetwork <> io.fromCancelNetwork(i)
190bf35baadSXuan Hu  }
191bf35baadSXuan Hu
192c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
193bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
194c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
195bf35baadSXuan Hu      .toMap
196bf35baadSXuan Hu
197bf35baadSXuan Hu  // Connect bundles having the same wakeup source
198bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
199c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
200bf35baadSXuan Hu  }
201bf35baadSXuan Hu
202730cfbc0SXuan Hu  io.toDataPath.zipWithIndex.foreach { case (toDp, i) =>
203730cfbc0SXuan Hu    toDp <> issueQueues(i).io.deq
204730cfbc0SXuan Hu  }
20559ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
20659ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
20759ef6009Sxiaofeibao-xjtu  }
208bf35baadSXuan Hu
209c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
210bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
211bf35baadSXuan Hu
212bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
213c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
214730cfbc0SXuan Hu}
215730cfbc0SXuan Hu
216730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
217730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
218730cfbc0SXuan Hu    with HasXSParameter
219730cfbc0SXuan Hu{
2202e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
221730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
222730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
223730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
224730cfbc0SXuan Hu
225730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
226730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
227730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
228bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
229730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
230ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
231ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
232730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
2338d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2348d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2358d29ec32Sczw
236730cfbc0SXuan Hu    }
237730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
238730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
239730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
240730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
2418d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2428d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2438d29ec32Sczw
244730cfbc0SXuan Hu    }
245730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
246730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
247730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
248730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
2498d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
2508d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
2518d29ec32Sczw
252730cfbc0SXuan Hu    }
2532e0a7dc5Sfdy
2542e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
255dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
256730cfbc0SXuan Hu  }
257730cfbc0SXuan Hu
258730cfbc0SXuan Hu  val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map {
259730cfbc0SXuan Hu    case imp: IssueQueueIntImp => imp.io.enqJmp
260730cfbc0SXuan Hu    case _ => None
261730cfbc0SXuan Hu  }.filter(_.nonEmpty).flatMap(_.get)
262730cfbc0SXuan Hu  println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}")
263730cfbc0SXuan Hu
264730cfbc0SXuan Hu  iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) =>
265730cfbc0SXuan Hu    iqJmp.pc := pc
266730cfbc0SXuan Hu    iqJmp.target := target
267730cfbc0SXuan Hu  }
268730cfbc0SXuan Hu}
269730cfbc0SXuan Hu
270730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
271730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
272730cfbc0SXuan Hu    with HasXSParameter
273730cfbc0SXuan Hu{
274730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
275730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
276730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
277730cfbc0SXuan Hu
278730cfbc0SXuan Hu  val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0)
279730cfbc0SXuan Hu  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
2807b753bebSXuan Hu  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
281730cfbc0SXuan Hu  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
282730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
283730cfbc0SXuan Hu
284730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
285730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
286ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
287ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
288730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
2898d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2908d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2918d29ec32Sczw
292730cfbc0SXuan Hu    }
293730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
294730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
295730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
296730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
2978d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2988d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2998d29ec32Sczw
300730cfbc0SXuan Hu    }
301730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
302730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
303730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
304730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
3058d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
3068d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
3078d29ec32Sczw
308730cfbc0SXuan Hu    }
3092e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
310dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
311730cfbc0SXuan Hu  }
312730cfbc0SXuan Hu
313730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
314730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
315730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
316bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
317730cfbc0SXuan Hu  }
318730cfbc0SXuan Hu
3197b753bebSXuan Hu  ldAddrIQs.foreach {
320de784418SXuan Hu    case imp: IssueQueueMemAddrImp =>
321de784418SXuan Hu      imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback
322de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
3237b753bebSXuan Hu    case _ =>
3247b753bebSXuan Hu  }
3257b753bebSXuan Hu
3267b753bebSXuan Hu  stAddrIQs.foreach {
3277b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback
3287b753bebSXuan Hu    case _ =>
3297b753bebSXuan Hu  }
330730cfbc0SXuan Hu
3319b258a00Sxgkiri  private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk)
3329b258a00Sxgkiri
3339b258a00Sxgkiri  for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) {
3349b258a00Sxgkiri    dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) =>
335730cfbc0SXuan Hu      val isAllReady = staIQ.ready && stdIQ.ready
336730cfbc0SXuan Hu      di.ready := isAllReady
337730cfbc0SXuan Hu      staIQ.valid := di.valid && isAllReady
338730cfbc0SXuan Hu      stdIQ.valid := di.valid && isAllReady
339730cfbc0SXuan Hu    }
3409b258a00Sxgkiri  }
341730cfbc0SXuan Hu
342730cfbc0SXuan Hu  require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " +
343730cfbc0SXuan Hu    s"should be equal to number of data IQs(${stDataIQs})")
344730cfbc0SXuan Hu  stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) =>
345730cfbc0SXuan Hu    stdIQ.io.flush <> io.fromCtrlBlock.flush
346730cfbc0SXuan Hu
347730cfbc0SXuan Hu    stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) =>
348730cfbc0SXuan Hu      stdIQEnq.bits  := staIQEnq.bits
349730cfbc0SXuan Hu      // Store data reuses store addr src(1) in dispatch2iq
350730cfbc0SXuan Hu      // [dispatch2iq] --src*------src*(0)--> [staIQ]
351730cfbc0SXuan Hu      //                       \
352730cfbc0SXuan Hu      //                        ---src*(1)--> [stdIQ]
353730cfbc0SXuan Hu      // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
354730cfbc0SXuan Hu      // instead of dispatch2Iq.io.out(x).bits.src*(1)
355730cfbc0SXuan Hu      stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1)
356730cfbc0SXuan Hu      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1)
357730cfbc0SXuan Hu      stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1)
358730cfbc0SXuan Hu      stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
359730cfbc0SXuan Hu    }
360bf35baadSXuan Hu    stdIQ.io.wakeupFromWB := wakeupFromWBVec
361730cfbc0SXuan Hu  }
362730cfbc0SXuan Hu
363730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
364730cfbc0SXuan Hu
365730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
366730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
367730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
368730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
369730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
370730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
371730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
372730cfbc0SXuan Hu}
373