xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision bf35baadc696c036c1c015fd05dc490255f3e71f)
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}
13730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DynInst, IssueQueueWakeUpBundle}
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
37730cfbc0SXuan Huclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle {
3868d13085SXuan Hu  // params alias
3968d13085SXuan Hu  private val LoadQueueSize = VirtualLoadQueueSize
4068d13085SXuan Hu
41730cfbc0SXuan Hu  val fromTop = new Bundle {
42730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
43730cfbc0SXuan Hu  }
442e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
452e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
462e0a7dc5Sfdy  }
47dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
48dd970561SzhanglyGit
49730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
50730cfbc0SXuan Hu    val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
51730cfbc0SXuan Hu    val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
52730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
53730cfbc0SXuan Hu  }
54730cfbc0SXuan Hu  val fromDispatch = new Bundle {
55730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
56730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
57730cfbc0SXuan Hu  }
58730cfbc0SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.intPregParams.numWrite,
59730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
60730cfbc0SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.vfPregParams.numWrite,
61730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
62730cfbc0SXuan Hu  val toDataPath: MixedVec[MixedVec[DecoupledIO[Bundles.IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
63730cfbc0SXuan Hu  val fromDataPath: MixedVec[MixedVec[Bundles.OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
64730cfbc0SXuan Hu
65*bf35baadSXuan Hu  val fromSchedulers = new Bundle {
66*bf35baadSXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueWakeUpBundle]] = Flipped(params.genWakeUpInValidBundle)
67*bf35baadSXuan Hu  }
68*bf35baadSXuan Hu
69*bf35baadSXuan Hu  val toSchedulers = new Bundle {
70*bf35baadSXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueWakeUpBundle]] = params.genWakeUpOutValidBundle
71*bf35baadSXuan Hu  }
72*bf35baadSXuan Hu
73730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
74730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
75730cfbc0SXuan Hu  }) else None
76730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
777b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
787b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
79730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
80730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
81730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
82730cfbc0SXuan Hu    // from lsq
83730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
84730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
85730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
86730cfbc0SXuan Hu  }) else None
87730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
88730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
89730cfbc0SXuan Hu  }) else None
90730cfbc0SXuan Hu}
91730cfbc0SXuan Hu
92730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
93730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
94730cfbc0SXuan Hu    with HasXSParameter
95730cfbc0SXuan Hu{
96730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
97730cfbc0SXuan Hu
98730cfbc0SXuan Hu  // alias
99*bf35baadSXuan Hu  private val iqWakeUpInMap: Map[String, ValidIO[IssueQueueWakeUpBundle]] =
100*bf35baadSXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.wakeupSource, x)).toMap
101730cfbc0SXuan Hu  private val schdType = params.schdType
102730cfbc0SXuan Hu  private val (numRfRead, numRfWrite) = params.numRfReadWrite.getOrElse((0, 0))
103730cfbc0SXuan Hu  private val numPregs = params.numPregs
104730cfbc0SXuan Hu
105730cfbc0SXuan Hu  // Modules
106730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
107730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
108730cfbc0SXuan Hu
109730cfbc0SXuan Hu  // BusyTable Modules
110730cfbc0SXuan Hu  val intBusyTable = schdType match {
111730cfbc0SXuan Hu    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite)))
112730cfbc0SXuan Hu    case _ => None
113730cfbc0SXuan Hu  }
114730cfbc0SXuan Hu
115730cfbc0SXuan Hu  val vfBusyTable = schdType match {
116730cfbc0SXuan Hu    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite)))
117730cfbc0SXuan Hu    case _ => None
118730cfbc0SXuan Hu  }
119730cfbc0SXuan Hu
120730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
121730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
122730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
123730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
124730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
125730cfbc0SXuan Hu  }
126730cfbc0SXuan Hu
127730cfbc0SXuan Hu  intBusyTable match {
128730cfbc0SXuan Hu    case Some(bt) =>
129730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
130730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
131730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
132730cfbc0SXuan Hu      }
133730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
134730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
135730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
136730cfbc0SXuan Hu      }
137730cfbc0SXuan Hu    case None =>
138730cfbc0SXuan Hu  }
139730cfbc0SXuan Hu
140730cfbc0SXuan Hu  vfBusyTable match {
141730cfbc0SXuan Hu    case Some(bt) =>
142730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
143730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
144730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
145730cfbc0SXuan Hu      }
146730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
147730cfbc0SXuan Hu        wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen)
148730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
149730cfbc0SXuan Hu      }
150730cfbc0SXuan Hu    case None =>
151730cfbc0SXuan Hu  }
152730cfbc0SXuan Hu
153730cfbc0SXuan Hu  val wakeupFromWBVec = Wire(Vec(params.numWakeupFromWB, ValidIO(new IssueQueueWakeUpBundle(params.pregIdxWidth))))
154730cfbc0SXuan Hu  val writeback = params.schdType match {
155730cfbc0SXuan Hu    case IntScheduler() => io.intWriteBack
156730cfbc0SXuan Hu    case MemScheduler() => io.intWriteBack ++ io.vfWriteBack
157730cfbc0SXuan Hu    case VfScheduler() => io.vfWriteBack
158730cfbc0SXuan Hu    case _ => Seq()
159730cfbc0SXuan Hu  }
160730cfbc0SXuan Hu  wakeupFromWBVec.zip(writeback).foreach { case (sink, source) =>
161730cfbc0SXuan Hu    sink.valid := source.wen
162730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
163730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
164730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
165730cfbc0SXuan Hu    sink.bits.pdest := source.addr
166730cfbc0SXuan Hu  }
167730cfbc0SXuan Hu
168*bf35baadSXuan Hu  // Connect bundles having the same wakeup source
169*bf35baadSXuan Hu  issueQueues.foreach { iq =>
170*bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
171*bf35baadSXuan Hu      wakeUp := iqWakeUpInMap(wakeUp.bits.wakeupSource)
172*bf35baadSXuan Hu    }
173*bf35baadSXuan Hu  }
174*bf35baadSXuan Hu
175*bf35baadSXuan Hu  private val iqWakeUpOutMap: Map[String, ValidIO[IssueQueueWakeUpBundle]] =
176*bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
177*bf35baadSXuan Hu      .map(x => (x.bits.wakeupSource, x))
178*bf35baadSXuan Hu      .toMap
179*bf35baadSXuan Hu
180*bf35baadSXuan Hu  // Connect bundles having the same wakeup source
181*bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
182*bf35baadSXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.wakeupSource)
183*bf35baadSXuan Hu  }
184*bf35baadSXuan Hu
185730cfbc0SXuan Hu  io.toDataPath.zipWithIndex.foreach { case (toDp, i) =>
186730cfbc0SXuan Hu    toDp <> issueQueues(i).io.deq
187730cfbc0SXuan Hu  }
188*bf35baadSXuan Hu
189*bf35baadSXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(_.bits.wakeupSource)}")
190*bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
191*bf35baadSXuan Hu
192*bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
193*bf35baadSXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(_.bits.wakeupSource)}")
194730cfbc0SXuan Hu}
195730cfbc0SXuan Hu
196730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
197730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
198730cfbc0SXuan Hu    with HasXSParameter
199730cfbc0SXuan Hu{
2002e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
201730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
202730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
203730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
204730cfbc0SXuan Hu
205730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
206730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
207730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
208*bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
209730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
210ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
211ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
212730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
2138d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2148d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2158d29ec32Sczw
216730cfbc0SXuan Hu    }
217730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
218730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
219730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
220730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
2218d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2228d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2238d29ec32Sczw
224730cfbc0SXuan Hu    }
225730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
226730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
227730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
228730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
2298d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
2308d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
2318d29ec32Sczw
232730cfbc0SXuan Hu    }
2332e0a7dc5Sfdy
2342e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
235dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
236730cfbc0SXuan Hu  }
237730cfbc0SXuan Hu
238730cfbc0SXuan Hu  val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map {
239730cfbc0SXuan Hu    case imp: IssueQueueIntImp => imp.io.enqJmp
240730cfbc0SXuan Hu    case _ => None
241730cfbc0SXuan Hu  }.filter(_.nonEmpty).flatMap(_.get)
242730cfbc0SXuan Hu  println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}")
243730cfbc0SXuan Hu
244730cfbc0SXuan Hu  iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) =>
245730cfbc0SXuan Hu    iqJmp.pc := pc
246730cfbc0SXuan Hu    iqJmp.target := target
247730cfbc0SXuan Hu  }
248730cfbc0SXuan Hu}
249730cfbc0SXuan Hu
250730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
251730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
252730cfbc0SXuan Hu    with HasXSParameter
253730cfbc0SXuan Hu{
254730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
255730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
256730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
257730cfbc0SXuan Hu
258730cfbc0SXuan Hu  val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0)
259730cfbc0SXuan Hu  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
2607b753bebSXuan Hu  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
261730cfbc0SXuan Hu  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
262730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
263730cfbc0SXuan Hu
264730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
265730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
266ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
267ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
268730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
2698d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
2708d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
2718d29ec32Sczw
272730cfbc0SXuan Hu    }
273730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
274730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
275730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
276730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
2778d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
2788d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
2798d29ec32Sczw
280730cfbc0SXuan Hu    }
281730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
282730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
283730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
284730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
2858d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
2868d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
2878d29ec32Sczw
288730cfbc0SXuan Hu    }
2892e0a7dc5Sfdy    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
290dd970561SzhanglyGit    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
291730cfbc0SXuan Hu  }
292730cfbc0SXuan Hu
293730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
294730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
295730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
296*bf35baadSXuan Hu    iq.io.wakeupFromWB := wakeupFromWBVec
297730cfbc0SXuan Hu  }
298730cfbc0SXuan Hu
2997b753bebSXuan Hu  ldAddrIQs.foreach {
3007b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback
3017b753bebSXuan Hu    case _ =>
3027b753bebSXuan Hu  }
3037b753bebSXuan Hu
3047b753bebSXuan Hu  stAddrIQs.foreach {
3057b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback
3067b753bebSXuan Hu    case _ =>
3077b753bebSXuan Hu  }
308730cfbc0SXuan Hu
3099b258a00Sxgkiri  private val staIdxSeq = issueQueues.filter(iq => iq.params.StaCnt > 0).map(iq => iq.params.idxInSchBlk)
3109b258a00Sxgkiri
3119b258a00Sxgkiri  for ((idxInSchBlk, i) <- staIdxSeq.zipWithIndex) {
3129b258a00Sxgkiri    dispatch2Iq.io.out(idxInSchBlk).zip(stAddrIQs(i).io.enq).zip(stDataIQs(i).io.enq).foreach{ case((di, staIQ), stdIQ) =>
313730cfbc0SXuan Hu      val isAllReady = staIQ.ready && stdIQ.ready
314730cfbc0SXuan Hu      di.ready := isAllReady
315730cfbc0SXuan Hu      staIQ.valid := di.valid && isAllReady
316730cfbc0SXuan Hu      stdIQ.valid := di.valid && isAllReady
317730cfbc0SXuan Hu    }
3189b258a00Sxgkiri  }
319730cfbc0SXuan Hu
320730cfbc0SXuan Hu  require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " +
321730cfbc0SXuan Hu    s"should be equal to number of data IQs(${stDataIQs})")
322730cfbc0SXuan Hu  stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) =>
323730cfbc0SXuan Hu    stdIQ.io.flush <> io.fromCtrlBlock.flush
324730cfbc0SXuan Hu
325730cfbc0SXuan Hu    stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) =>
326730cfbc0SXuan Hu      stdIQEnq.bits  := staIQEnq.bits
327730cfbc0SXuan Hu      // Store data reuses store addr src(1) in dispatch2iq
328730cfbc0SXuan Hu      // [dispatch2iq] --src*------src*(0)--> [staIQ]
329730cfbc0SXuan Hu      //                       \
330730cfbc0SXuan Hu      //                        ---src*(1)--> [stdIQ]
331730cfbc0SXuan Hu      // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
332730cfbc0SXuan Hu      // instead of dispatch2Iq.io.out(x).bits.src*(1)
333730cfbc0SXuan Hu      stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1)
334730cfbc0SXuan Hu      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1)
335730cfbc0SXuan Hu      stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1)
336730cfbc0SXuan Hu      stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
337730cfbc0SXuan Hu    }
338*bf35baadSXuan Hu    stdIQ.io.wakeupFromWB := wakeupFromWBVec
339730cfbc0SXuan Hu  }
340730cfbc0SXuan Hu
341730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
342730cfbc0SXuan Hu
343730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
344730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
345730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
346730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
347730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
348730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
349730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
350730cfbc0SXuan Hu}
351