xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 82674533125d3d049f50148b1d9e215e1463f136)
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}
74fa00a44SzhanglyGitimport utils.OptionWrapper
8730cfbc0SXuan Huimport xiangshan._
910fe9778SXuan Huimport xiangshan.backend.Bundles._
1060f0c5aeSxiaofeibaoimport xiangshan.backend.datapath.DataConfig.{IntData, VAddrData, VecData, FpData}
1160f0c5aeSxiaofeibaoimport xiangshan.backend.datapath.WbConfig.{IntWB, FpWB, VfWB}
12e62b6911SXuan Huimport xiangshan.backend.fu.FuType
13730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig
14730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable
152d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr}
16730cfbc0SXuan Hu
17730cfbc0SXuan Husealed trait SchedulerType
18730cfbc0SXuan Hu
19730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType
2060f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType
21730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType
22730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType
23730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType
24730cfbc0SXuan Hu
25730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
261ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
271ca4a39dSXuan Hu
2839c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
2960f0c5aeSxiaofeibao  val numFpStateWrite = backendParams.numPregWb(FpData())
3039c59369SXuan Hu  val numVfStateWrite = backendParams.numPregWb(VecData())
31730cfbc0SXuan Hu
32730cfbc0SXuan Hu  val dispatch2Iq = LazyModule(new Dispatch2Iq(params))
33730cfbc0SXuan Hu  val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName)))
34730cfbc0SXuan Hu
3583ba63b3SXuan Hu  lazy val module: SchedulerImpBase = params.schdType match {
36730cfbc0SXuan Hu    case IntScheduler() => new SchedulerArithImp(this)(params, p)
3760f0c5aeSxiaofeibao    case FpScheduler()  => new SchedulerArithImp(this)(params, p)
38730cfbc0SXuan Hu    case MemScheduler() => new SchedulerMemImp(this)(params, p)
39730cfbc0SXuan Hu    case VfScheduler() => new SchedulerArithImp(this)(params, p)
40730cfbc0SXuan Hu    case _ => null
41730cfbc0SXuan Hu  }
42730cfbc0SXuan Hu}
43730cfbc0SXuan Hu
447f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle {
4568d13085SXuan Hu  // params alias
467f8233d5SHaojin Tang  private val LoadQueueSize = VirtualLoadQueueSize
4768d13085SXuan Hu
48730cfbc0SXuan Hu  val fromTop = new Bundle {
49730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
50730cfbc0SXuan Hu  }
512e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
522e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
532e0a7dc5Sfdy  }
54dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
55*82674533Sxiaofeibao  val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle))
56*82674533Sxiaofeibao  val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle))
57dd970561SzhanglyGit
58730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
59730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
60730cfbc0SXuan Hu  }
61730cfbc0SXuan Hu  val fromDispatch = new Bundle {
62730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
63730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
64730cfbc0SXuan Hu  }
6539c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
66730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
6760f0c5aeSxiaofeibao  val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()),
6860f0c5aeSxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
6939c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
70730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
7159ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
72730cfbc0SXuan Hu
73b6279fc6SZiyue Zhang  val vlWriteBack = new Bundle {
74b6279fc6SZiyue Zhang    val vlIsZero = Input(Bool())
75b6279fc6SZiyue Zhang    val vlIsVlmax = Input(Bool())
76b6279fc6SZiyue Zhang  }
77b6279fc6SZiyue Zhang
78bf35baadSXuan Hu  val fromSchedulers = new Bundle {
79c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
80bf35baadSXuan Hu  }
81bf35baadSXuan Hu
82bf35baadSXuan Hu  val toSchedulers = new Bundle {
83c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
84bf35baadSXuan Hu  }
85bf35baadSXuan Hu
86c0be7f33SXuan Hu  val fromDataPath = new Bundle {
8710fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
887a96cc7fSHaojin Tang    val og0Cancel = Input(ExuOH(backendParams.numExu))
89ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
907a96cc7fSHaojin Tang    val og1Cancel = Input(ExuOH(backendParams.numExu))
91bc7d6943SzhanglyGit    val cancelToBusyTable = Vec(backendParams.numExu, Flipped(ValidIO(new CancelSignal)))
92c0be7f33SXuan Hu    // just be compatible to old code
93c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
94c0be7f33SXuan Hu  }
95c0be7f33SXuan Hu
968a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
978a66c02cSXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
987e471bf8SXuan Hu  val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
990f55a0d3SHaojin Tang
1006810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
101c0be7f33SXuan Hu
102730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
103730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
104730cfbc0SXuan Hu  }) else None
105730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1067b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1077b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1088f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
109fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
110fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
111730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
112730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
113730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
114fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1152d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1162d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
117730cfbc0SXuan Hu    // from lsq
118730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
119730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
120730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
121730cfbc0SXuan Hu  }) else None
122730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
123730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
124730cfbc0SXuan Hu  }) else None
125c38df446SzhanglyGit  val fromOg2 = if(params.isVfSchd) Some(MixedVec(params.issueBlockParams.map(x => Flipped(x.genOG2RespBundle)))) else None
126730cfbc0SXuan Hu}
127730cfbc0SXuan Hu
128730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
129730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
130730cfbc0SXuan Hu    with HasXSParameter
131730cfbc0SXuan Hu{
132730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
133730cfbc0SXuan Hu
134730cfbc0SXuan Hu  // alias
135c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
136c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
137730cfbc0SXuan Hu  private val schdType = params.schdType
138730cfbc0SXuan Hu
139730cfbc0SXuan Hu  // Modules
140730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
141730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
142*82674533Sxiaofeibao  io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec)
143*82674533Sxiaofeibao  io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec)
144ff3fcdf1Sxiaofeibao-xjtu  if (params.isIntSchd) {
145*82674533Sxiaofeibao    dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec
146*82674533Sxiaofeibao    io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
147ff3fcdf1Sxiaofeibao-xjtu  }
148*82674533Sxiaofeibao  else if (params.isFpSchd) {
149*82674533Sxiaofeibao    dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec
150*82674533Sxiaofeibao    io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
151*82674533Sxiaofeibao  }
152730cfbc0SXuan Hu
15356bcaed7SHaojin Tang  // valid count
15456bcaed7SHaojin Tang  dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt)
15556bcaed7SHaojin Tang
156730cfbc0SXuan Hu  // BusyTable Modules
157730cfbc0SXuan Hu  val intBusyTable = schdType match {
158bc7d6943SzhanglyGit    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB())))
159730cfbc0SXuan Hu    case _ => None
160730cfbc0SXuan Hu  }
16160f0c5aeSxiaofeibao  val fpBusyTable = schdType match {
16260f0c5aeSxiaofeibao    case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB())))
16360f0c5aeSxiaofeibao    case _ => None
16460f0c5aeSxiaofeibao  }
165730cfbc0SXuan Hu  val vfBusyTable = schdType match {
166bc7d6943SzhanglyGit    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB())))
167730cfbc0SXuan Hu    case _ => None
168730cfbc0SXuan Hu  }
169730cfbc0SXuan Hu
170730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
171730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
172730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
173730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
17460f0c5aeSxiaofeibao    dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read)
175730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
176730cfbc0SXuan Hu  }
177730cfbc0SXuan Hu
178730cfbc0SXuan Hu  intBusyTable match {
179730cfbc0SXuan Hu    case Some(bt) =>
180730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
181730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
182730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
183730cfbc0SXuan Hu      }
184730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
185730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
186730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
187730cfbc0SXuan Hu      }
188bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
189bc7d6943SzhanglyGit      bt.io.cancel := io.fromDataPath.cancelToBusyTable
19013551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
191730cfbc0SXuan Hu    case None =>
192730cfbc0SXuan Hu  }
193730cfbc0SXuan Hu
19460f0c5aeSxiaofeibao  fpBusyTable match {
195730cfbc0SXuan Hu    case Some(bt) =>
196730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
197730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
198730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
199730cfbc0SXuan Hu      }
200730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
20160f0c5aeSxiaofeibao        wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen
20260f0c5aeSxiaofeibao        wb.bits := io.fpWriteBack(i).addr
20360f0c5aeSxiaofeibao      }
20460f0c5aeSxiaofeibao      bt.io.wakeUp := io.fromSchedulers.wakeupVec
20560f0c5aeSxiaofeibao      bt.io.cancel := io.fromDataPath.cancelToBusyTable
20660f0c5aeSxiaofeibao      bt.io.ldCancel := io.ldCancel
20760f0c5aeSxiaofeibao    case None =>
20860f0c5aeSxiaofeibao  }
20960f0c5aeSxiaofeibao
21060f0c5aeSxiaofeibao  vfBusyTable match {
21160f0c5aeSxiaofeibao    case Some(bt) =>
21260f0c5aeSxiaofeibao      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
21360f0c5aeSxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVec
21460f0c5aeSxiaofeibao        btAllocPregs.bits := dpAllocPregs.preg
21560f0c5aeSxiaofeibao      }
21660f0c5aeSxiaofeibao      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
21760f0c5aeSxiaofeibao        wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen
218730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
219730cfbc0SXuan Hu      }
220bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
221bc7d6943SzhanglyGit      bt.io.cancel := io.fromDataPath.cancelToBusyTable
22213551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
223730cfbc0SXuan Hu    case None =>
224730cfbc0SXuan Hu  }
225730cfbc0SXuan Hu
226f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
22760f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
228f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
229f39a61a1SzhanglyGit
230f39a61a1SzhanglyGit  wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) =>
231f39a61a1SzhanglyGit    sink.valid := source.wen
232f39a61a1SzhanglyGit    sink.bits.rfWen := source.intWen
233f39a61a1SzhanglyGit    sink.bits.fpWen := source.fpWen
234f39a61a1SzhanglyGit    sink.bits.vecWen := source.vecWen
235f39a61a1SzhanglyGit    sink.bits.pdest := source.addr
236730cfbc0SXuan Hu  }
237f39a61a1SzhanglyGit
23860f0c5aeSxiaofeibao  wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) =>
23960f0c5aeSxiaofeibao    sink.valid := source.wen
24060f0c5aeSxiaofeibao    sink.bits.rfWen := source.intWen
24160f0c5aeSxiaofeibao    sink.bits.fpWen := source.fpWen
24260f0c5aeSxiaofeibao    sink.bits.vecWen := source.vecWen
24360f0c5aeSxiaofeibao    sink.bits.pdest := source.addr
24460f0c5aeSxiaofeibao  }
24560f0c5aeSxiaofeibao
246f39a61a1SzhanglyGit  wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) =>
247730cfbc0SXuan Hu    sink.valid := source.wen
248730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
249730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
250730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
251730cfbc0SXuan Hu    sink.bits.pdest := source.addr
252730cfbc0SXuan Hu  }
253730cfbc0SXuan Hu
254bf35baadSXuan Hu  // Connect bundles having the same wakeup source
25559ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
256bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
2570c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
2580c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
2590c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
2600c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
2610c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
2620c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
2630c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
2640c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2654c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2664c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2674c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2684c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2690c7ebb58Sxiaofeibao-xjtu      }
27060912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
27160f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
27260912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
273bf35baadSXuan Hu    }
274ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
275ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
2760f55a0d3SHaojin Tang    iq.io.ldCancel := io.ldCancel
277bf35baadSXuan Hu  }
278bf35baadSXuan Hu
279b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
280b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
281b6279fc6SZiyue Zhang    iq.io.vlIsVlmax := io.vlWriteBack.vlIsVlmax
282b6279fc6SZiyue Zhang    iq.io.vlIsZero := io.vlWriteBack.vlIsZero
283b6279fc6SZiyue Zhang  }
284b6279fc6SZiyue Zhang
285c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
286bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
287c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
288bf35baadSXuan Hu      .toMap
289bf35baadSXuan Hu
290bf35baadSXuan Hu  // Connect bundles having the same wakeup source
291bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
292c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
293bf35baadSXuan Hu  }
294bf35baadSXuan Hu
29559ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
29659ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
29759ef6009Sxiaofeibao-xjtu  }
298bf35baadSXuan Hu
299f99b81adSHaojin Tang  // Response
300f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
301f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
302f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
303f99b81adSHaojin Tang    }
304f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
305f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
306f99b81adSHaojin Tang    }
307f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
308670870b3SXuan Hu      if (io.loadFinalIssueResp(i).isDefinedAt(j)) {
309f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
310670870b3SXuan Hu      } else {
311670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
312670870b3SXuan Hu      }
313f99b81adSHaojin Tang    })
314e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
315aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
316e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
317aa2bcc31SzhanglyGit      } else {
318aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
319aa2bcc31SzhanglyGit      }
320e8800897SXuan Hu    })
3217e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
3227e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
3237e471bf8SXuan Hu    })
324c38df446SzhanglyGit    if(params.isVfSchd) {
325c38df446SzhanglyGit      iq.io.og2Resp.get.zipWithIndex.foreach { case (og2Resp, exuIdx) =>
326c38df446SzhanglyGit        og2Resp := io.fromOg2.get(i)(exuIdx)
327c38df446SzhanglyGit      }
328c38df446SzhanglyGit    }
329f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
330f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
331f99b81adSHaojin Tang  }
332f99b81adSHaojin Tang
333c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
334bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
335bf35baadSXuan Hu
336bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
337c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
338730cfbc0SXuan Hu}
339730cfbc0SXuan Hu
340730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
341730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
342730cfbc0SXuan Hu    with HasXSParameter
343730cfbc0SXuan Hu{
3442e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
345730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
346730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
347730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
348730cfbc0SXuan Hu
349730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
350730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
351730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
352f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
353f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
35460f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
355b8475955SzhanglyGit      case VfScheduler() => wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1)
356596af5d2SHaojin Tang      case _ => null
357f39a61a1SzhanglyGit    }
358f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
359730cfbc0SXuan Hu  }
360730cfbc0SXuan Hu}
361730cfbc0SXuan Hu
362f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
363730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
364730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
365730cfbc0SXuan Hu    with HasXSParameter
366730cfbc0SXuan Hu{
367730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
368730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
369730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
370730cfbc0SXuan Hu
371559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
372e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
373e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
374e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
375559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
376559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
377499caf4cSXuan Hu
378499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
379499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
380499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
381499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
382499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
383730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
384730cfbc0SXuan Hu
385853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
386853cd2d8SHaojin Tang
387fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
388596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
389596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
390596af5d2SHaojin Tang
391730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
392730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
393730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
39460f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
39560f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
39660f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
39760f0c5aeSxiaofeibao      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1)
39860f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
399730cfbc0SXuan Hu  }
400730cfbc0SXuan Hu
401ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
402ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
403ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
404c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
405de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4067b753bebSXuan Hu    case _ =>
4077b753bebSXuan Hu  }
4087b753bebSXuan Hu
409ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
410ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
411ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
412c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
413c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4147b753bebSXuan Hu    case _ =>
4157b753bebSXuan Hu  }
416730cfbc0SXuan Hu
417559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
418559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
419670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
420670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
4218f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
4228f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
423559c1710SHaojin Tang      // TODO: refactor ditry code
424559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
425559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
426559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
4278f1fa9b1Ssfencevma    case _ =>
4288f1fa9b1Ssfencevma  }
4298f1fa9b1Ssfencevma
430e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
431e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
432e62b6911SXuan Hu
433e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
434e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
435e62b6911SXuan Hu
436e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
437e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
438e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
439e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
440e62b6911SXuan Hu
441e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
442e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
443e62b6911SXuan Hu
444e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
445e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
4469b258a00Sxgkiri
4470438e8f4SHaojin Tang  val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten
4480438e8f4SHaojin Tang  d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) =>
449730cfbc0SXuan Hu    val isAllReady = staIQ.ready && stdIQ.ready
450e62b6911SXuan Hu    dp.ready := isAllReady
451e62b6911SXuan Hu    staIQ.valid := dp.valid && isAllReady
4520438e8f4SHaojin Tang    stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
4539b258a00Sxgkiri  }
454730cfbc0SXuan Hu
4550438e8f4SHaojin Tang  val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten
4560438e8f4SHaojin Tang  d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) =>
457e62b6911SXuan Hu    val isAllReady = hyaIQ.ready && hydIQ.ready
458e62b6911SXuan Hu    dp.ready := isAllReady
459e62b6911SXuan Hu    hyaIQ.valid := dp.valid && isAllReady
46056bceacbSHaojin Tang    hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
461e62b6911SXuan Hu  }
462730cfbc0SXuan Hu
463e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
464e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
46560f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
46660f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
46760f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
46860f0c5aeSxiaofeibao      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
46960f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
470e62b6911SXuan Hu  }
471e62b6911SXuan Hu
472e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
473730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
474730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
475e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
476730cfbc0SXuan Hu    //                       \
477730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
478730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
479730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
48097b279b9SXuan Hu    val stdIdx = 1
4812d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
48213551487SzhanglyGit    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(1)
4832d270511Ssinsanction      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
4842d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
485730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
486730cfbc0SXuan Hu  }
487730cfbc0SXuan Hu
4882d270511Ssinsanction  vecMemIQs.foreach {
4892d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
4902d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
4912d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
4921f3d1b4dSXuan Hu      // not used
493b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
4941f3d1b4dSXuan Hu      // maybe not used
4951f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
4961f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
49760f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
49860f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
49960f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
50060f0c5aeSxiaofeibao        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
50160f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
502f39a61a1SzhanglyGit
5032d270511Ssinsanction    case _ =>
5042d270511Ssinsanction  }
505b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
506b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
507b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
508b7c799beSzhanglyGit  }.flatten
509b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
510b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
511b7c799beSzhanglyGit    case (sink, source) =>
512b7c799beSzhanglyGit      sink := source
513b7c799beSzhanglyGit  }
5142d270511Ssinsanction
515730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
516730cfbc0SXuan Hu
517730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
518730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
519730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
520730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
521730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
522730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
523f3a9fb05SAnzo  dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount
524f3a9fb05SAnzo  dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount
525730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
5267e471bf8SXuan Hu
5277e471bf8SXuan Hu  dontTouch(io.vecLoadIssueResp)
528730cfbc0SXuan Hu}
529