xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 6810d1e8e7c0789e9f50ee6bdd52010b8ce506ef)
1730cfbc0SXuan Hupackage xiangshan.backend.issue
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.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 {
231ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
241ca4a39dSXuan Hu
2539c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
2639c59369SXuan Hu  val numVfStateWrite = backendParams.numPregWb(VecData())
27730cfbc0SXuan Hu
28730cfbc0SXuan Hu  val dispatch2Iq = LazyModule(new Dispatch2Iq(params))
29730cfbc0SXuan Hu  val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName)))
30730cfbc0SXuan Hu
3183ba63b3SXuan Hu  lazy val module: SchedulerImpBase = params.schdType match {
32730cfbc0SXuan Hu    case IntScheduler() => new SchedulerArithImp(this)(params, p)
33730cfbc0SXuan Hu    case MemScheduler() => new SchedulerMemImp(this)(params, p)
34730cfbc0SXuan Hu    case VfScheduler() => new SchedulerArithImp(this)(params, p)
35730cfbc0SXuan Hu    case _ => null
36730cfbc0SXuan Hu  }
37730cfbc0SXuan Hu}
38730cfbc0SXuan Hu
397f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle {
4068d13085SXuan Hu  // params alias
417f8233d5SHaojin Tang  private val LoadQueueSize = VirtualLoadQueueSize
4268d13085SXuan Hu
43730cfbc0SXuan Hu  val fromTop = new Bundle {
44730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
45730cfbc0SXuan Hu  }
462e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
472e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
482e0a7dc5Sfdy  }
49dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
50dd970561SzhanglyGit
51730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
52730cfbc0SXuan Hu    val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
53730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
54730cfbc0SXuan Hu  }
55730cfbc0SXuan Hu  val fromDispatch = new Bundle {
56730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
57730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
58730cfbc0SXuan Hu  }
5939c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
60730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
6139c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
62730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
6310fe9778SXuan Hu  val toDataPath: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
6459ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
6559ef6009Sxiaofeibao-xjtu  val fromCancelNetwork = Flipped(MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)))
66730cfbc0SXuan Hu
67bf35baadSXuan Hu  val fromSchedulers = new Bundle {
68c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
69bf35baadSXuan Hu  }
70bf35baadSXuan Hu
71bf35baadSXuan Hu  val toSchedulers = new Bundle {
72c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
73bf35baadSXuan Hu  }
74bf35baadSXuan Hu
75c0be7f33SXuan Hu  val fromDataPath = new Bundle {
7610fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
777a96cc7fSHaojin Tang    val og0Cancel = Input(ExuOH(backendParams.numExu))
78ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
797a96cc7fSHaojin Tang    val og1Cancel = Input(ExuOH(backendParams.numExu))
80bc7d6943SzhanglyGit    val cancelToBusyTable = Vec(backendParams.numExu, Flipped(ValidIO(new CancelSignal)))
81c0be7f33SXuan Hu    // just be compatible to old code
82c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
83c0be7f33SXuan Hu  }
84c0be7f33SXuan Hu
850f55a0d3SHaojin Tang  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
86e8800897SXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
870f55a0d3SHaojin Tang
88*6810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
89c0be7f33SXuan Hu
90730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
91730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
92730cfbc0SXuan Hu  }) else None
93730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
947b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
957b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
968f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
97730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
98730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
99730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
100730cfbc0SXuan Hu    // from lsq
101730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
102730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
103730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
104730cfbc0SXuan Hu  }) else None
105730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
106730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
107730cfbc0SXuan Hu  }) else None
108730cfbc0SXuan Hu}
109730cfbc0SXuan Hu
110730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
111730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
112730cfbc0SXuan Hu    with HasXSParameter
113730cfbc0SXuan Hu{
114730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
115730cfbc0SXuan Hu
116730cfbc0SXuan Hu  // alias
117c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
118c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
119730cfbc0SXuan Hu  private val schdType = params.schdType
120730cfbc0SXuan Hu
121730cfbc0SXuan Hu  // Modules
122730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
123730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
124730cfbc0SXuan Hu
125730cfbc0SXuan Hu  // BusyTable Modules
126730cfbc0SXuan Hu  val intBusyTable = schdType match {
127bc7d6943SzhanglyGit    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB())))
128730cfbc0SXuan Hu    case _ => None
129730cfbc0SXuan Hu  }
130730cfbc0SXuan Hu
131730cfbc0SXuan Hu  val vfBusyTable = schdType match {
132bc7d6943SzhanglyGit    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB())))
133730cfbc0SXuan Hu    case _ => None
134730cfbc0SXuan Hu  }
135730cfbc0SXuan Hu
136730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
137730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
138730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
139730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
140730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
141730cfbc0SXuan Hu  }
142730cfbc0SXuan Hu
143730cfbc0SXuan Hu  intBusyTable match {
144730cfbc0SXuan Hu    case Some(bt) =>
145730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
146730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
147730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
148730cfbc0SXuan Hu      }
149730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
150730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
151730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
152730cfbc0SXuan Hu      }
153bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
154bc7d6943SzhanglyGit      bt.io.cancel := io.fromDataPath.cancelToBusyTable
155730cfbc0SXuan Hu    case None =>
156730cfbc0SXuan Hu  }
157730cfbc0SXuan Hu
158730cfbc0SXuan Hu  vfBusyTable match {
159730cfbc0SXuan Hu    case Some(bt) =>
160730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
161730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
162730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
163730cfbc0SXuan Hu      }
164730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
165730cfbc0SXuan Hu        wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen)
166730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
167730cfbc0SXuan Hu      }
168bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
169bc7d6943SzhanglyGit      bt.io.cancel := io.fromDataPath.cancelToBusyTable
170730cfbc0SXuan Hu    case None =>
171730cfbc0SXuan Hu  }
172730cfbc0SXuan Hu
173c0be7f33SXuan Hu  val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle)
174730cfbc0SXuan Hu  val writeback = params.schdType match {
175730cfbc0SXuan Hu    case IntScheduler() => io.intWriteBack
176730cfbc0SXuan Hu    case MemScheduler() => io.intWriteBack ++ io.vfWriteBack
177730cfbc0SXuan Hu    case VfScheduler() => io.vfWriteBack
178730cfbc0SXuan Hu    case _ => Seq()
179730cfbc0SXuan Hu  }
180730cfbc0SXuan Hu  wakeupFromWBVec.zip(writeback).foreach { case (sink, source) =>
181730cfbc0SXuan Hu    sink.valid := source.wen
182730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
183730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
184730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
185730cfbc0SXuan Hu    sink.bits.pdest := source.addr
186730cfbc0SXuan Hu  }
187730cfbc0SXuan Hu
188bf35baadSXuan Hu  // Connect bundles having the same wakeup source
18959ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
190bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
191c0be7f33SXuan Hu      wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx)
192bf35baadSXuan Hu    }
193ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
194ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
1950f55a0d3SHaojin Tang    iq.io.ldCancel := io.ldCancel
19659ef6009Sxiaofeibao-xjtu    iq.io.fromCancelNetwork <> io.fromCancelNetwork(i)
197bf35baadSXuan Hu  }
198bf35baadSXuan Hu
199c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
200bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
201c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
202bf35baadSXuan Hu      .toMap
203bf35baadSXuan Hu
204bf35baadSXuan Hu  // Connect bundles having the same wakeup source
205bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
206c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
207bf35baadSXuan Hu  }
208bf35baadSXuan Hu
209730cfbc0SXuan Hu  io.toDataPath.zipWithIndex.foreach { case (toDp, i) =>
210730cfbc0SXuan Hu    toDp <> issueQueues(i).io.deq
211730cfbc0SXuan Hu  }
21259ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
21359ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
21459ef6009Sxiaofeibao-xjtu  }
215bf35baadSXuan Hu
216f99b81adSHaojin Tang  // Response
217f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
218f99b81adSHaojin Tang    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
219f99b81adSHaojin Tang      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
220f99b81adSHaojin Tang      deqResp.bits.respType := RSFeedbackType.issueSuccess
221f99b81adSHaojin Tang      deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx
222f99b81adSHaojin Tang      deqResp.bits.dataInvalidSqIdx := DontCare
223f99b81adSHaojin Tang      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
224f99b81adSHaojin Tang      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
225f99b81adSHaojin Tang    }
226f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
227f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
228f99b81adSHaojin Tang    }
229f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
230f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
231f99b81adSHaojin Tang    }
232f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
233f99b81adSHaojin Tang      finalIssueResp := io.loadFinalIssueResp(i)(j)
234f99b81adSHaojin Tang    })
235e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
236e8800897SXuan Hu      memAddrIssueResp := io.memAddrIssueResp(i)(j)
237e8800897SXuan Hu    })
238f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
239f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
240f99b81adSHaojin Tang  }
241f99b81adSHaojin Tang
242c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
243bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
244bf35baadSXuan Hu
245bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
246c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
247730cfbc0SXuan Hu}
248730cfbc0SXuan Hu
249730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
250730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
251730cfbc0SXuan Hu    with HasXSParameter
252730cfbc0SXuan Hu{
2532e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
254730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
255730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
256730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
257730cfbc0SXuan Hu
258730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
259730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
260730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
261bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
262730cfbc0SXuan Hu  }
263730cfbc0SXuan Hu}
264730cfbc0SXuan Hu
265f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
266730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
267730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
268730cfbc0SXuan Hu    with HasXSParameter
269730cfbc0SXuan Hu{
270730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
271730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
272730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
273730cfbc0SXuan Hu
274730cfbc0SXuan Hu  val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0)
275730cfbc0SXuan Hu  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
2767b753bebSXuan Hu  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
277730cfbc0SXuan Hu  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
2788f1fa9b1Ssfencevma  val hyuIQs = issueQueues.filter(iq => iq.params.HyuCnt > 0)
279730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
280730cfbc0SXuan Hu
281853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
282853cd2d8SHaojin Tang
283730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
284730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
285730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
286bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
287730cfbc0SXuan Hu  }
288730cfbc0SXuan Hu
2897b753bebSXuan Hu  ldAddrIQs.foreach {
290de784418SXuan Hu    case imp: IssueQueueMemAddrImp =>
291de784418SXuan Hu      imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback
292c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
293de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
2947b753bebSXuan Hu    case _ =>
2957b753bebSXuan Hu  }
2967b753bebSXuan Hu
2977b753bebSXuan Hu  stAddrIQs.foreach {
298c14e89f4SHaojin Tang    case imp: IssueQueueMemAddrImp =>
299c14e89f4SHaojin Tang      imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback
300c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
301c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
3027b753bebSXuan Hu    case _ =>
3037b753bebSXuan Hu  }
304730cfbc0SXuan Hu
3058f1fa9b1Ssfencevma  hyuIQs.foreach {
3068f1fa9b1Ssfencevma    case imp: IssueQueueMemAddrImp =>
3078f1fa9b1Ssfencevma      imp.io.memIO.get.feedbackIO <> io.fromMem.get.hyuFeedback
3088f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
3098f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
3108f1fa9b1Ssfencevma    case _ =>
3118f1fa9b1Ssfencevma  }
3128f1fa9b1Ssfencevma
313166eb00dSHaojin Tang  // TODO: Implement vstu
314166eb00dSHaojin Tang  issueQueues.filter(iq => iq.params.VstuCnt > 0).foreach {
315166eb00dSHaojin Tang    case imp: IssueQueueMemAddrImp =>
316166eb00dSHaojin Tang      imp.io.memIO.get.feedbackIO <> DontCare
317166eb00dSHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := DontCare
318166eb00dSHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare
319166eb00dSHaojin Tang    case _ =>
320166eb00dSHaojin Tang  }
321166eb00dSHaojin Tang
322166eb00dSHaojin Tang  // TODO: Implement vldu
323166eb00dSHaojin Tang  issueQueues.filter(iq => iq.params.VlduCnt > 0).foreach {
324166eb00dSHaojin Tang    case imp: IssueQueueMemAddrImp =>
325166eb00dSHaojin Tang      imp.io.memIO.get.feedbackIO <> DontCare
326166eb00dSHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := DontCare
327166eb00dSHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare
328166eb00dSHaojin Tang    case _ =>
329166eb00dSHaojin Tang  }
330166eb00dSHaojin Tang
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)
357bc7d6943SzhanglyGit      stdIQEnq.bits.dataSource(0) := staIQEnq.bits.dataSource(1)
358bc7d6943SzhanglyGit      stdIQEnq.bits.l1ExuOH(0) := staIQEnq.bits.l1ExuOH(1)
359730cfbc0SXuan Hu      stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1)
360730cfbc0SXuan Hu      stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
361730cfbc0SXuan Hu    }
362bf35baadSXuan Hu    stdIQ.io.wakeupFromWB := wakeupFromWBVec
363730cfbc0SXuan Hu  }
364730cfbc0SXuan Hu
365730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
366730cfbc0SXuan Hu
367730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
368730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
369730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
370730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
371730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
372730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
373730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
374730cfbc0SXuan Hu}
375