xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 1ca4a39d94e1f073c5b88bb48c58ef894afa74ff)
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 {
23*1ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
24*1ca4a39dSXuan 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)))
77ea46c302SXuan Hu    val og0Cancel = Input(ExuVec(backendParams.numExu))
78ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
79ea46c302SXuan Hu    val og1Cancel = Input(ExuVec(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)))))))
860f55a0d3SHaojin Tang
870f55a0d3SHaojin Tang  val ldCancel = Vec(backendParams.LduCnt, Flipped(new LoadCancelIO))
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 {
125bc7d6943SzhanglyGit    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB())))
126730cfbc0SXuan Hu    case _ => None
127730cfbc0SXuan Hu  }
128730cfbc0SXuan Hu
129730cfbc0SXuan Hu  val vfBusyTable = schdType match {
130bc7d6943SzhanglyGit    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB())))
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      }
151bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
152bc7d6943SzhanglyGit      bt.io.cancel := io.fromDataPath.cancelToBusyTable
153730cfbc0SXuan Hu    case None =>
154730cfbc0SXuan Hu  }
155730cfbc0SXuan Hu
156730cfbc0SXuan Hu  vfBusyTable match {
157730cfbc0SXuan Hu    case Some(bt) =>
158730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
159730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
160730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
161730cfbc0SXuan Hu      }
162730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
163730cfbc0SXuan Hu        wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen)
164730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
165730cfbc0SXuan Hu      }
166bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
167bc7d6943SzhanglyGit      bt.io.cancel := io.fromDataPath.cancelToBusyTable
168730cfbc0SXuan Hu    case None =>
169730cfbc0SXuan Hu  }
170730cfbc0SXuan Hu
171c0be7f33SXuan Hu  val wakeupFromWBVec = Wire(params.genWBWakeUpSinkValidBundle)
172730cfbc0SXuan Hu  val writeback = params.schdType match {
173730cfbc0SXuan Hu    case IntScheduler() => io.intWriteBack
174730cfbc0SXuan Hu    case MemScheduler() => io.intWriteBack ++ io.vfWriteBack
175730cfbc0SXuan Hu    case VfScheduler() => io.vfWriteBack
176730cfbc0SXuan Hu    case _ => Seq()
177730cfbc0SXuan Hu  }
178730cfbc0SXuan Hu  wakeupFromWBVec.zip(writeback).foreach { case (sink, source) =>
179730cfbc0SXuan Hu    sink.valid := source.wen
180730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
181730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
182730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
183730cfbc0SXuan Hu    sink.bits.pdest := source.addr
184730cfbc0SXuan Hu  }
185730cfbc0SXuan Hu
186bf35baadSXuan Hu  // Connect bundles having the same wakeup source
18759ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
188bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
189c0be7f33SXuan Hu      wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx)
190bf35baadSXuan Hu    }
191ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
192ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
1930f55a0d3SHaojin Tang    iq.io.ldCancel := io.ldCancel
19459ef6009Sxiaofeibao-xjtu    iq.io.fromCancelNetwork <> io.fromCancelNetwork(i)
195bf35baadSXuan Hu  }
196bf35baadSXuan Hu
197c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
198bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
199c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
200bf35baadSXuan Hu      .toMap
201bf35baadSXuan Hu
202bf35baadSXuan Hu  // Connect bundles having the same wakeup source
203bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
204c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
205bf35baadSXuan Hu  }
206bf35baadSXuan Hu
207730cfbc0SXuan Hu  io.toDataPath.zipWithIndex.foreach { case (toDp, i) =>
208730cfbc0SXuan Hu    toDp <> issueQueues(i).io.deq
209730cfbc0SXuan Hu  }
21059ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
21159ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
21259ef6009Sxiaofeibao-xjtu  }
213bf35baadSXuan Hu
214f99b81adSHaojin Tang  // Response
215f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
216f99b81adSHaojin Tang    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
217f99b81adSHaojin Tang      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
218f99b81adSHaojin Tang      deqResp.bits.respType := RSFeedbackType.issueSuccess
219f99b81adSHaojin Tang      deqResp.bits.robIdx := iq.io.deq(j).bits.common.robIdx
220f99b81adSHaojin Tang      deqResp.bits.dataInvalidSqIdx := DontCare
221f99b81adSHaojin Tang      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
222f99b81adSHaojin Tang      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
223f99b81adSHaojin Tang    }
224f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
225f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
226f99b81adSHaojin Tang    }
227f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
228f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
229f99b81adSHaojin Tang    }
230f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
231f99b81adSHaojin Tang      finalIssueResp := io.loadFinalIssueResp(i)(j)
232f99b81adSHaojin Tang    })
233f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
234f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
235f99b81adSHaojin Tang  }
236f99b81adSHaojin Tang
237c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
238bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
239bf35baadSXuan Hu
240bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
241c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
242730cfbc0SXuan Hu}
243730cfbc0SXuan Hu
244730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
245730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
246730cfbc0SXuan Hu    with HasXSParameter
247730cfbc0SXuan Hu{
2482e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
249730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
250730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
251730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
252730cfbc0SXuan Hu
253730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
254730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
255730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
256bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
257730cfbc0SXuan Hu  }
258730cfbc0SXuan Hu}
259730cfbc0SXuan Hu
260f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
261730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
262730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
263730cfbc0SXuan Hu    with HasXSParameter
264730cfbc0SXuan Hu{
265730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
266730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
267730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
268730cfbc0SXuan Hu
269730cfbc0SXuan Hu  val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0)
270730cfbc0SXuan Hu  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
2717b753bebSXuan Hu  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
272730cfbc0SXuan Hu  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
273730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
274730cfbc0SXuan Hu
275853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
276853cd2d8SHaojin Tang
277730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
278730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
279730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
280bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
281730cfbc0SXuan Hu  }
282730cfbc0SXuan Hu
2837b753bebSXuan Hu  ldAddrIQs.foreach {
284de784418SXuan Hu    case imp: IssueQueueMemAddrImp =>
285de784418SXuan Hu      imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback
286c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
287de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
2887b753bebSXuan Hu    case _ =>
2897b753bebSXuan Hu  }
2907b753bebSXuan Hu
2917b753bebSXuan Hu  stAddrIQs.foreach {
292c14e89f4SHaojin Tang    case imp: IssueQueueMemAddrImp =>
293c14e89f4SHaojin Tang      imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback
294c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
295c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
2967b753bebSXuan Hu    case _ =>
2977b753bebSXuan Hu  }
298730cfbc0SXuan Hu
299166eb00dSHaojin Tang  // TODO: Implement vstu
300166eb00dSHaojin Tang  issueQueues.filter(iq => iq.params.VstuCnt > 0).foreach {
301166eb00dSHaojin Tang    case imp: IssueQueueMemAddrImp =>
302166eb00dSHaojin Tang      imp.io.memIO.get.feedbackIO <> DontCare
303166eb00dSHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := DontCare
304166eb00dSHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare
305166eb00dSHaojin Tang    case _ =>
306166eb00dSHaojin Tang  }
307166eb00dSHaojin Tang
308166eb00dSHaojin Tang  // TODO: Implement vldu
309166eb00dSHaojin Tang  issueQueues.filter(iq => iq.params.VlduCnt > 0).foreach {
310166eb00dSHaojin Tang    case imp: IssueQueueMemAddrImp =>
311166eb00dSHaojin Tang      imp.io.memIO.get.feedbackIO <> DontCare
312166eb00dSHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := DontCare
313166eb00dSHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := DontCare
314166eb00dSHaojin Tang    case _ =>
315166eb00dSHaojin Tang  }
316166eb00dSHaojin Tang
3179b258a00Sxgkiri  private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk)
3189b258a00Sxgkiri
3199b258a00Sxgkiri  for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) {
3209b258a00Sxgkiri    dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) =>
321730cfbc0SXuan Hu      val isAllReady = staIQ.ready && stdIQ.ready
322730cfbc0SXuan Hu      di.ready := isAllReady
323730cfbc0SXuan Hu      staIQ.valid := di.valid && isAllReady
324730cfbc0SXuan Hu      stdIQ.valid := di.valid && isAllReady
325730cfbc0SXuan Hu    }
3269b258a00Sxgkiri  }
327730cfbc0SXuan Hu
328730cfbc0SXuan Hu  require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " +
329730cfbc0SXuan Hu    s"should be equal to number of data IQs(${stDataIQs})")
330730cfbc0SXuan Hu  stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) =>
331730cfbc0SXuan Hu    stdIQ.io.flush <> io.fromCtrlBlock.flush
332730cfbc0SXuan Hu
333730cfbc0SXuan Hu    stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) =>
334730cfbc0SXuan Hu      stdIQEnq.bits  := staIQEnq.bits
335730cfbc0SXuan Hu      // Store data reuses store addr src(1) in dispatch2iq
336730cfbc0SXuan Hu      // [dispatch2iq] --src*------src*(0)--> [staIQ]
337730cfbc0SXuan Hu      //                       \
338730cfbc0SXuan Hu      //                        ---src*(1)--> [stdIQ]
339730cfbc0SXuan Hu      // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
340730cfbc0SXuan Hu      // instead of dispatch2Iq.io.out(x).bits.src*(1)
341730cfbc0SXuan Hu      stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1)
342730cfbc0SXuan Hu      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1)
343bc7d6943SzhanglyGit      stdIQEnq.bits.dataSource(0) := staIQEnq.bits.dataSource(1)
344bc7d6943SzhanglyGit      stdIQEnq.bits.l1ExuOH(0) := staIQEnq.bits.l1ExuOH(1)
345730cfbc0SXuan Hu      stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1)
346730cfbc0SXuan Hu      stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
347730cfbc0SXuan Hu    }
348bf35baadSXuan Hu    stdIQ.io.wakeupFromWB := wakeupFromWBVec
349730cfbc0SXuan Hu  }
350730cfbc0SXuan Hu
351730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
352730cfbc0SXuan Hu
353730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
354730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
355730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
356730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
357730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
358730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
359730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
360730cfbc0SXuan Hu}
361