xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 0a7d1d5cc74078a0d2fe9270a78ac80db6cb1ad0)
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
51*0a7d1d5cSxiaofeibao  val fromDispatchUopNum = params.issueBlockParams.filter(x => x.StdCnt == 0).map(_.numEnq).sum
52*0a7d1d5cSxiaofeibao  val allIssueParams = params.issueBlockParams.filter(_.StdCnt == 0)
53*0a7d1d5cSxiaofeibao  val IssueQueueDeqSum = allIssueParams.map(_.numDeq).sum
54*0a7d1d5cSxiaofeibao  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)))
62*0a7d1d5cSxiaofeibao  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 {
68*0a7d1d5cSxiaofeibao    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)))
8059ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
81730cfbc0SXuan Hu
82c720aa49Ssinsanction  val vlWriteBackInfo = new Bundle {
83d88d4328SZiyue Zhang    val vlFromIntIsZero  = Input(Bool())
84d88d4328SZiyue Zhang    val vlFromIntIsVlmax = Input(Bool())
85d88d4328SZiyue Zhang    val vlFromVfIsZero   = Input(Bool())
86d88d4328SZiyue Zhang    val vlFromVfIsVlmax  = Input(Bool())
87b6279fc6SZiyue Zhang  }
88b6279fc6SZiyue Zhang
89bf35baadSXuan Hu  val fromSchedulers = new Bundle {
90c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
91bf35baadSXuan Hu  }
92bf35baadSXuan Hu
93bf35baadSXuan Hu  val toSchedulers = new Bundle {
94c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
95bf35baadSXuan Hu  }
96bf35baadSXuan Hu
97c0be7f33SXuan Hu  val fromDataPath = new Bundle {
9810fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
99be9ff987Ssinsanction    val og0Cancel = Input(ExuVec())
100ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
101be9ff987Ssinsanction    val og1Cancel = Input(ExuVec())
102f8b278aaSsinsanction    // replace RCIdx to Wakeup Queue
103f8b278aaSsinsanction    val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W))))
104c0be7f33SXuan Hu    // just be compatible to old code
105c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
106c0be7f33SXuan Hu  }
107c0be7f33SXuan Hu
1088a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1093bba894fSxiaofeibao  val vecLoadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1108a66c02cSXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1117e471bf8SXuan Hu  val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1120f55a0d3SHaojin Tang
1136810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
114c0be7f33SXuan Hu
115730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1167b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1177b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1188f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
119fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
120fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
121730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
122730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
123730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
124fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1252d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1262d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
127730cfbc0SXuan Hu    // from lsq
128730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
129730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
130730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
131730cfbc0SXuan Hu  }) else None
132730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
133730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
134730cfbc0SXuan Hu  }) else None
13542b6cdf9Ssinsanction  val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None
136730cfbc0SXuan Hu}
137730cfbc0SXuan Hu
138730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
139730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
140730cfbc0SXuan Hu    with HasXSParameter
141730cfbc0SXuan Hu{
142730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
143730cfbc0SXuan Hu
144730cfbc0SXuan Hu  // alias
145c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
146c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
147730cfbc0SXuan Hu  private val schdType = params.schdType
148730cfbc0SXuan Hu
149730cfbc0SXuan Hu  // Modules
150730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
151730cfbc0SXuan Hu
152*0a7d1d5cSxiaofeibao  io.IQValidNumVec := issueQueues.filter(_.params.StdCnt == 0).map(_.io.validCntDeqVec).flatten
153f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
15460f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
155f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
156c720aa49Ssinsanction  val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle)
157c720aa49Ssinsanction  val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle)
158f39a61a1SzhanglyGit
159f39a61a1SzhanglyGit  wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) =>
160f39a61a1SzhanglyGit    sink.valid := source.wen
161f39a61a1SzhanglyGit    sink.bits.rfWen := source.intWen
162f39a61a1SzhanglyGit    sink.bits.fpWen := source.fpWen
163f39a61a1SzhanglyGit    sink.bits.vecWen := source.vecWen
164c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
165c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
166f39a61a1SzhanglyGit    sink.bits.pdest := source.addr
167730cfbc0SXuan Hu  }
168f39a61a1SzhanglyGit
16960f0c5aeSxiaofeibao  wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) =>
17060f0c5aeSxiaofeibao    sink.valid := source.wen
17160f0c5aeSxiaofeibao    sink.bits.rfWen := source.intWen
17260f0c5aeSxiaofeibao    sink.bits.fpWen := source.fpWen
17360f0c5aeSxiaofeibao    sink.bits.vecWen := source.vecWen
174c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
175c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
17660f0c5aeSxiaofeibao    sink.bits.pdest := source.addr
17760f0c5aeSxiaofeibao  }
17860f0c5aeSxiaofeibao
179f39a61a1SzhanglyGit  wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) =>
180730cfbc0SXuan Hu    sink.valid := source.wen
181730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
182730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
183730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
184c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
185c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
186c720aa49Ssinsanction    sink.bits.pdest := source.addr
187c720aa49Ssinsanction  }
188c720aa49Ssinsanction
189c720aa49Ssinsanction  wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) =>
190c720aa49Ssinsanction    sink.valid := source.wen
191c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
192c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
193c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
194c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
195c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
196c720aa49Ssinsanction    sink.bits.pdest := source.addr
197c720aa49Ssinsanction  }
198c720aa49Ssinsanction
199c720aa49Ssinsanction  wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) =>
200c720aa49Ssinsanction    sink.valid := source.wen
201c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
202c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
203c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
204c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
205c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
206730cfbc0SXuan Hu    sink.bits.pdest := source.addr
207730cfbc0SXuan Hu  }
208730cfbc0SXuan Hu
209bf35baadSXuan Hu  // Connect bundles having the same wakeup source
21059ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
211bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
2120c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
2130c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
2140c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
2150c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
2160c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
2170c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
2180c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
2190c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2204c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2214c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2224c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
223c720aa49Ssinsanction        if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
224c720aa49Ssinsanction        if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2254c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
2260c7ebb58Sxiaofeibao-xjtu      }
22760912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
22860f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
22960912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
230c720aa49Ssinsanction      if (iq.params.numV0Src == 0)  wakeUp.bits.v0Wen := false.B
231c720aa49Ssinsanction      if (iq.params.numVlSrc == 0)  wakeUp.bits.vlWen := false.B
232bf35baadSXuan Hu    }
233ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
234ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
235e600b1ddSxiaofeibao-xjtu    if (iq.params.needLoadDependency)
2360f55a0d3SHaojin Tang      iq.io.ldCancel := io.ldCancel
237e600b1ddSxiaofeibao-xjtu    else
238e600b1ddSxiaofeibao-xjtu      iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel)
239bf35baadSXuan Hu  }
240bf35baadSXuan Hu
241b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
242b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
243d88d4328SZiyue Zhang    iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax
244d88d4328SZiyue Zhang    iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero
245d88d4328SZiyue Zhang    iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax
246d88d4328SZiyue Zhang    iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero
247b6279fc6SZiyue Zhang  }
248b6279fc6SZiyue Zhang
249c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
250bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
251c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
252bf35baadSXuan Hu      .toMap
253bf35baadSXuan Hu
254bf35baadSXuan Hu  // Connect bundles having the same wakeup source
255bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
256c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
257bf35baadSXuan Hu  }
258bf35baadSXuan Hu
25959ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
26059ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
26159ef6009Sxiaofeibao-xjtu  }
262bf35baadSXuan Hu
263f99b81adSHaojin Tang  // Response
264f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
265f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
266f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
267f99b81adSHaojin Tang    }
268f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
269f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
270f99b81adSHaojin Tang    }
271f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
2723bba894fSxiaofeibao      if (io.loadFinalIssueResp(i).isDefinedAt(j) && iq.params.isLdAddrIQ) {
273f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
2743bba894fSxiaofeibao      } else if (io.vecLoadFinalIssueResp(i).isDefinedAt(j) && iq.params.isVecLduIQ) {
2753bba894fSxiaofeibao        finalIssueResp := io.vecLoadFinalIssueResp(i)(j)
2763bba894fSxiaofeibao      }
2773bba894fSxiaofeibao      else {
278670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
279670870b3SXuan Hu      }
280f99b81adSHaojin Tang    })
281e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
282aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
283e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
284aa2bcc31SzhanglyGit      } else {
285aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
286aa2bcc31SzhanglyGit      }
287e8800897SXuan Hu    })
2887e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
2897e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
2907e471bf8SXuan Hu    })
291f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
292f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
293f8b278aaSsinsanction    iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x))
294f8b278aaSsinsanction  }
29542b6cdf9Ssinsanction  if (params.needOg2Resp) {
29642b6cdf9Ssinsanction    issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) =>
29742b6cdf9Ssinsanction      iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) =>
29842b6cdf9Ssinsanction        iqOg2Resp := og2Resp
29942b6cdf9Ssinsanction      }
30042b6cdf9Ssinsanction    }
30142b6cdf9Ssinsanction  }
302f8b278aaSsinsanction
303f8b278aaSsinsanction  // Connect each replace RCIdx to IQ
304f8b278aaSsinsanction  if (params.needWriteRegCache) {
305f8b278aaSsinsanction    val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq =>
306f8b278aaSsinsanction      iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2)
307f8b278aaSsinsanction    }
308f8b278aaSsinsanction    iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) =>
309f8b278aaSsinsanction      iq := in
310f8b278aaSsinsanction    }
311f8b278aaSsinsanction
312f8b278aaSsinsanction    println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}")
313f8b278aaSsinsanction    println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}")
314f99b81adSHaojin Tang  }
315f99b81adSHaojin Tang
316e1a85e9fSchengguanghui  // perfEvent
317e1a85e9fSchengguanghui  val lastCycleIqEnqFireVec    = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten))
318e1a85e9fSchengguanghui  val lastCycleIqFullVec       = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready)))
319e1a85e9fSchengguanghui
320e1a85e9fSchengguanghui  val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) }
321e1a85e9fSchengguanghui  val basePerfEvents = Seq(
322e1a85e9fSchengguanghui    ("issueQueue_enq_fire_cnt",  PopCount(lastCycleIqEnqFireVec)                    )
323e1a85e9fSchengguanghui  )  ++ issueQueueFullVecPerf
324e1a85e9fSchengguanghui
325c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
326bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
327bf35baadSXuan Hu
328bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
329c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
330730cfbc0SXuan Hu}
331730cfbc0SXuan Hu
332730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
333730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
334730cfbc0SXuan Hu    with HasXSParameter
335e1a85e9fSchengguanghui    with HasPerfEvents
336730cfbc0SXuan Hu{
337*0a7d1d5cSxiaofeibao  val issueQueuesUopIn = issueQueues.map(_.io.enq).flatten
338*0a7d1d5cSxiaofeibao  issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2)
339730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
340730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
341e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
342e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
343e600b1ddSxiaofeibao-xjtu    }
344f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
345f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
34660f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
347c720aa49Ssinsanction      case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
348c720aa49Ssinsanction                             wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
349c720aa49Ssinsanction                             wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
350596af5d2SHaojin Tang      case _ => null
351f39a61a1SzhanglyGit    }
352f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
353730cfbc0SXuan Hu  }
354e1a85e9fSchengguanghui
355e1a85e9fSchengguanghui  val perfEvents = basePerfEvents
356e1a85e9fSchengguanghui  generatePerfEvent()
357730cfbc0SXuan Hu}
358730cfbc0SXuan Hu
359f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
360730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
361730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
362730cfbc0SXuan Hu    with HasXSParameter
363e1a85e9fSchengguanghui    with HasPerfEvents
364730cfbc0SXuan Hu{
365730cfbc0SXuan Hu
366*0a7d1d5cSxiaofeibao  val issueQueuesUopIn = issueQueues.filter(_.params.StdCnt == 0).map(_.io.enq).flatten
367*0a7d1d5cSxiaofeibao  issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2)
368*0a7d1d5cSxiaofeibao  val noStdExuParams = params.issueBlockParams.map(x => Seq.fill(x.numEnq)(x.exuBlockParams)).flatten.filter{x => x.map(!_.hasStdFu).reduce(_ && _)}
369*0a7d1d5cSxiaofeibao  val staIdx = noStdExuParams.zipWithIndex.filter{x => x._1.map(_.hasStoreAddrFu).reduce(_ || _)}.map(_._2)
370*0a7d1d5cSxiaofeibao  val staReady = issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq.map(_.ready)).flatten
371*0a7d1d5cSxiaofeibao  val stdReady = issueQueues.filter(iq => iq.params.StdCnt > 0).map(_.io.enq.map(_.ready)).flatten
372*0a7d1d5cSxiaofeibao  staIdx.zipWithIndex.map{ case (sta, i) => {
373*0a7d1d5cSxiaofeibao    io.fromDispatch.uops(sta).ready := staReady(i) && stdReady(i)
374*0a7d1d5cSxiaofeibao  }}
375559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
376e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
377e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
378e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
379559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
380559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
381499caf4cSXuan Hu
382499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
383499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
384499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
385499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
386499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
387730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
388730cfbc0SXuan Hu
389853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
390853cd2d8SHaojin Tang
391fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
392596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
393596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
394596af5d2SHaojin Tang
395730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
396730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
397e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
398e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
399e600b1ddSxiaofeibao-xjtu    }
40060f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
40160f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
40260f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
403c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
404c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
405c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
40660f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
407730cfbc0SXuan Hu  }
408730cfbc0SXuan Hu
409ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
410ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
411ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
412c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
413de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4147b753bebSXuan Hu    case _ =>
4157b753bebSXuan Hu  }
4167b753bebSXuan Hu
417ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
418ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
419ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
420c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
421c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
4227b753bebSXuan Hu    case _ =>
4237b753bebSXuan Hu  }
424730cfbc0SXuan Hu
425559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
426559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
427670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
428670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
4298f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
4308f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
431559c1710SHaojin Tang      // TODO: refactor ditry code
432559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
433559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
434559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
4358f1fa9b1Ssfencevma    case _ =>
4368f1fa9b1Ssfencevma  }
4378f1fa9b1Ssfencevma
438e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
439e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
440e62b6911SXuan Hu
441e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
442e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
443e62b6911SXuan Hu
444e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
445e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
446e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
447e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
448e62b6911SXuan Hu
449e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
450e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
451e62b6911SXuan Hu
452e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
453e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
4549b258a00Sxgkiri
455e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
456e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
45760f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
45860f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
45960f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
460c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
461c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
462c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
46360f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
464*0a7d1d5cSxiaofeibao    // here disable fp load fast wakeup to std, and no FEX wakeup to std
465*0a7d1d5cSxiaofeibao    iq.io.wakeupFromIQ.map(_.bits.fpWen := false.B)
466e62b6911SXuan Hu  }
467e62b6911SXuan Hu
468e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
469*0a7d1d5cSxiaofeibao    stdIQEnq.valid := staIQEnq.valid && FuType.FuTypeOrR(staIQEnq.bits.fuType, FuType.stu, FuType.mou)
470730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
471730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
472e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
473730cfbc0SXuan Hu    //                       \
474730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
475730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
476730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
47797b279b9SXuan Hu    val stdIdx = 1
4782d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
479955b4beaSsinsanction    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx)
4802d270511Ssinsanction    stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
4812d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
482730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
483955b4beaSsinsanction    stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx)
484955b4beaSsinsanction    stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx)
485730cfbc0SXuan Hu  }
486730cfbc0SXuan Hu
4872d270511Ssinsanction  vecMemIQs.foreach {
4882d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
4892d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
4902d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
4911f3d1b4dSXuan Hu      // not used
492b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
4931f3d1b4dSXuan Hu      // maybe not used
4941f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
4951f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
49660f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
49760f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
49860f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
499c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
500c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
501c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
50260f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
503f39a61a1SzhanglyGit
5042d270511Ssinsanction    case _ =>
5052d270511Ssinsanction  }
506b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
507b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
508b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
509b7c799beSzhanglyGit  }.flatten
510b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
511b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
512b7c799beSzhanglyGit    case (sink, source) =>
513b7c799beSzhanglyGit      sink := source
514b7c799beSzhanglyGit  }
5152d270511Ssinsanction
516*0a7d1d5cSxiaofeibao  val perfEvents = basePerfEvents
517e1a85e9fSchengguanghui  generatePerfEvent()
518730cfbc0SXuan Hu}
519