xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 99ce5576f0ecce1b5045b7bc0dbbb2debd934fbb)
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
15c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB
16c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams
17955b4beaSsinsanctionimport xiangshan.backend.regcache.RegCacheTagTable
189e12e8edScz4eimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, SqPtr, LqPtr}
19*99ce5576Scz4eimport xiangshan.mem.Bundles.MemWaitUpdateReqBundle
20730cfbc0SXuan Hu
21730cfbc0SXuan Husealed trait SchedulerType
22730cfbc0SXuan Hu
23730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType
2460f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType
25730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType
26730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType
27730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType
28730cfbc0SXuan Hu
29730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
301ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
311ca4a39dSXuan Hu
3239c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
3360f0c5aeSxiaofeibao  val numFpStateWrite = backendParams.numPregWb(FpData())
3439c59369SXuan Hu  val numVfStateWrite = backendParams.numPregWb(VecData())
3507b5cc60Sxiaofeibao  val numV0StateWrite = backendParams.numPregWb(V0Data())
3607b5cc60Sxiaofeibao  val numVlStateWrite = backendParams.numPregWb(VlData())
37730cfbc0SXuan Hu
38730cfbc0SXuan Hu  val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName)))
39730cfbc0SXuan Hu
4083ba63b3SXuan Hu  lazy val module: SchedulerImpBase = params.schdType match {
41730cfbc0SXuan Hu    case IntScheduler() => new SchedulerArithImp(this)(params, p)
4260f0c5aeSxiaofeibao    case FpScheduler()  => new SchedulerArithImp(this)(params, p)
43730cfbc0SXuan Hu    case MemScheduler() => new SchedulerMemImp(this)(params, p)
44730cfbc0SXuan Hu    case VfScheduler() => new SchedulerArithImp(this)(params, p)
45730cfbc0SXuan Hu    case _ => null
46730cfbc0SXuan Hu  }
47730cfbc0SXuan Hu}
48730cfbc0SXuan Hu
497f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle {
5068d13085SXuan Hu  // params alias
517f8233d5SHaojin Tang  private val LoadQueueSize = VirtualLoadQueueSize
520a7d1d5cSxiaofeibao  val fromDispatchUopNum = params.issueBlockParams.filter(x => x.StdCnt == 0).map(_.numEnq).sum
530a7d1d5cSxiaofeibao  val allIssueParams = params.issueBlockParams.filter(_.StdCnt == 0)
540a7d1d5cSxiaofeibao  val IssueQueueDeqSum = allIssueParams.map(_.numDeq).sum
550a7d1d5cSxiaofeibao  val maxIQSize = allIssueParams.map(_.numEntries).max
56730cfbc0SXuan Hu  val fromTop = new Bundle {
57730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
58730cfbc0SXuan Hu  }
592e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
602e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
612e0a7dc5Sfdy  }
62dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
630a7d1d5cSxiaofeibao  val IQValidNumVec = Output(Vec(IssueQueueDeqSum, UInt((maxIQSize).U.getWidth.W)))
64dd970561SzhanglyGit
65730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
66730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
67730cfbc0SXuan Hu  }
68730cfbc0SXuan Hu  val fromDispatch = new Bundle {
690a7d1d5cSxiaofeibao    val uops =  Vec(fromDispatchUopNum, Flipped(DecoupledIO(new DynInst)))
70730cfbc0SXuan Hu  }
7139c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
72730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
7360f0c5aeSxiaofeibao  val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()),
7460f0c5aeSxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
7539c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
76730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
7707b5cc60Sxiaofeibao  val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()),
78c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth)))
7907b5cc60Sxiaofeibao  val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()),
80c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth)))
819df83ee5Sxiaofeibao  val intWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(IntData()),
829df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
839df83ee5Sxiaofeibao  val fpWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(FpData()),
849df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
859df83ee5Sxiaofeibao  val vfWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VecData()),
869df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
879df83ee5Sxiaofeibao  val v0WriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(V0Data()),
889df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth)))
899df83ee5Sxiaofeibao  val vlWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VlData()),
909df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth)))
9159ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
92730cfbc0SXuan Hu
93c720aa49Ssinsanction  val vlWriteBackInfo = new Bundle {
94d88d4328SZiyue Zhang    val vlFromIntIsZero  = Input(Bool())
95d88d4328SZiyue Zhang    val vlFromIntIsVlmax = Input(Bool())
96d88d4328SZiyue Zhang    val vlFromVfIsZero   = Input(Bool())
97d88d4328SZiyue Zhang    val vlFromVfIsVlmax  = Input(Bool())
98b6279fc6SZiyue Zhang  }
99b6279fc6SZiyue Zhang
100bf35baadSXuan Hu  val fromSchedulers = new Bundle {
101c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
1029df83ee5Sxiaofeibao    val wakeupVecDelayed: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
103bf35baadSXuan Hu  }
104bf35baadSXuan Hu
105bf35baadSXuan Hu  val toSchedulers = new Bundle {
106c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
107bf35baadSXuan Hu  }
108bf35baadSXuan Hu
109c0be7f33SXuan Hu  val fromDataPath = new Bundle {
11010fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
111be9ff987Ssinsanction    val og0Cancel = Input(ExuVec())
112ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
113be9ff987Ssinsanction    val og1Cancel = Input(ExuVec())
114f8b278aaSsinsanction    // replace RCIdx to Wakeup Queue
115f8b278aaSsinsanction    val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W))))
116c0be7f33SXuan Hu    // just be compatible to old code
117c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
118c0be7f33SXuan Hu  }
119c0be7f33SXuan Hu
1208a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1213bba894fSxiaofeibao  val vecLoadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1228a66c02cSXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1237e471bf8SXuan Hu  val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1240f55a0d3SHaojin Tang
1256810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
126c0be7f33SXuan Hu
127730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1287b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1297b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1308f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
131fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
132fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
133730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
134730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
135730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
136fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1372d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1382d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
139730cfbc0SXuan Hu    // from lsq
140730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
141730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
142*99ce5576Scz4e    val memWaitUpdateReq = Flipped(new MemWaitUpdateReqBundle)
143730cfbc0SXuan Hu  }) else None
144730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
145730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
146730cfbc0SXuan Hu  }) else None
14742b6cdf9Ssinsanction  val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None
148730cfbc0SXuan Hu}
149730cfbc0SXuan Hu
150730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
151730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
152730cfbc0SXuan Hu    with HasXSParameter
153730cfbc0SXuan Hu{
154730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
155730cfbc0SXuan Hu
156730cfbc0SXuan Hu  // alias
157c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
158c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
1599df83ee5Sxiaofeibao  private val iqWakeUpInMapDelayed: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
1609df83ee5Sxiaofeibao    io.fromSchedulers.wakeupVecDelayed.map(x => (x.bits.exuIdx, x)).toMap
161730cfbc0SXuan Hu  private val schdType = params.schdType
162730cfbc0SXuan Hu
163730cfbc0SXuan Hu  // Modules
164730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
165730cfbc0SXuan Hu
1660a7d1d5cSxiaofeibao  io.IQValidNumVec := issueQueues.filter(_.params.StdCnt == 0).map(_.io.validCntDeqVec).flatten
167f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
16860f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
169f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
170c720aa49Ssinsanction  val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle)
171c720aa49Ssinsanction  val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle)
1729df83ee5Sxiaofeibao  val wakeupFromIntWBVecDelayed = Wire(params.genIntWBWakeUpSinkValidBundle)
1739df83ee5Sxiaofeibao  val wakeupFromFpWBVecDelayed = Wire(params.genFpWBWakeUpSinkValidBundle)
1749df83ee5Sxiaofeibao  val wakeupFromVfWBVecDelayed = Wire(params.genVfWBWakeUpSinkValidBundle)
1759df83ee5Sxiaofeibao  val wakeupFromV0WBVecDelayed = Wire(params.genV0WBWakeUpSinkValidBundle)
1769df83ee5Sxiaofeibao  val wakeupFromVlWBVecDelayed = Wire(params.genVlWBWakeUpSinkValidBundle)
177f39a61a1SzhanglyGit
1789df83ee5Sxiaofeibao  val wakeupFromWBVec = Seq(wakeupFromIntWBVec, wakeupFromFpWBVec, wakeupFromVfWBVec, wakeupFromV0WBVec, wakeupFromVlWBVec)
1799df83ee5Sxiaofeibao  val allWriteBack = Seq(io.intWriteBack, io.fpWriteBack, io.vfWriteBack, io.v0WriteBack, io.vlWriteBack)
1809df83ee5Sxiaofeibao  wakeupFromWBVec.zip(allWriteBack).map{ case (sinks, sources) =>
1819df83ee5Sxiaofeibao    sinks.zip(sources).map{ case (sink, source) =>
182f39a61a1SzhanglyGit      sink.valid := source.wen
183f39a61a1SzhanglyGit      sink.bits.rfWen := source.intWen
184f39a61a1SzhanglyGit      sink.bits.fpWen := source.fpWen
185f39a61a1SzhanglyGit      sink.bits.vecWen := source.vecWen
186c720aa49Ssinsanction      sink.bits.v0Wen := source.v0Wen
187c720aa49Ssinsanction      sink.bits.vlWen := source.vlWen
188f39a61a1SzhanglyGit      sink.bits.pdest := source.addr
189730cfbc0SXuan Hu    }
1909df83ee5Sxiaofeibao  }
191f39a61a1SzhanglyGit
1929df83ee5Sxiaofeibao  val wakeupFromWBVecDelayed = Seq(wakeupFromIntWBVecDelayed, wakeupFromFpWBVecDelayed, wakeupFromVfWBVecDelayed, wakeupFromV0WBVecDelayed, wakeupFromVlWBVecDelayed)
1939df83ee5Sxiaofeibao  val allWriteBackDelayed = Seq(io.intWriteBackDelayed, io.fpWriteBackDelayed, io.vfWriteBackDelayed, io.v0WriteBackDelayed, io.vlWriteBackDelayed)
1949df83ee5Sxiaofeibao  wakeupFromWBVecDelayed.zip(allWriteBackDelayed).map { case (sinks, sources) =>
1959df83ee5Sxiaofeibao    sinks.zip(sources).map { case (sink, source) =>
19660f0c5aeSxiaofeibao      sink.valid := source.wen
19760f0c5aeSxiaofeibao      sink.bits.rfWen := source.intWen
19860f0c5aeSxiaofeibao      sink.bits.fpWen := source.fpWen
19960f0c5aeSxiaofeibao      sink.bits.vecWen := source.vecWen
200c720aa49Ssinsanction      sink.bits.v0Wen := source.v0Wen
201c720aa49Ssinsanction      sink.bits.vlWen := source.vlWen
20260f0c5aeSxiaofeibao      sink.bits.pdest := source.addr
20360f0c5aeSxiaofeibao    }
204c720aa49Ssinsanction  }
205bf35baadSXuan Hu  // Connect bundles having the same wakeup source
20659ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
207bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
2080c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
2090c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
2100c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
2110c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
2120c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
2130c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
2140c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
2150c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2164c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2174c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2184c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
219c720aa49Ssinsanction        if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
220c720aa49Ssinsanction        if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2214c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2220c7ebb58Sxiaofeibao-xjtu      }
22360912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
22460f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
22560912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
226c720aa49Ssinsanction      if (iq.params.numV0Src == 0)  wakeUp.bits.v0Wen := false.B
227c720aa49Ssinsanction      if (iq.params.numVlSrc == 0)  wakeUp.bits.vlWen := false.B
228bf35baadSXuan Hu    }
2299df83ee5Sxiaofeibao    iq.io.wakeupFromIQDelayed.foreach { wakeUp =>
2309df83ee5Sxiaofeibao      val wakeUpIn = iqWakeUpInMapDelayed(wakeUp.bits.exuIdx)
2319df83ee5Sxiaofeibao      connectSamePort(wakeUp, wakeUpIn)
2329df83ee5Sxiaofeibao      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
2339df83ee5Sxiaofeibao      if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B
2349df83ee5Sxiaofeibao      if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B
2359df83ee5Sxiaofeibao      if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B
2369df83ee5Sxiaofeibao      if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B
2379df83ee5Sxiaofeibao    }
238ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
239ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
240e600b1ddSxiaofeibao-xjtu    if (iq.params.needLoadDependency)
2410f55a0d3SHaojin Tang      iq.io.ldCancel := io.ldCancel
242e600b1ddSxiaofeibao-xjtu    else
243e600b1ddSxiaofeibao-xjtu      iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel)
244bf35baadSXuan Hu  }
245bf35baadSXuan Hu
246b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
247b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
248d88d4328SZiyue Zhang    iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax
249d88d4328SZiyue Zhang    iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero
250d88d4328SZiyue Zhang    iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax
251d88d4328SZiyue Zhang    iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero
252b6279fc6SZiyue Zhang  }
253b6279fc6SZiyue Zhang
254c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
255bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
256c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
257bf35baadSXuan Hu      .toMap
258bf35baadSXuan Hu
259bf35baadSXuan Hu  // Connect bundles having the same wakeup source
260bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
261c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
262bf35baadSXuan Hu  }
263bf35baadSXuan Hu
26459ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
26559ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
26659ef6009Sxiaofeibao-xjtu  }
267bf35baadSXuan Hu
268f99b81adSHaojin Tang  // Response
269f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
270f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
271f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
272f99b81adSHaojin Tang    }
273f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
274f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
275f99b81adSHaojin Tang    }
276f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
2773bba894fSxiaofeibao      if (io.loadFinalIssueResp(i).isDefinedAt(j) && iq.params.isLdAddrIQ) {
278f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
2793bba894fSxiaofeibao      } else if (io.vecLoadFinalIssueResp(i).isDefinedAt(j) && iq.params.isVecLduIQ) {
2803bba894fSxiaofeibao        finalIssueResp := io.vecLoadFinalIssueResp(i)(j)
2813bba894fSxiaofeibao      }
2823bba894fSxiaofeibao      else {
283670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
284670870b3SXuan Hu      }
285f99b81adSHaojin Tang    })
286e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
287aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
288e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
289aa2bcc31SzhanglyGit      } else {
290aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
291aa2bcc31SzhanglyGit      }
292e8800897SXuan Hu    })
2937e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
2947e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
2957e471bf8SXuan Hu    })
296f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
297f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
298f8b278aaSsinsanction    iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x))
299f8b278aaSsinsanction  }
30042b6cdf9Ssinsanction  if (params.needOg2Resp) {
30142b6cdf9Ssinsanction    issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) =>
30242b6cdf9Ssinsanction      iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) =>
30342b6cdf9Ssinsanction        iqOg2Resp := og2Resp
30442b6cdf9Ssinsanction      }
30542b6cdf9Ssinsanction    }
30642b6cdf9Ssinsanction  }
307f8b278aaSsinsanction
308f8b278aaSsinsanction  // Connect each replace RCIdx to IQ
309f8b278aaSsinsanction  if (params.needWriteRegCache) {
310f8b278aaSsinsanction    val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq =>
311f8b278aaSsinsanction      iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2)
312f8b278aaSsinsanction    }
313f8b278aaSsinsanction    iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) =>
314f8b278aaSsinsanction      iq := in
315f8b278aaSsinsanction    }
316f8b278aaSsinsanction
317f8b278aaSsinsanction    println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}")
318f8b278aaSsinsanction    println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}")
319f99b81adSHaojin Tang  }
320f99b81adSHaojin Tang
321e1a85e9fSchengguanghui  // perfEvent
322e1a85e9fSchengguanghui  val lastCycleIqEnqFireVec    = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten))
323e1a85e9fSchengguanghui  val lastCycleIqFullVec       = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready)))
324e1a85e9fSchengguanghui
325e1a85e9fSchengguanghui  val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) }
326e1a85e9fSchengguanghui  val basePerfEvents = Seq(
327e1a85e9fSchengguanghui    ("issueQueue_enq_fire_cnt",  PopCount(lastCycleIqEnqFireVec)                    )
328e1a85e9fSchengguanghui  )  ++ issueQueueFullVecPerf
329e1a85e9fSchengguanghui
330c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
331bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
332bf35baadSXuan Hu
333bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
334c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
335730cfbc0SXuan Hu}
336730cfbc0SXuan Hu
337730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
338730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
339730cfbc0SXuan Hu    with HasXSParameter
340e1a85e9fSchengguanghui    with HasPerfEvents
341730cfbc0SXuan Hu{
3420a7d1d5cSxiaofeibao  val issueQueuesUopIn = issueQueues.map(_.io.enq).flatten
3430a7d1d5cSxiaofeibao  issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2)
344730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
345730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
346e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
347e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
348e600b1ddSxiaofeibao-xjtu    }
349f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
350f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
35160f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
352c720aa49Ssinsanction      case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
353c720aa49Ssinsanction                             wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
354c720aa49Ssinsanction                             wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
355596af5d2SHaojin Tang      case _ => null
356f39a61a1SzhanglyGit    }
3579df83ee5Sxiaofeibao    val intWBIQDelayed = params.schdType match {
3589df83ee5Sxiaofeibao      case IntScheduler() => wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
3599df83ee5Sxiaofeibao      case FpScheduler() => wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
3609df83ee5Sxiaofeibao      case VfScheduler() => (wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
3619df83ee5Sxiaofeibao                             wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
3629df83ee5Sxiaofeibao                             wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
3639df83ee5Sxiaofeibao      case _ => null
3649df83ee5Sxiaofeibao    }
365f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
3669df83ee5Sxiaofeibao    iq.io.wakeupFromWBDelayed.zip(intWBIQDelayed).foreach{ case (sink, source) => sink := source}
367730cfbc0SXuan Hu  }
368e1a85e9fSchengguanghui
369e1a85e9fSchengguanghui  val perfEvents = basePerfEvents
370e1a85e9fSchengguanghui  generatePerfEvent()
371730cfbc0SXuan Hu}
372730cfbc0SXuan Hu
373f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
374730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
375730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
376730cfbc0SXuan Hu    with HasXSParameter
377e1a85e9fSchengguanghui    with HasPerfEvents
378730cfbc0SXuan Hu{
379730cfbc0SXuan Hu
3800a7d1d5cSxiaofeibao  val issueQueuesUopIn = issueQueues.filter(_.params.StdCnt == 0).map(_.io.enq).flatten
3810a7d1d5cSxiaofeibao  issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2)
3820a7d1d5cSxiaofeibao  val noStdExuParams = params.issueBlockParams.map(x => Seq.fill(x.numEnq)(x.exuBlockParams)).flatten.filter{x => x.map(!_.hasStdFu).reduce(_ && _)}
3830a7d1d5cSxiaofeibao  val staIdx = noStdExuParams.zipWithIndex.filter{x => x._1.map(_.hasStoreAddrFu).reduce(_ || _)}.map(_._2)
3840a7d1d5cSxiaofeibao  val staReady = issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq.map(_.ready)).flatten
3850a7d1d5cSxiaofeibao  val stdReady = issueQueues.filter(iq => iq.params.StdCnt > 0).map(_.io.enq.map(_.ready)).flatten
3860a7d1d5cSxiaofeibao  staIdx.zipWithIndex.map{ case (sta, i) => {
3870a7d1d5cSxiaofeibao    io.fromDispatch.uops(sta).ready := staReady(i) && stdReady(i)
3880a7d1d5cSxiaofeibao  }}
3899ab8b572Sxiaofeibao  issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq).flatten.zipWithIndex.map{ case (iq, idx) =>
3909ab8b572Sxiaofeibao    iq.valid := io.fromDispatch.uops(staIdx(idx)).valid && !io.fromDispatch.uops(staIdx(idx)).bits.isDropAmocasSta
39141eedc8dSlinzhida  }
39241eedc8dSlinzhida  val staValidFromDispatch = staIdx.map(idx => io.fromDispatch.uops(idx).valid)
393559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
394e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
395e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
396e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
397559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
398559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
399499caf4cSXuan Hu
400499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
401499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
402499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
403499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
404499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
405730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
406730cfbc0SXuan Hu
407853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
408853cd2d8SHaojin Tang
409fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
410596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
411596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
412596af5d2SHaojin Tang
413730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
414730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
415e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
416e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
417e600b1ddSxiaofeibao-xjtu    }
41860f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
41960f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
42060f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
421c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
422c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
423c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
42460f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
4259df83ee5Sxiaofeibao    iq.io.wakeupFromWBDelayed.zip(
4269df83ee5Sxiaofeibao      wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
4279df83ee5Sxiaofeibao      wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
4289df83ee5Sxiaofeibao      wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
4299df83ee5Sxiaofeibao      wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
4309df83ee5Sxiaofeibao      wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
4319df83ee5Sxiaofeibao    ).foreach { case (sink, source) => sink := source }
432730cfbc0SXuan Hu  }
433730cfbc0SXuan Hu
434ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
435ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
436ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
437c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
438de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4397b753bebSXuan Hu    case _ =>
4407b753bebSXuan Hu  }
4417b753bebSXuan Hu
442ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
443ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
444ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
445c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
446c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4477b753bebSXuan Hu    case _ =>
4487b753bebSXuan Hu  }
449730cfbc0SXuan Hu
450559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
451559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
452670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
453670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
4548f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
4558f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
456559c1710SHaojin Tang      // TODO: refactor ditry code
457559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
458559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
459559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
4608f1fa9b1Ssfencevma    case _ =>
4618f1fa9b1Ssfencevma  }
4628f1fa9b1Ssfencevma
463e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
464e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
465e62b6911SXuan Hu
466e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
467e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
468e62b6911SXuan Hu
469e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
470e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
471e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
472e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
473e62b6911SXuan Hu
474e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
475e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
476e62b6911SXuan Hu
477e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
478e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
4799b258a00Sxgkiri
480e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
481e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
48260f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
48360f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
48460f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
485c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
486c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
487c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
48860f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
4899df83ee5Sxiaofeibao    iq.io.wakeupFromWBDelayed.zip(
4909df83ee5Sxiaofeibao      wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
4919df83ee5Sxiaofeibao      wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
4929df83ee5Sxiaofeibao      wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
4939df83ee5Sxiaofeibao      wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
4949df83ee5Sxiaofeibao      wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
4959df83ee5Sxiaofeibao    ).foreach { case (sink, source) => sink := source }
4960a7d1d5cSxiaofeibao    // here disable fp load fast wakeup to std, and no FEX wakeup to std
4970a7d1d5cSxiaofeibao    iq.io.wakeupFromIQ.map(_.bits.fpWen := false.B)
498e62b6911SXuan Hu  }
499e62b6911SXuan Hu
500e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
50141eedc8dSlinzhida    stdIQEnq.valid := staValidFromDispatch(i)
502730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
503730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
504e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
505730cfbc0SXuan Hu    //                       \
506730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
507730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
508730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
50997b279b9SXuan Hu    val stdIdx = 1
5102d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
511955b4beaSsinsanction    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx)
5122d270511Ssinsanction    stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
5132d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
514730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
515955b4beaSsinsanction    stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx)
516955b4beaSsinsanction    stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx)
517730cfbc0SXuan Hu  }
518730cfbc0SXuan Hu
5192d270511Ssinsanction  vecMemIQs.foreach {
5202d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
5212d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
5222d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
5231f3d1b4dSXuan Hu      // not used
524b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
5251f3d1b4dSXuan Hu      // maybe not used
5261f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5271f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
52860f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
52960f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
53060f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
531c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
532c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
533c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
53460f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
5359df83ee5Sxiaofeibao      imp.io.wakeupFromWBDelayed.zip(
5369df83ee5Sxiaofeibao        wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
5379df83ee5Sxiaofeibao        wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
5389df83ee5Sxiaofeibao        wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
5399df83ee5Sxiaofeibao        wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
5409df83ee5Sxiaofeibao        wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
5419df83ee5Sxiaofeibao      ).foreach { case (sink, source) => sink := source }
542f39a61a1SzhanglyGit
5432d270511Ssinsanction    case _ =>
5442d270511Ssinsanction  }
545b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
546b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
547b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
548b7c799beSzhanglyGit  }.flatten
549b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
550b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
551b7c799beSzhanglyGit    case (sink, source) =>
552b7c799beSzhanglyGit      sink := source
553b7c799beSzhanglyGit  }
5542d270511Ssinsanction
5550a7d1d5cSxiaofeibao  val perfEvents = basePerfEvents
556e1a85e9fSchengguanghui  generatePerfEvent()
557730cfbc0SXuan Hu}
558