xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 8d29ec3240ecfd2ed29ce59c324e78e62693faf8)
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  }
44*8d29ec32Sczw  val wbFuBusyTable = new Bundle{
45*8d29ec32Sczw    val fuBusyTableWrite = MixedVec(params.issueBlockParams.map(x => x.genFuBusyTableWriteBundle))
46*8d29ec32Sczw    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genFuBusyTableReadBundle)))
47*8d29ec32Sczw  }
48730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
49730cfbc0SXuan Hu    val pcVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
50730cfbc0SXuan Hu    val targetVec = Input(Vec(params.numPcReadPort, UInt(VAddrData().dataWidth.W)))
51730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
52730cfbc0SXuan Hu  }
53730cfbc0SXuan Hu  val fromDispatch = new Bundle {
54730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
55730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
56730cfbc0SXuan Hu  }
57730cfbc0SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.intPregParams.numWrite,
58730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
59730cfbc0SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.vfPregParams.numWrite,
60730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
61730cfbc0SXuan Hu  val toDataPath: MixedVec[MixedVec[DecoupledIO[Bundles.IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
62730cfbc0SXuan Hu  val fromDataPath: MixedVec[MixedVec[Bundles.OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
63730cfbc0SXuan Hu
64730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
65730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
66730cfbc0SXuan Hu  }) else None
67730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
687b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
697b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
70730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
71730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
72730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
73730cfbc0SXuan Hu    // from lsq
74730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
75730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
76730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
77730cfbc0SXuan Hu  }) else None
78730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
79730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
80730cfbc0SXuan Hu  }) else None
81730cfbc0SXuan Hu}
82730cfbc0SXuan Hu
83730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
84730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
85730cfbc0SXuan Hu    with HasXSParameter
86730cfbc0SXuan Hu{
87730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
88730cfbc0SXuan Hu
89730cfbc0SXuan Hu  // alias
90730cfbc0SXuan Hu  private val schdType = params.schdType
91730cfbc0SXuan Hu  private val (numRfRead, numRfWrite) = params.numRfReadWrite.getOrElse((0, 0))
92730cfbc0SXuan Hu  private val numPregs = params.numPregs
93730cfbc0SXuan Hu
94730cfbc0SXuan Hu  // Modules
95730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
96730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
97730cfbc0SXuan Hu
98730cfbc0SXuan Hu  // BusyTable Modules
99730cfbc0SXuan Hu  val intBusyTable = schdType match {
100730cfbc0SXuan Hu    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite)))
101730cfbc0SXuan Hu    case _ => None
102730cfbc0SXuan Hu  }
103730cfbc0SXuan Hu
104730cfbc0SXuan Hu  val vfBusyTable = schdType match {
105730cfbc0SXuan Hu    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite)))
106730cfbc0SXuan Hu    case _ => None
107730cfbc0SXuan Hu  }
108730cfbc0SXuan Hu
109730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
110730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
111730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
112730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
113730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
114730cfbc0SXuan Hu  }
115730cfbc0SXuan Hu
116730cfbc0SXuan Hu  intBusyTable match {
117730cfbc0SXuan Hu    case Some(bt) =>
118730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
119730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
120730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
121730cfbc0SXuan Hu      }
122730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
123730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
124730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
125730cfbc0SXuan Hu      }
126730cfbc0SXuan Hu    case None =>
127730cfbc0SXuan Hu  }
128730cfbc0SXuan Hu
129730cfbc0SXuan Hu  vfBusyTable match {
130730cfbc0SXuan Hu    case Some(bt) =>
131730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
132730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
133730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
134730cfbc0SXuan Hu      }
135730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
136730cfbc0SXuan Hu        wb.valid := io.vfWriteBack(i).wen && (io.vfWriteBack(i).fpWen || io.vfWriteBack(i).vecWen)
137730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
138730cfbc0SXuan Hu      }
139730cfbc0SXuan Hu    case None =>
140730cfbc0SXuan Hu  }
141730cfbc0SXuan Hu
142730cfbc0SXuan Hu  val wakeupFromWBVec = Wire(Vec(params.numWakeupFromWB, ValidIO(new IssueQueueWakeUpBundle(params.pregIdxWidth))))
143730cfbc0SXuan Hu  val writeback = params.schdType match {
144730cfbc0SXuan Hu    case IntScheduler() => io.intWriteBack
145730cfbc0SXuan Hu    case MemScheduler() => io.intWriteBack ++ io.vfWriteBack
146730cfbc0SXuan Hu    case VfScheduler() => io.vfWriteBack
147730cfbc0SXuan Hu    case _ => Seq()
148730cfbc0SXuan Hu  }
149730cfbc0SXuan Hu  wakeupFromWBVec.zip(writeback).foreach { case (sink, source) =>
150730cfbc0SXuan Hu    sink.valid := source.wen
151730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
152730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
153730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
154730cfbc0SXuan Hu    sink.bits.pdest := source.addr
155730cfbc0SXuan Hu  }
156730cfbc0SXuan Hu
157730cfbc0SXuan Hu  io.toDataPath.zipWithIndex.foreach { case (toDp, i) =>
158730cfbc0SXuan Hu    toDp <> issueQueues(i).io.deq
159730cfbc0SXuan Hu  }
160730cfbc0SXuan Hu}
161730cfbc0SXuan Hu
162730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
163730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
164730cfbc0SXuan Hu    with HasXSParameter
165730cfbc0SXuan Hu{
166730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
167730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
168730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
169730cfbc0SXuan Hu
170730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
171730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
172730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
173730cfbc0SXuan Hu    iq.io.wakeup := wakeupFromWBVec
174730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
175ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
176730cfbc0SXuan Hu      deqResp.bits.success := false.B
177ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
178730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
179*8d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
180*8d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
181*8d29ec32Sczw
182*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
183*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
184*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.respType := RSFeedbackType.issueSuccess
185*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
186730cfbc0SXuan Hu    }
187730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
188730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
189730cfbc0SXuan Hu      og0Resp.bits.success := false.B // Todo: remove it
190730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
191730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
192*8d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
193*8d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
194*8d29ec32Sczw
195*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
196*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
197*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
198*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
199730cfbc0SXuan Hu    }
200730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
201730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
202730cfbc0SXuan Hu      og1Resp.bits.success := false.B
203730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
204730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
205*8d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
206*8d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
207*8d29ec32Sczw
208*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
209*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
210*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
211*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
212730cfbc0SXuan Hu    }
213*8d29ec32Sczw    iq.io.wbBusyRead := io.wbFuBusyTable.fuBusyTableRead(i)
214730cfbc0SXuan Hu  }
215730cfbc0SXuan Hu
216730cfbc0SXuan Hu  val iqJumpBundleVec: Seq[IssueQueueJumpBundle] = issueQueues.map {
217730cfbc0SXuan Hu    case imp: IssueQueueIntImp => imp.io.enqJmp
218730cfbc0SXuan Hu    case _ => None
219730cfbc0SXuan Hu  }.filter(_.nonEmpty).flatMap(_.get)
220730cfbc0SXuan Hu  println(s"[Scheduler] iqJumpBundleVec: ${iqJumpBundleVec}")
221730cfbc0SXuan Hu
222730cfbc0SXuan Hu  iqJumpBundleVec.zip(io.fromCtrlBlock.pcVec zip io.fromCtrlBlock.targetVec).foreach { case (iqJmp, (pc, target)) =>
223730cfbc0SXuan Hu    iqJmp.pc := pc
224730cfbc0SXuan Hu    iqJmp.target := target
225730cfbc0SXuan Hu  }
226730cfbc0SXuan Hu}
227730cfbc0SXuan Hu
228730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
229730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
230730cfbc0SXuan Hu    with HasXSParameter
231730cfbc0SXuan Hu{
232730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
233730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
234730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
235730cfbc0SXuan Hu
236730cfbc0SXuan Hu  val memAddrIQs = issueQueues.filter(iq => iq.params.StdCnt == 0)
237730cfbc0SXuan Hu  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
2387b753bebSXuan Hu  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
239730cfbc0SXuan Hu  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
240730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
241730cfbc0SXuan Hu
242730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
243730cfbc0SXuan Hu    iq.io.deqResp.zipWithIndex.foreach { case (deqResp, j) =>
244ea0f92d8Sczw      deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
245730cfbc0SXuan Hu      deqResp.bits.success := false.B
246ea0f92d8Sczw      deqResp.bits.respType := RSFeedbackType.issueSuccess
247730cfbc0SXuan Hu      deqResp.bits.addrOH := iq.io.deq(j).bits.addrOH
248*8d29ec32Sczw      deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
249*8d29ec32Sczw      deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
250*8d29ec32Sczw
251*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.valid := iq.io.deq(j).valid && io.toDataPath(i)(j).ready
252*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.fuType := iq.io.deq(j).bits.common.fuType
253*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.respType := RSFeedbackType.issueSuccess
254*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).deqResp.bits.rfWen := iq.io.deq(j).bits.common.rfWen.getOrElse(false.B)
255730cfbc0SXuan Hu    }
256730cfbc0SXuan Hu    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
257730cfbc0SXuan Hu      og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
258730cfbc0SXuan Hu      og0Resp.bits.success := false.B // Todo: remove it
259730cfbc0SXuan Hu      og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
260730cfbc0SXuan Hu      og0Resp.bits.addrOH := io.fromDataPath(i)(j).og0resp.bits.addrOH
261*8d29ec32Sczw      og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
262*8d29ec32Sczw      og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
263*8d29ec32Sczw
264*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.valid := io.fromDataPath(i)(j).og0resp.valid
265*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.fuType := io.fromDataPath(i)(j).og0resp.bits.fuType
266*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.respType := io.fromDataPath(i)(j).og0resp.bits.respType
267*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og0Resp.bits.rfWen := io.fromDataPath(i)(j).og0resp.bits.rfWen
268730cfbc0SXuan Hu    }
269730cfbc0SXuan Hu    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
270730cfbc0SXuan Hu      og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
271730cfbc0SXuan Hu      og1Resp.bits.success := false.B
272730cfbc0SXuan Hu      og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
273730cfbc0SXuan Hu      og1Resp.bits.addrOH := io.fromDataPath(i)(j).og1resp.bits.addrOH
274*8d29ec32Sczw      og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
275*8d29ec32Sczw      og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
276*8d29ec32Sczw
277*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.valid := io.fromDataPath(i)(j).og1resp.valid
278*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.fuType := io.fromDataPath(i)(j).og1resp.bits.fuType
279*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.respType := io.fromDataPath(i)(j).og1resp.bits.respType
280*8d29ec32Sczw      io.wbFuBusyTable.fuBusyTableWrite(i)(j).og1Resp.bits.rfWen := io.fromDataPath(i)(j).og1resp.bits.rfWen
281730cfbc0SXuan Hu    }
282730cfbc0SXuan Hu  }
283730cfbc0SXuan Hu
284730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
285730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
286730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
287730cfbc0SXuan Hu    iq.io.wakeup := wakeupFromWBVec
288730cfbc0SXuan Hu  }
289730cfbc0SXuan Hu
2907b753bebSXuan Hu  ldAddrIQs.foreach {
2917b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.ldaFeedback
2927b753bebSXuan Hu    case _ =>
2937b753bebSXuan Hu  }
2947b753bebSXuan Hu
2957b753bebSXuan Hu  stAddrIQs.foreach {
2967b753bebSXuan Hu    case imp: IssueQueueMemAddrImp => imp.io.memIO.get.feedbackIO <> io.fromMem.get.staFeedback
2977b753bebSXuan Hu    case _ =>
2987b753bebSXuan Hu  }
299730cfbc0SXuan Hu
300730cfbc0SXuan Hu  dispatch2Iq.io.out(1).zip(stAddrIQs(0).io.enq).zip(stDataIQs(0).io.enq).foreach{ case((di, staIQ), stdIQ) =>
301730cfbc0SXuan Hu    val isAllReady = staIQ.ready && stdIQ.ready
302730cfbc0SXuan Hu    di.ready := isAllReady
303730cfbc0SXuan Hu    staIQ.valid := di.valid && isAllReady
304730cfbc0SXuan Hu    stdIQ.valid := di.valid && isAllReady
305730cfbc0SXuan Hu  }
306730cfbc0SXuan Hu
307730cfbc0SXuan Hu  require(stAddrIQs.size == stDataIQs.size, s"number of store address IQs(${stAddrIQs.size}) " +
308730cfbc0SXuan Hu    s"should be equal to number of data IQs(${stDataIQs})")
309730cfbc0SXuan Hu  stDataIQs.zip(stAddrIQs).zipWithIndex.foreach { case ((stdIQ, staIQ), i) =>
310730cfbc0SXuan Hu    stdIQ.io.flush <> io.fromCtrlBlock.flush
311730cfbc0SXuan Hu
312730cfbc0SXuan Hu    stdIQ.io.enq.zip(staIQ.io.enq).foreach { case (stdIQEnq, staIQEnq) =>
313730cfbc0SXuan Hu      stdIQEnq.bits  := staIQEnq.bits
314730cfbc0SXuan Hu      // Store data reuses store addr src(1) in dispatch2iq
315730cfbc0SXuan Hu      // [dispatch2iq] --src*------src*(0)--> [staIQ]
316730cfbc0SXuan Hu      //                       \
317730cfbc0SXuan Hu      //                        ---src*(1)--> [stdIQ]
318730cfbc0SXuan Hu      // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
319730cfbc0SXuan Hu      // instead of dispatch2Iq.io.out(x).bits.src*(1)
320730cfbc0SXuan Hu      stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(1)
321730cfbc0SXuan Hu      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(1)
322730cfbc0SXuan Hu      stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(1)
323730cfbc0SXuan Hu      stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
324730cfbc0SXuan Hu    }
325730cfbc0SXuan Hu    stdIQ.io.wakeup := wakeupFromWBVec
326730cfbc0SXuan Hu  }
327730cfbc0SXuan Hu
328730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
329730cfbc0SXuan Hu
330730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
331730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
332730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
333730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
334730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
335730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
336730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
337730cfbc0SXuan Hu}
338