xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 59ef600979f75c71e199fa44c92af7446cd5eac3)
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._
9730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig.VAddrData
10730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig
11730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable
12730cfbc0SXuan Huimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr}
13730cfbc0SXuan Hu
14730cfbc0SXuan Husealed trait SchedulerType
15730cfbc0SXuan Hu
16730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType
17730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType
18730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType
19730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType
20730cfbc0SXuan Hu
21730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
22730cfbc0SXuan Hu  val numIntStateWrite = backendParams.numIntWb
23730cfbc0SXuan Hu  val numVfStateWrite = backendParams.numVfWb
24730cfbc0SXuan Hu
25730cfbc0SXuan Hu  val dispatch2Iq = LazyModule(new Dispatch2Iq(params))
26730cfbc0SXuan Hu  val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName)))
27730cfbc0SXuan Hu
28730cfbc0SXuan Hu  lazy val module = params.schdType match {
29730cfbc0SXuan Hu    case IntScheduler() => new SchedulerArithImp(this)(params, p)
30730cfbc0SXuan Hu    case MemScheduler() => new SchedulerMemImp(this)(params, p)
31730cfbc0SXuan Hu    case VfScheduler() => new SchedulerArithImp(this)(params, p)
32730cfbc0SXuan Hu    case _ => null
33730cfbc0SXuan Hu  }
34730cfbc0SXuan Hu}
35730cfbc0SXuan Hu
36ea46c302SXuan Huclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends Bundle {
3768d13085SXuan Hu  // params alias
38ea46c302SXuan Hu  private val backendParams = params.backendParam
39ea46c302SXuan Hu  private val LoadQueueSize = p(XSCoreParamsKey).VirtualLoadQueueSize
40ea46c302SXuan Hu  private val RenameWidth = p(XSCoreParamsKey).RenameWidth
41ea46c302SXuan Hu  private val CommitWidth = p(XSCoreParamsKey).CommitWidth
42ea46c302SXuan Hu  private val EnsbufferWidth = p(XSCoreParamsKey).EnsbufferWidth
43ea46c302SXuan Hu  private val StoreQueueSize = p(XSCoreParamsKey).StoreQueueSize
4468d13085SXuan Hu
45730cfbc0SXuan Hu  val fromTop = new Bundle {
46730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
47730cfbc0SXuan Hu  }
482e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
492e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
502e0a7dc5Sfdy  }
51dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
52dd970561SzhanglyGit
53730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
54730cfbc0SXuan Hu    val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
55730cfbc0SXuan Hu    val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
56730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
57730cfbc0SXuan Hu  }
58730cfbc0SXuan Hu  val fromDispatch = new Bundle {
59730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
60730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
61730cfbc0SXuan Hu  }
62730cfbc0SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.intPregParams.numWrite,
63730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
64730cfbc0SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.vfPregParams.numWrite,
65730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
6610fe9778SXuan Hu  val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
67*59ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
68*59ef6009Sxiaofeibao-xjtu  val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)))
69730cfbc0SXuan Hu
70bf35baadSXuan Hu  val fromSchedulers = new Bundle {
71c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
72bf35baadSXuan Hu  }
73bf35baadSXuan Hu
74bf35baadSXuan Hu  val toSchedulers = new Bundle {
75c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
76bf35baadSXuan Hu  }
77bf35baadSXuan Hu
78c0be7f33SXuan Hu  val fromDataPath = new Bundle {
7910fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
80ea46c302SXuan Hu    val og0Cancel = Input(ExuVec(backendParams.numExu))
81ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
82ea46c302SXuan Hu    val og1Cancel = Input(ExuVec(backendParams.numExu))
83c0be7f33SXuan Hu    // just be compatible to old code
84c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
85c0be7f33SXuan Hu  }
86c0be7f33SXuan Hu
87c0be7f33SXuan Hu
88730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
89730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
90730cfbc0SXuan Hu  }) else None
91730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
927b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
937b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
94730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
95730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
96730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
97730cfbc0SXuan Hu    // from lsq
98730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
99730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
100730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
101730cfbc0SXuan Hu  }) else None
102730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
103730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
104730cfbc0SXuan Hu  }) else None
105730cfbc0SXuan Hu}
106730cfbc0SXuan Hu
107730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
108730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
109730cfbc0SXuan Hu    with HasXSParameter
110730cfbc0SXuan Hu{
111730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
112730cfbc0SXuan Hu
113730cfbc0SXuan Hu  // alias
114c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
115c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
116730cfbc0SXuan Hu  private val schdType = params.schdType
117730cfbc0SXuan Hu  private val (numRfRead, numRfWrite) = params.numRfReadWrite.getOrElse((0, 0))
118730cfbc0SXuan Hu  private val numPregs = params.numPregs
119730cfbc0SXuan Hu
120730cfbc0SXuan Hu  // Modules
121730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
122730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
123730cfbc0SXuan Hu
124730cfbc0SXuan Hu  // BusyTable Modules
125730cfbc0SXuan Hu  val intBusyTable = schdType match {
126730cfbc0SXuan Hu    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite)))
127730cfbc0SXuan Hu    case _ => None
128730cfbc0SXuan Hu  }
129730cfbc0SXuan Hu
130730cfbc0SXuan Hu  val vfBusyTable = schdType match {
131730cfbc0SXuan Hu    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite)))
132730cfbc0SXuan Hu    case _ => None
133730cfbc0SXuan Hu  }
134730cfbc0SXuan Hu
135730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
136730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
137730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
138730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
139730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
140730cfbc0SXuan Hu  }
141730cfbc0SXuan Hu
142730cfbc0SXuan Hu  intBusyTable match {
143730cfbc0SXuan Hu    case Some(bt) =>
144730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
145730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
146730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
147730cfbc0SXuan Hu      }
148730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
149730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
150730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
151730cfbc0SXuan Hu      }
152730cfbc0SXuan Hu    case None =>
153730cfbc0SXuan Hu  }
154730cfbc0SXuan Hu
155730cfbc0SXuan Hu  vfBusyTable match {
156730cfbc0SXuan Hu    case Some(bt) =>
157730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
158730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
159730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
160730cfbc0SXuan Hu      }
161730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
162730cfbc0SXuan Hu        wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen)
163730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
164730cfbc0SXuan Hu      }
165730cfbc0SXuan Hu    case None =>
166730cfbc0SXuan Hu  }
167730cfbc0SXuan Hu
168c0be7f33SXuan Hu  val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle)
169730cfbc0SXuan Hu  val writeback = params.schdType match {
170730cfbc0SXuan Hu    case IntScheduler() => io.intWriteBack
171730cfbc0SXuan Hu    case MemScheduler() => io.intWriteBack ++ io.vfWriteBack
172730cfbc0SXuan Hu    case VfScheduler() => io.vfWriteBack
173730cfbc0SXuan Hu    case _ => Seq()
174730cfbc0SXuan Hu  }
175730cfbc0SXuan Hu  wakeupFromWBVec.zip(writeback).foreach { case (sink, source) =>
176730cfbc0SXuan Hu    sink.valid := source.wen
177730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
178730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
179730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
180730cfbc0SXuan Hu    sink.bits.pdest := source.addr
181730cfbc0SXuan Hu  }
182730cfbc0SXuan Hu
183bf35baadSXuan Hu  // Connect bundles having the same wakeup source
184*59ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
185bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
186c0be7f33SXuan Hu      wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx)
187bf35baadSXuan Hu    }
188ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
189ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
190*59ef6009Sxiaofeibao-xjtu    iq.io.fromCancelNetwork <> io.fromCancelNetwork(i)
191bf35baadSXuan Hu  }
192bf35baadSXuan Hu
193c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
194bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
195c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
196bf35baadSXuan Hu      .toMap
197bf35baadSXuan Hu
198bf35baadSXuan Hu  // Connect bundles having the same wakeup source
199bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
200c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
201bf35baadSXuan Hu  }
202bf35baadSXuan Hu
203730cfbc0SXuan Hu  io.toDataPath.zipWithIndex.foreach { case (toDp, i) =>
204730cfbc0SXuan Hu    toDp <> issueQueues(i).io.deq
205730cfbc0SXuan Hu  }
206*59ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
207*59ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
208*59ef6009Sxiaofeibao-xjtu  }
209bf35baadSXuan Hu
210c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
211bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
212bf35baadSXuan Hu
213bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
214c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
215730cfbc0SXuan Hu}
216730cfbc0SXuan Hu
217730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
218730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
219730cfbc0SXuan Hu    with HasXSParameter
220730cfbc0SXuan Hu{
2212e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
222730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
223730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
224730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
225730cfbc0SXuan Hu
226730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
227730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
228730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
229bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
230730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
231ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
232ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
233730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
2348d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2358d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2368d29ec32Sczw
237730cfbc0SXuan Hu    }
238730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
239730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
240730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
241730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
2428d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2438d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2448d29ec32Sczw
245730cfbc0SXuan Hu    }
246730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
247730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
248730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
249730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
2508d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
2518d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
2528d29ec32Sczw
253730cfbc0SXuan Hu    }
2542e0a7dc5Sfdy
2552e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
256dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
257730cfbc0SXuan Hu  }
258730cfbc0SXuan Hu
259730cfbc0SXuan Hu  val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map {
260730cfbc0SXuan Hu    case imp: IssueQueueIntImp => imp.io.enqJmp
261730cfbc0SXuan Hu    case _ => None
262730cfbc0SXuan Hu  }.filter(_.nonEmpty).flatMap(_.get)
263730cfbc0SXuan Hu  println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}")
264730cfbc0SXuan Hu
265730cfbc0SXuan Hu  iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) =>
266730cfbc0SXuan Hu    iqJmp.pc := pc
267730cfbc0SXuan Hu    iqJmp.target := target
268730cfbc0SXuan Hu  }
269730cfbc0SXuan Hu}
270730cfbc0SXuan Hu
271730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
272730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
273730cfbc0SXuan Hu    with HasXSParameter
274730cfbc0SXuan Hu{
275730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
276730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
277730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
278730cfbc0SXuan Hu
279730cfbc0SXuan Hu  val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0)
280730cfbc0SXuan Hu  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
2817b753bebSXuan Hu  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
282730cfbc0SXuan Hu  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
283730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
284730cfbc0SXuan Hu
285730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
286730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
287ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
288ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
289730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
2908d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2918d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2928d29ec32Sczw
293730cfbc0SXuan Hu    }
294730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
295730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
296730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
297730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
2988d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2998d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
3008d29ec32Sczw
301730cfbc0SXuan Hu    }
302730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
303730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
304730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
305730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
3068d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
3078d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
3088d29ec32Sczw
309730cfbc0SXuan Hu    }
3102e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
311dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
312730cfbc0SXuan Hu  }
313730cfbc0SXuan Hu
314730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
315730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
316730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
317bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
318730cfbc0SXuan Hu  }
319730cfbc0SXuan Hu
3207b753bebSXuan Hu  ldAddrIQs.foreach {
321de784418SXuan Hu    case imp: IssueQueueMemAddrImp =>
322de784418SXuan Hu      imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback
323de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
3247b753bebSXuan Hu    case _ =>
3257b753bebSXuan Hu  }
3267b753bebSXuan Hu
3277b753bebSXuan Hu  stAddrIQs.foreach {
3287b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback
3297b753bebSXuan Hu    case _ =>
3307b753bebSXuan Hu  }
331730cfbc0SXuan Hu
3329b258a00Sxgkiri  private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk)
3339b258a00Sxgkiri
3349b258a00Sxgkiri  for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) {
3359b258a00Sxgkiri    dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) =>
336730cfbc0SXuan Hu      val isAllReady = staIQ.ready && stdIQ.ready
337730cfbc0SXuan Hu      di.ready := isAllReady
338730cfbc0SXuan Hu      staIQ.valid := di.valid && isAllReady
339730cfbc0SXuan Hu      stdIQ.valid := di.valid && isAllReady
340730cfbc0SXuan Hu    }
3419b258a00Sxgkiri  }
342730cfbc0SXuan Hu
343730cfbc0SXuan Hu  require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " +
344730cfbc0SXuan Hu    s"should be equal to number of data IQs(${stDataIQs})")
345730cfbc0SXuan Hu  stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) =>
346730cfbc0SXuan Hu    stdIQ.io.flush <> io.fromCtrlBlock.flush
347730cfbc0SXuan Hu
348730cfbc0SXuan Hu    stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) =>
349730cfbc0SXuan Hu      stdIQEnq.bits  := staIQEnq.bits
350730cfbc0SXuan Hu      // Store data reuses store addr src(1) in dispatch2iq
351730cfbc0SXuan Hu      // [dispatch2iq] --src*------src*(0)--> [staIQ]
352730cfbc0SXuan Hu      //                       \
353730cfbc0SXuan Hu      //                        ---src*(1)--> [stdIQ]
354730cfbc0SXuan Hu      // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
355730cfbc0SXuan Hu      // instead of dispatch2Iq.io.out(x).bits.src*(1)
356730cfbc0SXuan Hu      stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1)
357730cfbc0SXuan Hu      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1)
358730cfbc0SXuan Hu      stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1)
359730cfbc0SXuan Hu      stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
360730cfbc0SXuan Hu    }
361bf35baadSXuan Hu    stdIQ.io.wakeupFromWB := wakeupFromWBVec
362730cfbc0SXuan Hu  }
363730cfbc0SXuan Hu
364730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
365730cfbc0SXuan Hu
366730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
367730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
368730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
369730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
370730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
371730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
372730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
373730cfbc0SXuan Hu}
374