xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 9df83ee5e7ad51c64317960c5510d54ed718e1e2)
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}
744f2941bSJiru Sunimport utility.HasPerfEvents
844f2941bSJiru Sunimport utils.OptionWrapper
9730cfbc0SXuan Huimport xiangshan._
1010fe9778SXuan Huimport xiangshan.backend.Bundles._
11c720aa49Ssinsanctionimport xiangshan.backend.datapath.DataConfig._
12c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig._
13e62b6911SXuan Huimport xiangshan.backend.fu.FuType
14730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig
152d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr}
16c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB
17c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams
18955b4beaSsinsanctionimport xiangshan.backend.regcache.RegCacheTagTable
19730cfbc0SXuan Hu
20730cfbc0SXuan Husealed trait SchedulerType
21730cfbc0SXuan Hu
22730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType
2360f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType
24730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType
25730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType
26730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType
27730cfbc0SXuan Hu
28730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
291ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
301ca4a39dSXuan Hu
3139c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
3260f0c5aeSxiaofeibao  val numFpStateWrite = backendParams.numPregWb(FpData())
3339c59369SXuan Hu  val numVfStateWrite = backendParams.numPregWb(VecData())
3407b5cc60Sxiaofeibao  val numV0StateWrite = backendParams.numPregWb(V0Data())
3507b5cc60Sxiaofeibao  val numVlStateWrite = backendParams.numPregWb(VlData())
36730cfbc0SXuan Hu
37730cfbc0SXuan Hu  val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName)))
38730cfbc0SXuan Hu
3983ba63b3SXuan Hu  lazy val module: SchedulerImpBase = params.schdType match {
40730cfbc0SXuan Hu    case IntScheduler() => new SchedulerArithImp(this)(params, p)
4160f0c5aeSxiaofeibao    case FpScheduler()  => new SchedulerArithImp(this)(params, p)
42730cfbc0SXuan Hu    case MemScheduler() => new SchedulerMemImp(this)(params, p)
43730cfbc0SXuan Hu    case VfScheduler() => new SchedulerArithImp(this)(params, p)
44730cfbc0SXuan Hu    case _ => null
45730cfbc0SXuan Hu  }
46730cfbc0SXuan Hu}
47730cfbc0SXuan Hu
487f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle {
4968d13085SXuan Hu  // params alias
507f8233d5SHaojin Tang  private val LoadQueueSize = VirtualLoadQueueSize
510a7d1d5cSxiaofeibao  val fromDispatchUopNum = params.issueBlockParams.filter(x => x.StdCnt == 0).map(_.numEnq).sum
520a7d1d5cSxiaofeibao  val allIssueParams = params.issueBlockParams.filter(_.StdCnt == 0)
530a7d1d5cSxiaofeibao  val IssueQueueDeqSum = allIssueParams.map(_.numDeq).sum
540a7d1d5cSxiaofeibao  val maxIQSize = allIssueParams.map(_.numEntries).max
55730cfbc0SXuan Hu  val fromTop = new Bundle {
56730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
57730cfbc0SXuan Hu  }
582e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
592e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
602e0a7dc5Sfdy  }
61dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
620a7d1d5cSxiaofeibao  val IQValidNumVec = Output(Vec(IssueQueueDeqSum, UInt((maxIQSize).U.getWidth.W)))
63dd970561SzhanglyGit
64730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
65730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
66730cfbc0SXuan Hu  }
67730cfbc0SXuan Hu  val fromDispatch = new Bundle {
680a7d1d5cSxiaofeibao    val uops =  Vec(fromDispatchUopNum, Flipped(DecoupledIO(new DynInst)))
69730cfbc0SXuan Hu  }
7039c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
71730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
7260f0c5aeSxiaofeibao  val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()),
7360f0c5aeSxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
7439c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
75730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
7607b5cc60Sxiaofeibao  val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()),
77c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth)))
7807b5cc60Sxiaofeibao  val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()),
79c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth)))
80*9df83ee5Sxiaofeibao  val intWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(IntData()),
81*9df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
82*9df83ee5Sxiaofeibao  val fpWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(FpData()),
83*9df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
84*9df83ee5Sxiaofeibao  val vfWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VecData()),
85*9df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
86*9df83ee5Sxiaofeibao  val v0WriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(V0Data()),
87*9df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth)))
88*9df83ee5Sxiaofeibao  val vlWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VlData()),
89*9df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth)))
9059ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
91730cfbc0SXuan Hu
92c720aa49Ssinsanction  val vlWriteBackInfo = new Bundle {
93d88d4328SZiyue Zhang    val vlFromIntIsZero  = Input(Bool())
94d88d4328SZiyue Zhang    val vlFromIntIsVlmax = Input(Bool())
95d88d4328SZiyue Zhang    val vlFromVfIsZero   = Input(Bool())
96d88d4328SZiyue Zhang    val vlFromVfIsVlmax  = Input(Bool())
97b6279fc6SZiyue Zhang  }
98b6279fc6SZiyue Zhang
99bf35baadSXuan Hu  val fromSchedulers = new Bundle {
100c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
101*9df83ee5Sxiaofeibao    val wakeupVecDelayed: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
102bf35baadSXuan Hu  }
103bf35baadSXuan Hu
104bf35baadSXuan Hu  val toSchedulers = new Bundle {
105c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
106bf35baadSXuan Hu  }
107bf35baadSXuan Hu
108c0be7f33SXuan Hu  val fromDataPath = new Bundle {
10910fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
110be9ff987Ssinsanction    val og0Cancel = Input(ExuVec())
111ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
112be9ff987Ssinsanction    val og1Cancel = Input(ExuVec())
113f8b278aaSsinsanction    // replace RCIdx to Wakeup Queue
114f8b278aaSsinsanction    val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W))))
115c0be7f33SXuan Hu    // just be compatible to old code
116c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
117c0be7f33SXuan Hu  }
118c0be7f33SXuan Hu
1198a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1203bba894fSxiaofeibao  val vecLoadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1218a66c02cSXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1227e471bf8SXuan Hu  val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1230f55a0d3SHaojin Tang
1246810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
125c0be7f33SXuan Hu
126730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1277b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1287b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1298f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
130fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
131fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
132730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
133730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
134730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
135fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1362d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1372d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
138730cfbc0SXuan Hu    // from lsq
139730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
140730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
141730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
142730cfbc0SXuan Hu  }) else None
143730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
144730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
145730cfbc0SXuan Hu  }) else None
14642b6cdf9Ssinsanction  val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None
147730cfbc0SXuan Hu}
148730cfbc0SXuan Hu
149730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
150730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
151730cfbc0SXuan Hu    with HasXSParameter
152730cfbc0SXuan Hu{
153730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
154730cfbc0SXuan Hu
155730cfbc0SXuan Hu  // alias
156c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
157c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
158*9df83ee5Sxiaofeibao  private val iqWakeUpInMapDelayed: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
159*9df83ee5Sxiaofeibao    io.fromSchedulers.wakeupVecDelayed.map(x => (x.bits.exuIdx, x)).toMap
160730cfbc0SXuan Hu  private val schdType = params.schdType
161730cfbc0SXuan Hu
162730cfbc0SXuan Hu  // Modules
163730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
164730cfbc0SXuan Hu
1650a7d1d5cSxiaofeibao  io.IQValidNumVec := issueQueues.filter(_.params.StdCnt == 0).map(_.io.validCntDeqVec).flatten
166f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
16760f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
168f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
169c720aa49Ssinsanction  val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle)
170c720aa49Ssinsanction  val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle)
171*9df83ee5Sxiaofeibao  val wakeupFromIntWBVecDelayed = Wire(params.genIntWBWakeUpSinkValidBundle)
172*9df83ee5Sxiaofeibao  val wakeupFromFpWBVecDelayed = Wire(params.genFpWBWakeUpSinkValidBundle)
173*9df83ee5Sxiaofeibao  val wakeupFromVfWBVecDelayed = Wire(params.genVfWBWakeUpSinkValidBundle)
174*9df83ee5Sxiaofeibao  val wakeupFromV0WBVecDelayed = Wire(params.genV0WBWakeUpSinkValidBundle)
175*9df83ee5Sxiaofeibao  val wakeupFromVlWBVecDelayed = Wire(params.genVlWBWakeUpSinkValidBundle)
176f39a61a1SzhanglyGit
177*9df83ee5Sxiaofeibao  val wakeupFromWBVec = Seq(wakeupFromIntWBVec, wakeupFromFpWBVec, wakeupFromVfWBVec, wakeupFromV0WBVec, wakeupFromVlWBVec)
178*9df83ee5Sxiaofeibao  val allWriteBack = Seq(io.intWriteBack, io.fpWriteBack, io.vfWriteBack, io.v0WriteBack, io.vlWriteBack)
179*9df83ee5Sxiaofeibao  wakeupFromWBVec.zip(allWriteBack).map{ case (sinks, sources) =>
180*9df83ee5Sxiaofeibao    sinks.zip(sources).map{ case (sink, source) =>
181f39a61a1SzhanglyGit      sink.valid := source.wen
182f39a61a1SzhanglyGit      sink.bits.rfWen := source.intWen
183f39a61a1SzhanglyGit      sink.bits.fpWen := source.fpWen
184f39a61a1SzhanglyGit      sink.bits.vecWen := source.vecWen
185c720aa49Ssinsanction      sink.bits.v0Wen := source.v0Wen
186c720aa49Ssinsanction      sink.bits.vlWen := source.vlWen
187f39a61a1SzhanglyGit      sink.bits.pdest := source.addr
188730cfbc0SXuan Hu    }
189*9df83ee5Sxiaofeibao  }
190f39a61a1SzhanglyGit
191*9df83ee5Sxiaofeibao  val wakeupFromWBVecDelayed = Seq(wakeupFromIntWBVecDelayed, wakeupFromFpWBVecDelayed, wakeupFromVfWBVecDelayed, wakeupFromV0WBVecDelayed, wakeupFromVlWBVecDelayed)
192*9df83ee5Sxiaofeibao  val allWriteBackDelayed = Seq(io.intWriteBackDelayed, io.fpWriteBackDelayed, io.vfWriteBackDelayed, io.v0WriteBackDelayed, io.vlWriteBackDelayed)
193*9df83ee5Sxiaofeibao  wakeupFromWBVecDelayed.zip(allWriteBackDelayed).map { case (sinks, sources) =>
194*9df83ee5Sxiaofeibao    sinks.zip(sources).map { case (sink, source) =>
19560f0c5aeSxiaofeibao      sink.valid := source.wen
19660f0c5aeSxiaofeibao      sink.bits.rfWen := source.intWen
19760f0c5aeSxiaofeibao      sink.bits.fpWen := source.fpWen
19860f0c5aeSxiaofeibao      sink.bits.vecWen := source.vecWen
199c720aa49Ssinsanction      sink.bits.v0Wen := source.v0Wen
200c720aa49Ssinsanction      sink.bits.vlWen := source.vlWen
20160f0c5aeSxiaofeibao      sink.bits.pdest := source.addr
20260f0c5aeSxiaofeibao    }
203c720aa49Ssinsanction  }
204bf35baadSXuan Hu  // Connect bundles having the same wakeup source
20559ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
206bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
2070c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
2080c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
2090c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
2100c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
2110c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
2120c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
2130c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
2140c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2154c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2164c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2174c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
218c720aa49Ssinsanction        if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
219c720aa49Ssinsanction        if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2204c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2210c7ebb58Sxiaofeibao-xjtu      }
22260912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
22360f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
22460912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
225c720aa49Ssinsanction      if (iq.params.numV0Src == 0)  wakeUp.bits.v0Wen := false.B
226c720aa49Ssinsanction      if (iq.params.numVlSrc == 0)  wakeUp.bits.vlWen := false.B
227bf35baadSXuan Hu    }
228*9df83ee5Sxiaofeibao    iq.io.wakeupFromIQDelayed.foreach { wakeUp =>
229*9df83ee5Sxiaofeibao      val wakeUpIn = iqWakeUpInMapDelayed(wakeUp.bits.exuIdx)
230*9df83ee5Sxiaofeibao      connectSamePort(wakeUp, wakeUpIn)
231*9df83ee5Sxiaofeibao      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
232*9df83ee5Sxiaofeibao      if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B
233*9df83ee5Sxiaofeibao      if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B
234*9df83ee5Sxiaofeibao      if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B
235*9df83ee5Sxiaofeibao      if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B
236*9df83ee5Sxiaofeibao    }
237ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
238ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
239e600b1ddSxiaofeibao-xjtu    if (iq.params.needLoadDependency)
2400f55a0d3SHaojin Tang      iq.io.ldCancel := io.ldCancel
241e600b1ddSxiaofeibao-xjtu    else
242e600b1ddSxiaofeibao-xjtu      iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel)
243bf35baadSXuan Hu  }
244bf35baadSXuan Hu
245b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
246b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
247d88d4328SZiyue Zhang    iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax
248d88d4328SZiyue Zhang    iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero
249d88d4328SZiyue Zhang    iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax
250d88d4328SZiyue Zhang    iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero
251b6279fc6SZiyue Zhang  }
252b6279fc6SZiyue Zhang
253c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
254bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
255c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
256bf35baadSXuan Hu      .toMap
257bf35baadSXuan Hu
258bf35baadSXuan Hu  // Connect bundles having the same wakeup source
259bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
260c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
261bf35baadSXuan Hu  }
262bf35baadSXuan Hu
26359ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
26459ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
26559ef6009Sxiaofeibao-xjtu  }
266bf35baadSXuan Hu
267f99b81adSHaojin Tang  // Response
268f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
269f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
270f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
271f99b81adSHaojin Tang    }
272f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
273f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
274f99b81adSHaojin Tang    }
275f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
2763bba894fSxiaofeibao      if (io.loadFinalIssueResp(i).isDefinedAt(j) && iq.params.isLdAddrIQ) {
277f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
2783bba894fSxiaofeibao      } else if (io.vecLoadFinalIssueResp(i).isDefinedAt(j) && iq.params.isVecLduIQ) {
2793bba894fSxiaofeibao        finalIssueResp := io.vecLoadFinalIssueResp(i)(j)
2803bba894fSxiaofeibao      }
2813bba894fSxiaofeibao      else {
282670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
283670870b3SXuan Hu      }
284f99b81adSHaojin Tang    })
285e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
286aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
287e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
288aa2bcc31SzhanglyGit      } else {
289aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
290aa2bcc31SzhanglyGit      }
291e8800897SXuan Hu    })
2927e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
2937e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
2947e471bf8SXuan Hu    })
295f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
296f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
297f8b278aaSsinsanction    iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x))
298f8b278aaSsinsanction  }
29942b6cdf9Ssinsanction  if (params.needOg2Resp) {
30042b6cdf9Ssinsanction    issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) =>
30142b6cdf9Ssinsanction      iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) =>
30242b6cdf9Ssinsanction        iqOg2Resp := og2Resp
30342b6cdf9Ssinsanction      }
30442b6cdf9Ssinsanction    }
30542b6cdf9Ssinsanction  }
306f8b278aaSsinsanction
307f8b278aaSsinsanction  // Connect each replace RCIdx to IQ
308f8b278aaSsinsanction  if (params.needWriteRegCache) {
309f8b278aaSsinsanction    val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq =>
310f8b278aaSsinsanction      iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2)
311f8b278aaSsinsanction    }
312f8b278aaSsinsanction    iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) =>
313f8b278aaSsinsanction      iq := in
314f8b278aaSsinsanction    }
315f8b278aaSsinsanction
316f8b278aaSsinsanction    println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}")
317f8b278aaSsinsanction    println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}")
318f99b81adSHaojin Tang  }
319f99b81adSHaojin Tang
320e1a85e9fSchengguanghui  // perfEvent
321e1a85e9fSchengguanghui  val lastCycleIqEnqFireVec    = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten))
322e1a85e9fSchengguanghui  val lastCycleIqFullVec       = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready)))
323e1a85e9fSchengguanghui
324e1a85e9fSchengguanghui  val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) }
325e1a85e9fSchengguanghui  val basePerfEvents = Seq(
326e1a85e9fSchengguanghui    ("issueQueue_enq_fire_cnt",  PopCount(lastCycleIqEnqFireVec)                    )
327e1a85e9fSchengguanghui  )  ++ issueQueueFullVecPerf
328e1a85e9fSchengguanghui
329c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
330bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
331bf35baadSXuan Hu
332bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
333c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
334730cfbc0SXuan Hu}
335730cfbc0SXuan Hu
336730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
337730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
338730cfbc0SXuan Hu    with HasXSParameter
339e1a85e9fSchengguanghui    with HasPerfEvents
340730cfbc0SXuan Hu{
3410a7d1d5cSxiaofeibao  val issueQueuesUopIn = issueQueues.map(_.io.enq).flatten
3420a7d1d5cSxiaofeibao  issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2)
343730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
344730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
345e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
346e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
347e600b1ddSxiaofeibao-xjtu    }
348f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
349f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
35060f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
351c720aa49Ssinsanction      case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
352c720aa49Ssinsanction                             wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
353c720aa49Ssinsanction                             wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
354596af5d2SHaojin Tang      case _ => null
355f39a61a1SzhanglyGit    }
356*9df83ee5Sxiaofeibao    val intWBIQDelayed = params.schdType match {
357*9df83ee5Sxiaofeibao      case IntScheduler() => wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
358*9df83ee5Sxiaofeibao      case FpScheduler() => wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
359*9df83ee5Sxiaofeibao      case VfScheduler() => (wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
360*9df83ee5Sxiaofeibao                             wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
361*9df83ee5Sxiaofeibao                             wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
362*9df83ee5Sxiaofeibao      case _ => null
363*9df83ee5Sxiaofeibao    }
364f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
365*9df83ee5Sxiaofeibao    iq.io.wakeupFromWBDelayed.zip(intWBIQDelayed).foreach{ case (sink, source) => sink := source}
366730cfbc0SXuan Hu  }
367e1a85e9fSchengguanghui
368e1a85e9fSchengguanghui  val perfEvents = basePerfEvents
369e1a85e9fSchengguanghui  generatePerfEvent()
370730cfbc0SXuan Hu}
371730cfbc0SXuan Hu
372f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
373730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
374730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
375730cfbc0SXuan Hu    with HasXSParameter
376e1a85e9fSchengguanghui    with HasPerfEvents
377730cfbc0SXuan Hu{
378730cfbc0SXuan Hu
3790a7d1d5cSxiaofeibao  val issueQueuesUopIn = issueQueues.filter(_.params.StdCnt == 0).map(_.io.enq).flatten
3800a7d1d5cSxiaofeibao  issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2)
3810a7d1d5cSxiaofeibao  val noStdExuParams = params.issueBlockParams.map(x => Seq.fill(x.numEnq)(x.exuBlockParams)).flatten.filter{x => x.map(!_.hasStdFu).reduce(_ && _)}
3820a7d1d5cSxiaofeibao  val staIdx = noStdExuParams.zipWithIndex.filter{x => x._1.map(_.hasStoreAddrFu).reduce(_ || _)}.map(_._2)
3830a7d1d5cSxiaofeibao  val staReady = issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq.map(_.ready)).flatten
3840a7d1d5cSxiaofeibao  val stdReady = issueQueues.filter(iq => iq.params.StdCnt > 0).map(_.io.enq.map(_.ready)).flatten
3850a7d1d5cSxiaofeibao  staIdx.zipWithIndex.map{ case (sta, i) => {
3860a7d1d5cSxiaofeibao    io.fromDispatch.uops(sta).ready := staReady(i) && stdReady(i)
3870a7d1d5cSxiaofeibao  }}
388559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
389e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
390e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
391e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
392559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
393559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
394499caf4cSXuan Hu
395499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
396499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
397499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
398499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
399499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
400730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
401730cfbc0SXuan Hu
402853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
403853cd2d8SHaojin Tang
404fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
405596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
406596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
407596af5d2SHaojin Tang
408730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
409730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
410e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
411e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
412e600b1ddSxiaofeibao-xjtu    }
41360f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
41460f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
41560f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
416c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
417c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
418c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
41960f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
420*9df83ee5Sxiaofeibao    iq.io.wakeupFromWBDelayed.zip(
421*9df83ee5Sxiaofeibao      wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
422*9df83ee5Sxiaofeibao      wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
423*9df83ee5Sxiaofeibao      wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
424*9df83ee5Sxiaofeibao      wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
425*9df83ee5Sxiaofeibao      wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
426*9df83ee5Sxiaofeibao    ).foreach { case (sink, source) => sink := source }
427730cfbc0SXuan Hu  }
428730cfbc0SXuan Hu
429ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
430ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
431ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
432c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
433de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4347b753bebSXuan Hu    case _ =>
4357b753bebSXuan Hu  }
4367b753bebSXuan Hu
437ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
438ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
439ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
440c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
441c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4427b753bebSXuan Hu    case _ =>
4437b753bebSXuan Hu  }
444730cfbc0SXuan Hu
445559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
446559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
447670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
448670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
4498f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
4508f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
451559c1710SHaojin Tang      // TODO: refactor ditry code
452559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
453559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
454559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
4558f1fa9b1Ssfencevma    case _ =>
4568f1fa9b1Ssfencevma  }
4578f1fa9b1Ssfencevma
458e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
459e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
460e62b6911SXuan Hu
461e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
462e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
463e62b6911SXuan Hu
464e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
465e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
466e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
467e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
468e62b6911SXuan Hu
469e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
470e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
471e62b6911SXuan Hu
472e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
473e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
4749b258a00Sxgkiri
475e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
476e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
47760f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
47860f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
47960f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
480c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
481c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
482c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
48360f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
484*9df83ee5Sxiaofeibao    iq.io.wakeupFromWBDelayed.zip(
485*9df83ee5Sxiaofeibao      wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
486*9df83ee5Sxiaofeibao      wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
487*9df83ee5Sxiaofeibao      wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
488*9df83ee5Sxiaofeibao      wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
489*9df83ee5Sxiaofeibao      wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
490*9df83ee5Sxiaofeibao    ).foreach { case (sink, source) => sink := source }
4910a7d1d5cSxiaofeibao    // here disable fp load fast wakeup to std, and no FEX wakeup to std
4920a7d1d5cSxiaofeibao    iq.io.wakeupFromIQ.map(_.bits.fpWen := false.B)
493e62b6911SXuan Hu  }
494e62b6911SXuan Hu
495e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
4960a7d1d5cSxiaofeibao    stdIQEnq.valid := staIQEnq.valid && FuType.FuTypeOrR(staIQEnq.bits.fuType, FuType.stu, FuType.mou)
497730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
498730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
499e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
500730cfbc0SXuan Hu    //                       \
501730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
502730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
503730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
50497b279b9SXuan Hu    val stdIdx = 1
5052d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
506955b4beaSsinsanction    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx)
5072d270511Ssinsanction    stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
5082d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
509730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
510955b4beaSsinsanction    stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx)
511955b4beaSsinsanction    stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx)
512730cfbc0SXuan Hu  }
513730cfbc0SXuan Hu
5142d270511Ssinsanction  vecMemIQs.foreach {
5152d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
5162d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
5172d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
5181f3d1b4dSXuan Hu      // not used
519b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
5201f3d1b4dSXuan Hu      // maybe not used
5211f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5221f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
52360f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
52460f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
52560f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
526c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
527c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
528c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
52960f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
530*9df83ee5Sxiaofeibao      imp.io.wakeupFromWBDelayed.zip(
531*9df83ee5Sxiaofeibao        wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
532*9df83ee5Sxiaofeibao        wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
533*9df83ee5Sxiaofeibao        wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
534*9df83ee5Sxiaofeibao        wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
535*9df83ee5Sxiaofeibao        wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
536*9df83ee5Sxiaofeibao      ).foreach { case (sink, source) => sink := source }
537f39a61a1SzhanglyGit
5382d270511Ssinsanction    case _ =>
5392d270511Ssinsanction  }
540b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
541b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
542b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
543b7c799beSzhanglyGit  }.flatten
544b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
545b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
546b7c799beSzhanglyGit    case (sink, source) =>
547b7c799beSzhanglyGit      sink := source
548b7c799beSzhanglyGit  }
5492d270511Ssinsanction
5500a7d1d5cSxiaofeibao  val perfEvents = basePerfEvents
551e1a85e9fSchengguanghui  generatePerfEvent()
552730cfbc0SXuan Hu}
553