xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision ea46c302837b90f2cc38e0813b76b749b1ead1ea)
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._
8730cfbc0SXuan 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}
13*ea46c302SXuan Huimport xiangshan.backend.Bundles.{DynInst, ExuVec, IssueQueueCancelBundle, IssueQueueIQWakeUpBundle, IssueQueueWBWakeUpBundle}
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 {
23730cfbc0SXuan Hu  val numIntStateWrite = backendParams.numIntWb
24730cfbc0SXuan Hu  val numVfStateWrite = backendParams.numVfWb
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*ea46c302SXuan Huclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends Bundle {
3868d13085SXuan Hu  // params alias
39*ea46c302SXuan Hu  private val backendParams = params.backendParam
40*ea46c302SXuan Hu  private val LoadQueueSize = p(XSCoreParamsKey).VirtualLoadQueueSize
41*ea46c302SXuan Hu  private val RenameWidth = p(XSCoreParamsKey).RenameWidth
42*ea46c302SXuan Hu  private val CommitWidth = p(XSCoreParamsKey).CommitWidth
43*ea46c302SXuan Hu  private val EnsbufferWidth = p(XSCoreParamsKey).EnsbufferWidth
44*ea46c302SXuan 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  }
63730cfbc0SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.intPregParams.numWrite,
64730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
65730cfbc0SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.vfPregParams.numWrite,
66730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
67730cfbc0SXuan Hu  val toDataPath: MixedVec[MixedVec[DecoupledIO[Bundles.IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
68730cfbc0SXuan Hu
69bf35baadSXuan Hu  val fromSchedulers = new Bundle {
70c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
71bf35baadSXuan Hu  }
72bf35baadSXuan Hu
73bf35baadSXuan Hu  val toSchedulers = new Bundle {
74c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
75bf35baadSXuan Hu  }
76bf35baadSXuan Hu
77c0be7f33SXuan Hu  val fromDataPath = new Bundle {
78c0be7f33SXuan Hu    val resp: MixedVec[MixedVec[Bundles.OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
79*ea46c302SXuan Hu    val og0Cancel = Input(ExuVec(backendParams.numExu))
80*ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
81*ea46c302SXuan Hu    val og1Cancel = Input(ExuVec(backendParams.numExu))
82c0be7f33SXuan Hu    // just be compatible to old code
83c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
84c0be7f33SXuan Hu  }
85c0be7f33SXuan Hu
86c0be7f33SXuan Hu
87730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
88730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
89730cfbc0SXuan Hu  }) else None
90730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
917b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
927b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
93730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
94730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
95730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
96730cfbc0SXuan Hu    // from lsq
97730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
98730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
99730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
100730cfbc0SXuan Hu  }) else None
101730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
102730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
103730cfbc0SXuan Hu  }) else None
104730cfbc0SXuan Hu}
105730cfbc0SXuan Hu
106730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
107730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
108730cfbc0SXuan Hu    with HasXSParameter
109730cfbc0SXuan Hu{
110730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
111730cfbc0SXuan Hu
112730cfbc0SXuan Hu  // alias
113c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
114c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
115730cfbc0SXuan Hu  private val schdType = params.schdType
116730cfbc0SXuan Hu  private val (numRfRead, numRfWrite) = params.numRfReadWrite.getOrElse((0, 0))
117730cfbc0SXuan Hu  private val numPregs = params.numPregs
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 {
125730cfbc0SXuan Hu    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite)))
126730cfbc0SXuan Hu    case _ => None
127730cfbc0SXuan Hu  }
128730cfbc0SXuan Hu
129730cfbc0SXuan Hu  val vfBusyTable = schdType match {
130730cfbc0SXuan Hu    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite)))
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
183bf35baadSXuan Hu  issueQueues.foreach { iq =>
184bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
185c0be7f33SXuan Hu      wakeUp := iqWakeUpInMap(wakeUp.bits.exuIdx)
186bf35baadSXuan Hu    }
187*ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
188*ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
189bf35baadSXuan Hu  }
190bf35baadSXuan Hu
191c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
192bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
193c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
194bf35baadSXuan Hu      .toMap
195bf35baadSXuan Hu
196bf35baadSXuan Hu  // Connect bundles having the same wakeup source
197bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
198c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
199bf35baadSXuan Hu  }
200bf35baadSXuan Hu
201730cfbc0SXuan Hu  io.toDataPath.zipWithIndex.foreach { case (toDp, i) =>
202730cfbc0SXuan Hu    toDp <> issueQueues(i).io.deq
203730cfbc0SXuan Hu  }
204bf35baadSXuan Hu
205c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
206bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
207bf35baadSXuan Hu
208bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
209c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
210730cfbc0SXuan Hu}
211730cfbc0SXuan Hu
212730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
213730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
214730cfbc0SXuan Hu    with HasXSParameter
215730cfbc0SXuan Hu{
2162e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
217730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
218730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
219730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
220730cfbc0SXuan Hu
221730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
222730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
223730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
224bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
225730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
226ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
227ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
228730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
2298d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2308d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2318d29ec32Sczw
232730cfbc0SXuan Hu    }
233730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
234730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
235730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
236730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
2378d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2388d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2398d29ec32Sczw
240730cfbc0SXuan Hu    }
241730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
242730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
243730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
244730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
2458d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
2468d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
2478d29ec32Sczw
248730cfbc0SXuan Hu    }
2492e0a7dc5Sfdy
2502e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
251dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
252730cfbc0SXuan Hu  }
253730cfbc0SXuan Hu
254730cfbc0SXuan Hu  val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map {
255730cfbc0SXuan Hu    case imp: IssueQueueIntImp => imp.io.enqJmp
256730cfbc0SXuan Hu    case _ => None
257730cfbc0SXuan Hu  }.filter(_.nonEmpty).flatMap(_.get)
258730cfbc0SXuan Hu  println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}")
259730cfbc0SXuan Hu
260730cfbc0SXuan Hu  iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) =>
261730cfbc0SXuan Hu    iqJmp.pc := pc
262730cfbc0SXuan Hu    iqJmp.target := target
263730cfbc0SXuan Hu  }
264730cfbc0SXuan Hu}
265730cfbc0SXuan Hu
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)
278730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
279730cfbc0SXuan Hu
280730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
281730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
282ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
283ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
284730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
2858d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2868d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2878d29ec32Sczw
288730cfbc0SXuan Hu    }
289730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
290730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
291730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
292730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
2938d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2948d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2958d29ec32Sczw
296730cfbc0SXuan Hu    }
297730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
298730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
299730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
300730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
3018d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
3028d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
3038d29ec32Sczw
304730cfbc0SXuan Hu    }
3052e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
306dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
307730cfbc0SXuan Hu  }
308730cfbc0SXuan Hu
309730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
310730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
311730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
312bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
313730cfbc0SXuan Hu  }
314730cfbc0SXuan Hu
3157b753bebSXuan Hu  ldAddrIQs.foreach {
3167b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback
3177b753bebSXuan Hu    case _ =>
3187b753bebSXuan Hu  }
3197b753bebSXuan Hu
3207b753bebSXuan Hu  stAddrIQs.foreach {
3217b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback
3227b753bebSXuan Hu    case _ =>
3237b753bebSXuan Hu  }
324730cfbc0SXuan Hu
3259b258a00Sxgkiri  private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk)
3269b258a00Sxgkiri
3279b258a00Sxgkiri  for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) {
3289b258a00Sxgkiri    dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) =>
329730cfbc0SXuan Hu      val isAllReady = staIQ.ready && stdIQ.ready
330730cfbc0SXuan Hu      di.ready := isAllReady
331730cfbc0SXuan Hu      staIQ.valid := di.valid && isAllReady
332730cfbc0SXuan Hu      stdIQ.valid := di.valid && isAllReady
333730cfbc0SXuan Hu    }
3349b258a00Sxgkiri  }
335730cfbc0SXuan Hu
336730cfbc0SXuan Hu  require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " +
337730cfbc0SXuan Hu    s"should be equal to number of data IQs(${stDataIQs})")
338730cfbc0SXuan Hu  stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) =>
339730cfbc0SXuan Hu    stdIQ.io.flush <> io.fromCtrlBlock.flush
340730cfbc0SXuan Hu
341730cfbc0SXuan Hu    stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) =>
342730cfbc0SXuan Hu      stdIQEnq.bits  := staIQEnq.bits
343730cfbc0SXuan Hu      // Store data reuses store addr src(1) in dispatch2iq
344730cfbc0SXuan Hu      // [dispatch2iq] --src*------src*(0)--> [staIQ]
345730cfbc0SXuan Hu      //                       \
346730cfbc0SXuan Hu      //                        ---src*(1)--> [stdIQ]
347730cfbc0SXuan Hu      // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
348730cfbc0SXuan Hu      // instead of dispatch2Iq.io.out(x).bits.src*(1)
349730cfbc0SXuan Hu      stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1)
350730cfbc0SXuan Hu      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1)
351730cfbc0SXuan Hu      stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1)
352730cfbc0SXuan Hu      stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
353730cfbc0SXuan Hu    }
354bf35baadSXuan Hu    stdIQ.io.wakeupFromWB := wakeupFromWBVec
355730cfbc0SXuan Hu  }
356730cfbc0SXuan Hu
357730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
358730cfbc0SXuan Hu
359730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
360730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
361730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
362730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
363730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
364730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
365730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
366730cfbc0SXuan Hu}
367