xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 9ab8b5723d4738c9b6412a706a58633321089a85)
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)))
809df83ee5Sxiaofeibao  val intWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(IntData()),
819df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
829df83ee5Sxiaofeibao  val fpWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(FpData()),
839df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
849df83ee5Sxiaofeibao  val vfWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VecData()),
859df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
869df83ee5Sxiaofeibao  val v0WriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(V0Data()),
879df83ee5Sxiaofeibao    new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth)))
889df83ee5Sxiaofeibao  val vlWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VlData()),
899df83ee5Sxiaofeibao    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)
1019df83ee5Sxiaofeibao    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
1589df83ee5Sxiaofeibao  private val iqWakeUpInMapDelayed: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
1599df83ee5Sxiaofeibao    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)
1719df83ee5Sxiaofeibao  val wakeupFromIntWBVecDelayed = Wire(params.genIntWBWakeUpSinkValidBundle)
1729df83ee5Sxiaofeibao  val wakeupFromFpWBVecDelayed = Wire(params.genFpWBWakeUpSinkValidBundle)
1739df83ee5Sxiaofeibao  val wakeupFromVfWBVecDelayed = Wire(params.genVfWBWakeUpSinkValidBundle)
1749df83ee5Sxiaofeibao  val wakeupFromV0WBVecDelayed = Wire(params.genV0WBWakeUpSinkValidBundle)
1759df83ee5Sxiaofeibao  val wakeupFromVlWBVecDelayed = Wire(params.genVlWBWakeUpSinkValidBundle)
176f39a61a1SzhanglyGit
1779df83ee5Sxiaofeibao  val wakeupFromWBVec = Seq(wakeupFromIntWBVec, wakeupFromFpWBVec, wakeupFromVfWBVec, wakeupFromV0WBVec, wakeupFromVlWBVec)
1789df83ee5Sxiaofeibao  val allWriteBack = Seq(io.intWriteBack, io.fpWriteBack, io.vfWriteBack, io.v0WriteBack, io.vlWriteBack)
1799df83ee5Sxiaofeibao  wakeupFromWBVec.zip(allWriteBack).map{ case (sinks, sources) =>
1809df83ee5Sxiaofeibao    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    }
1899df83ee5Sxiaofeibao  }
190f39a61a1SzhanglyGit
1919df83ee5Sxiaofeibao  val wakeupFromWBVecDelayed = Seq(wakeupFromIntWBVecDelayed, wakeupFromFpWBVecDelayed, wakeupFromVfWBVecDelayed, wakeupFromV0WBVecDelayed, wakeupFromVlWBVecDelayed)
1929df83ee5Sxiaofeibao  val allWriteBackDelayed = Seq(io.intWriteBackDelayed, io.fpWriteBackDelayed, io.vfWriteBackDelayed, io.v0WriteBackDelayed, io.vlWriteBackDelayed)
1939df83ee5Sxiaofeibao  wakeupFromWBVecDelayed.zip(allWriteBackDelayed).map { case (sinks, sources) =>
1949df83ee5Sxiaofeibao    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    }
2289df83ee5Sxiaofeibao    iq.io.wakeupFromIQDelayed.foreach { wakeUp =>
2299df83ee5Sxiaofeibao      val wakeUpIn = iqWakeUpInMapDelayed(wakeUp.bits.exuIdx)
2309df83ee5Sxiaofeibao      connectSamePort(wakeUp, wakeUpIn)
2319df83ee5Sxiaofeibao      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
2329df83ee5Sxiaofeibao      if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B
2339df83ee5Sxiaofeibao      if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B
2349df83ee5Sxiaofeibao      if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B
2359df83ee5Sxiaofeibao      if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B
2369df83ee5Sxiaofeibao    }
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    }
3569df83ee5Sxiaofeibao    val intWBIQDelayed = params.schdType match {
3579df83ee5Sxiaofeibao      case IntScheduler() => wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
3589df83ee5Sxiaofeibao      case FpScheduler() => wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
3599df83ee5Sxiaofeibao      case VfScheduler() => (wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
3609df83ee5Sxiaofeibao                             wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
3619df83ee5Sxiaofeibao                             wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
3629df83ee5Sxiaofeibao      case _ => null
3639df83ee5Sxiaofeibao    }
364f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
3659df83ee5Sxiaofeibao    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  }}
388*9ab8b572Sxiaofeibao  issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq).flatten.zipWithIndex.map{ case (iq, idx) =>
389*9ab8b572Sxiaofeibao    iq.valid := io.fromDispatch.uops(staIdx(idx)).valid && !io.fromDispatch.uops(staIdx(idx)).bits.isDropAmocasSta
39041eedc8dSlinzhida  }
39141eedc8dSlinzhida  val staValidFromDispatch = staIdx.map(idx => io.fromDispatch.uops(idx).valid)
392559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
393e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
394e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
395e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
396559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
397559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
398499caf4cSXuan Hu
399499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
400499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
401499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
402499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
403499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
404730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
405730cfbc0SXuan Hu
406853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
407853cd2d8SHaojin Tang
408fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
409596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
410596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
411596af5d2SHaojin Tang
412730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
413730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
414e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
415e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
416e600b1ddSxiaofeibao-xjtu    }
41760f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
41860f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
41960f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
420c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
421c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
422c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
42360f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
4249df83ee5Sxiaofeibao    iq.io.wakeupFromWBDelayed.zip(
4259df83ee5Sxiaofeibao      wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
4269df83ee5Sxiaofeibao      wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
4279df83ee5Sxiaofeibao      wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
4289df83ee5Sxiaofeibao      wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
4299df83ee5Sxiaofeibao      wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
4309df83ee5Sxiaofeibao    ).foreach { case (sink, source) => sink := source }
431730cfbc0SXuan Hu  }
432730cfbc0SXuan Hu
433ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
434ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
435ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
436c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
437de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4387b753bebSXuan Hu    case _ =>
4397b753bebSXuan Hu  }
4407b753bebSXuan Hu
441ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
442ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
443ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
444c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
445c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4467b753bebSXuan Hu    case _ =>
4477b753bebSXuan Hu  }
448730cfbc0SXuan Hu
449559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
450559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
451670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
452670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
4538f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
4548f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
455559c1710SHaojin Tang      // TODO: refactor ditry code
456559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
457559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
458559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
4598f1fa9b1Ssfencevma    case _ =>
4608f1fa9b1Ssfencevma  }
4618f1fa9b1Ssfencevma
462e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
463e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
464e62b6911SXuan Hu
465e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
466e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
467e62b6911SXuan Hu
468e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
469e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
470e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
471e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
472e62b6911SXuan Hu
473e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
474e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
475e62b6911SXuan Hu
476e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
477e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
4789b258a00Sxgkiri
479e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
480e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
48160f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
48260f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
48360f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
484c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
485c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
486c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
48760f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
4889df83ee5Sxiaofeibao    iq.io.wakeupFromWBDelayed.zip(
4899df83ee5Sxiaofeibao      wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
4909df83ee5Sxiaofeibao      wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
4919df83ee5Sxiaofeibao      wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
4929df83ee5Sxiaofeibao      wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
4939df83ee5Sxiaofeibao      wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
4949df83ee5Sxiaofeibao    ).foreach { case (sink, source) => sink := source }
4950a7d1d5cSxiaofeibao    // here disable fp load fast wakeup to std, and no FEX wakeup to std
4960a7d1d5cSxiaofeibao    iq.io.wakeupFromIQ.map(_.bits.fpWen := false.B)
497e62b6911SXuan Hu  }
498e62b6911SXuan Hu
499e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
50041eedc8dSlinzhida    stdIQEnq.valid := staValidFromDispatch(i)
501730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
502730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
503e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
504730cfbc0SXuan Hu    //                       \
505730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
506730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
507730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
50897b279b9SXuan Hu    val stdIdx = 1
5092d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
510955b4beaSsinsanction    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx)
5112d270511Ssinsanction    stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
5122d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
513730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
514955b4beaSsinsanction    stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx)
515955b4beaSsinsanction    stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx)
516730cfbc0SXuan Hu  }
517730cfbc0SXuan Hu
5182d270511Ssinsanction  vecMemIQs.foreach {
5192d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
5202d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
5212d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
5221f3d1b4dSXuan Hu      // not used
523b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
5241f3d1b4dSXuan Hu      // maybe not used
5251f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5261f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
52760f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
52860f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
52960f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
530c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
531c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
532c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
53360f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
5349df83ee5Sxiaofeibao      imp.io.wakeupFromWBDelayed.zip(
5359df83ee5Sxiaofeibao        wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
5369df83ee5Sxiaofeibao        wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
5379df83ee5Sxiaofeibao        wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
5389df83ee5Sxiaofeibao        wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
5399df83ee5Sxiaofeibao        wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
5409df83ee5Sxiaofeibao      ).foreach { case (sink, source) => sink := source }
541f39a61a1SzhanglyGit
5422d270511Ssinsanction    case _ =>
5432d270511Ssinsanction  }
544b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
545b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
546b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
547b7c799beSzhanglyGit  }.flatten
548b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
549b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
550b7c799beSzhanglyGit    case (sink, source) =>
551b7c799beSzhanglyGit      sink := source
552b7c799beSzhanglyGit  }
5532d270511Ssinsanction
5540a7d1d5cSxiaofeibao  val perfEvents = basePerfEvents
555e1a85e9fSchengguanghui  generatePerfEvent()
556730cfbc0SXuan Hu}
557