xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision e1a85e9f67725331827cd0410a1a3601629b2af0)
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}
7*e1a85e9fSchengguanghuiimport utils.{HasPerfEvents, OptionWrapper}
8730cfbc0SXuan Huimport xiangshan._
910fe9778SXuan Huimport xiangshan.backend.Bundles._
10c720aa49Ssinsanctionimport xiangshan.backend.datapath.DataConfig._
11c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig._
12e62b6911SXuan Huimport xiangshan.backend.fu.FuType
13730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig
14730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable
152d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr}
16c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB
17c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams
18730cfbc0SXuan Hu
19730cfbc0SXuan Husealed trait SchedulerType
20730cfbc0SXuan Hu
21730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType
2260f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType
23730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType
24730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType
25730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType
26730cfbc0SXuan Hu
27730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
281ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
291ca4a39dSXuan Hu
3039c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
3160f0c5aeSxiaofeibao  val numFpStateWrite = backendParams.numPregWb(FpData())
3239c59369SXuan Hu  val numVfStateWrite = backendParams.numPregWb(VecData())
3307b5cc60Sxiaofeibao  val numV0StateWrite = backendParams.numPregWb(V0Data())
3407b5cc60Sxiaofeibao  val numVlStateWrite = backendParams.numPregWb(VlData())
35730cfbc0SXuan Hu
36730cfbc0SXuan Hu  val dispatch2Iq = LazyModule(new Dispatch2Iq(params))
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
5168d13085SXuan Hu
52730cfbc0SXuan Hu  val fromTop = new Bundle {
53730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
54730cfbc0SXuan Hu  }
552e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
562e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
572e0a7dc5Sfdy  }
58dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
5982674533Sxiaofeibao  val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle))
6082674533Sxiaofeibao  val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle))
61dd970561SzhanglyGit
62730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
63730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
64730cfbc0SXuan Hu  }
65730cfbc0SXuan Hu  val fromDispatch = new Bundle {
66730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
67730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
68730cfbc0SXuan Hu  }
6939c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
70730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
7160f0c5aeSxiaofeibao  val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()),
7260f0c5aeSxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
7339c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
74730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
7507b5cc60Sxiaofeibao  val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()),
76c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth)))
7707b5cc60Sxiaofeibao  val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()),
78c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth)))
7959ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
80730cfbc0SXuan Hu
81c720aa49Ssinsanction  val vlWriteBackInfo = new Bundle {
82b6279fc6SZiyue Zhang    val vlIsZero = Input(Bool())
83b6279fc6SZiyue Zhang    val vlIsVlmax = Input(Bool())
84b6279fc6SZiyue Zhang  }
85b6279fc6SZiyue Zhang
86bf35baadSXuan Hu  val fromSchedulers = new Bundle {
87c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
88bf35baadSXuan Hu  }
89bf35baadSXuan Hu
90bf35baadSXuan Hu  val toSchedulers = new Bundle {
91c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
92bf35baadSXuan Hu  }
93bf35baadSXuan Hu
94c0be7f33SXuan Hu  val fromDataPath = new Bundle {
9510fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
967a96cc7fSHaojin Tang    val og0Cancel = Input(ExuOH(backendParams.numExu))
97ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
987a96cc7fSHaojin Tang    val og1Cancel = Input(ExuOH(backendParams.numExu))
99bc7d6943SzhanglyGit    val cancelToBusyTable = Vec(backendParams.numExu, Flipped(ValidIO(new CancelSignal)))
100c0be7f33SXuan Hu    // just be compatible to old code
101c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
102c0be7f33SXuan Hu  }
103c0be7f33SXuan Hu
1048a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1058a66c02cSXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1067e471bf8SXuan Hu  val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1070f55a0d3SHaojin Tang
1086810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
109c0be7f33SXuan Hu
110730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
111730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
112730cfbc0SXuan Hu  }) else None
113730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1147b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1157b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1168f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
117fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
118fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
119730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
120730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
121730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
122fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1232d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1242d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
125730cfbc0SXuan Hu    // from lsq
126730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
127730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
128730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
129730cfbc0SXuan Hu  }) else None
130730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
131730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
132730cfbc0SXuan Hu  }) else None
133c38df446SzhanglyGit  val fromOg2 = if(params.isVfSchd) Some(MixedVec(params.issueBlockParams.map(x => Flipped(x.genOG2RespBundle)))) else None
134730cfbc0SXuan Hu}
135730cfbc0SXuan Hu
136730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
137730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
138730cfbc0SXuan Hu    with HasXSParameter
139730cfbc0SXuan Hu{
140730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
141730cfbc0SXuan Hu
142730cfbc0SXuan Hu  // alias
143c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
144c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
145730cfbc0SXuan Hu  private val schdType = params.schdType
146730cfbc0SXuan Hu
147730cfbc0SXuan Hu  // Modules
148730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
149730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
15082674533Sxiaofeibao  io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec)
15182674533Sxiaofeibao  io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec)
152ff3fcdf1Sxiaofeibao-xjtu  if (params.isIntSchd) {
15382674533Sxiaofeibao    dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec
15482674533Sxiaofeibao    io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
155ff3fcdf1Sxiaofeibao-xjtu  }
15682674533Sxiaofeibao  else if (params.isFpSchd) {
15782674533Sxiaofeibao    dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec
15882674533Sxiaofeibao    io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
15982674533Sxiaofeibao  }
160730cfbc0SXuan Hu
16156bcaed7SHaojin Tang  // valid count
16256bcaed7SHaojin Tang  dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt)
16356bcaed7SHaojin Tang
164730cfbc0SXuan Hu  // BusyTable Modules
165730cfbc0SXuan Hu  val intBusyTable = schdType match {
166bc7d6943SzhanglyGit    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB())))
167730cfbc0SXuan Hu    case _ => None
168730cfbc0SXuan Hu  }
16960f0c5aeSxiaofeibao  val fpBusyTable = schdType match {
17060f0c5aeSxiaofeibao    case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB())))
17160f0c5aeSxiaofeibao    case _ => None
17260f0c5aeSxiaofeibao  }
173730cfbc0SXuan Hu  val vfBusyTable = schdType match {
174bc7d6943SzhanglyGit    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB())))
175730cfbc0SXuan Hu    case _ => None
176730cfbc0SXuan Hu  }
177c720aa49Ssinsanction  val v0BusyTable = schdType match {
178c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB())))
179c720aa49Ssinsanction    case _ => None
180c720aa49Ssinsanction  }
181c720aa49Ssinsanction  val vlBusyTable = schdType match {
182c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB())))
183c720aa49Ssinsanction    case _ => None
184c720aa49Ssinsanction  }
185730cfbc0SXuan Hu
186730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
187730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
188730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
189730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
19060f0c5aeSxiaofeibao    dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read)
191730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
192c720aa49Ssinsanction    dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read)
193c720aa49Ssinsanction    dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read)
194730cfbc0SXuan Hu  }
195730cfbc0SXuan Hu
196730cfbc0SXuan Hu  intBusyTable match {
197730cfbc0SXuan Hu    case Some(bt) =>
198730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
199730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
200730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
201730cfbc0SXuan Hu      }
202730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
203730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
204730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
205730cfbc0SXuan Hu      }
206bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
207bc7d6943SzhanglyGit      bt.io.cancel := io.fromDataPath.cancelToBusyTable
20813551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
209730cfbc0SXuan Hu    case None =>
210730cfbc0SXuan Hu  }
211730cfbc0SXuan Hu
21260f0c5aeSxiaofeibao  fpBusyTable match {
213730cfbc0SXuan Hu    case Some(bt) =>
214730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
215730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
216730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
217730cfbc0SXuan Hu      }
218730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
21960f0c5aeSxiaofeibao        wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen
22060f0c5aeSxiaofeibao        wb.bits := io.fpWriteBack(i).addr
22160f0c5aeSxiaofeibao      }
22260f0c5aeSxiaofeibao      bt.io.wakeUp := io.fromSchedulers.wakeupVec
22360f0c5aeSxiaofeibao      bt.io.cancel := io.fromDataPath.cancelToBusyTable
22460f0c5aeSxiaofeibao      bt.io.ldCancel := io.ldCancel
22560f0c5aeSxiaofeibao    case None =>
22660f0c5aeSxiaofeibao  }
22760f0c5aeSxiaofeibao
22860f0c5aeSxiaofeibao  vfBusyTable match {
22960f0c5aeSxiaofeibao    case Some(bt) =>
23060f0c5aeSxiaofeibao      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
23160f0c5aeSxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVec
23260f0c5aeSxiaofeibao        btAllocPregs.bits := dpAllocPregs.preg
23360f0c5aeSxiaofeibao      }
23460f0c5aeSxiaofeibao      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
23560f0c5aeSxiaofeibao        wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen
236730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
237730cfbc0SXuan Hu      }
238bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
239bc7d6943SzhanglyGit      bt.io.cancel := io.fromDataPath.cancelToBusyTable
24013551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
241730cfbc0SXuan Hu    case None =>
242730cfbc0SXuan Hu  }
243730cfbc0SXuan Hu
244c720aa49Ssinsanction  v0BusyTable match {
245c720aa49Ssinsanction    case Some(bt) =>
246c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
24729aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isV0
248c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
249c720aa49Ssinsanction      }
250c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
251c720aa49Ssinsanction        wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen
252c720aa49Ssinsanction        wb.bits := io.v0WriteBack(i).addr
253c720aa49Ssinsanction      }
254c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
255c720aa49Ssinsanction      bt.io.cancel := io.fromDataPath.cancelToBusyTable
256c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
257c720aa49Ssinsanction    case None =>
258c720aa49Ssinsanction  }
259c720aa49Ssinsanction
260c720aa49Ssinsanction  vlBusyTable match {
261c720aa49Ssinsanction    case Some(bt) =>
262c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
26329aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVl
264c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
265c720aa49Ssinsanction      }
266c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
267c720aa49Ssinsanction        wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen
268c720aa49Ssinsanction        wb.bits := io.vlWriteBack(i).addr
269c720aa49Ssinsanction      }
270c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
271c720aa49Ssinsanction      bt.io.cancel := io.fromDataPath.cancelToBusyTable
272c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
273c720aa49Ssinsanction    case None =>
274c720aa49Ssinsanction  }
275c720aa49Ssinsanction
276f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
27760f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
278f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
279c720aa49Ssinsanction  val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle)
280c720aa49Ssinsanction  val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle)
281f39a61a1SzhanglyGit
282f39a61a1SzhanglyGit  wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) =>
283f39a61a1SzhanglyGit    sink.valid := source.wen
284f39a61a1SzhanglyGit    sink.bits.rfWen := source.intWen
285f39a61a1SzhanglyGit    sink.bits.fpWen := source.fpWen
286f39a61a1SzhanglyGit    sink.bits.vecWen := source.vecWen
287c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
288c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
289f39a61a1SzhanglyGit    sink.bits.pdest := source.addr
290730cfbc0SXuan Hu  }
291f39a61a1SzhanglyGit
29260f0c5aeSxiaofeibao  wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) =>
29360f0c5aeSxiaofeibao    sink.valid := source.wen
29460f0c5aeSxiaofeibao    sink.bits.rfWen := source.intWen
29560f0c5aeSxiaofeibao    sink.bits.fpWen := source.fpWen
29660f0c5aeSxiaofeibao    sink.bits.vecWen := source.vecWen
297c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
298c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
29960f0c5aeSxiaofeibao    sink.bits.pdest := source.addr
30060f0c5aeSxiaofeibao  }
30160f0c5aeSxiaofeibao
302f39a61a1SzhanglyGit  wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) =>
303730cfbc0SXuan Hu    sink.valid := source.wen
304730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
305730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
306730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
307c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
308c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
309c720aa49Ssinsanction    sink.bits.pdest := source.addr
310c720aa49Ssinsanction  }
311c720aa49Ssinsanction
312c720aa49Ssinsanction  wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) =>
313c720aa49Ssinsanction    sink.valid := source.wen
314c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
315c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
316c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
317c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
318c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
319c720aa49Ssinsanction    sink.bits.pdest := source.addr
320c720aa49Ssinsanction  }
321c720aa49Ssinsanction
322c720aa49Ssinsanction  wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) =>
323c720aa49Ssinsanction    sink.valid := source.wen
324c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
325c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
326c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
327c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
328c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
329730cfbc0SXuan Hu    sink.bits.pdest := source.addr
330730cfbc0SXuan Hu  }
331730cfbc0SXuan Hu
332bf35baadSXuan Hu  // Connect bundles having the same wakeup source
33359ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
334bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
3350c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
3360c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
3370c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
3380c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
3390c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
3400c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
3410c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
3420c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3434c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3444c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3454c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
346c720aa49Ssinsanction        if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
347c720aa49Ssinsanction        if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3484c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3490c7ebb58Sxiaofeibao-xjtu      }
35060912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
35160f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
35260912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
353c720aa49Ssinsanction      if (iq.params.numV0Src == 0)  wakeUp.bits.v0Wen := false.B
354c720aa49Ssinsanction      if (iq.params.numVlSrc == 0)  wakeUp.bits.vlWen := false.B
355bf35baadSXuan Hu    }
356ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
357ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
3580f55a0d3SHaojin Tang    iq.io.ldCancel := io.ldCancel
359bf35baadSXuan Hu  }
360bf35baadSXuan Hu
361b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
362b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
363c720aa49Ssinsanction    iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax
364c720aa49Ssinsanction    iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero
365b6279fc6SZiyue Zhang  }
366b6279fc6SZiyue Zhang
367c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
368bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
369c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
370bf35baadSXuan Hu      .toMap
371bf35baadSXuan Hu
372bf35baadSXuan Hu  // Connect bundles having the same wakeup source
373bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
374c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
375bf35baadSXuan Hu  }
376bf35baadSXuan Hu
37759ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
37859ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
37959ef6009Sxiaofeibao-xjtu  }
380bf35baadSXuan Hu
381f99b81adSHaojin Tang  // Response
382f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
383f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
384f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
385f99b81adSHaojin Tang    }
386f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
387f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
388f99b81adSHaojin Tang    }
389f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
390670870b3SXuan Hu      if (io.loadFinalIssueResp(i).isDefinedAt(j)) {
391f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
392670870b3SXuan Hu      } else {
393670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
394670870b3SXuan Hu      }
395f99b81adSHaojin Tang    })
396e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
397aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
398e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
399aa2bcc31SzhanglyGit      } else {
400aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
401aa2bcc31SzhanglyGit      }
402e8800897SXuan Hu    })
4037e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
4047e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
4057e471bf8SXuan Hu    })
406c38df446SzhanglyGit    if(params.isVfSchd) {
407c38df446SzhanglyGit      iq.io.og2Resp.get.zipWithIndex.foreach { case (og2Resp, exuIdx) =>
408c38df446SzhanglyGit        og2Resp := io.fromOg2.get(i)(exuIdx)
409c38df446SzhanglyGit      }
410c38df446SzhanglyGit    }
411f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
412f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
413f99b81adSHaojin Tang  }
414f99b81adSHaojin Tang
415*e1a85e9fSchengguanghui  // perfEvent
416*e1a85e9fSchengguanghui  val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire)))
417*e1a85e9fSchengguanghui  val lastCycleIqEnqFireVec    = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten))
418*e1a85e9fSchengguanghui  val lastCycleIqFullVec       = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready)))
419*e1a85e9fSchengguanghui
420*e1a85e9fSchengguanghui  val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) }
421*e1a85e9fSchengguanghui  val basePerfEvents = Seq(
422*e1a85e9fSchengguanghui    ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec)                 ),
423*e1a85e9fSchengguanghui    ("issueQueue_enq_fire_cnt",  PopCount(lastCycleIqEnqFireVec)                    )
424*e1a85e9fSchengguanghui  )  ++ issueQueueFullVecPerf
425*e1a85e9fSchengguanghui
426c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
427bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
428bf35baadSXuan Hu
429bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
430c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
431730cfbc0SXuan Hu}
432730cfbc0SXuan Hu
433730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
434730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
435730cfbc0SXuan Hu    with HasXSParameter
436*e1a85e9fSchengguanghui    with HasPerfEvents
437730cfbc0SXuan Hu{
4382e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
439730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
440730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
441730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
442730cfbc0SXuan Hu
443730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
444730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
445730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
446f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
447f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
44860f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
449c720aa49Ssinsanction      case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
450c720aa49Ssinsanction                             wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
451c720aa49Ssinsanction                             wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
452596af5d2SHaojin Tang      case _ => null
453f39a61a1SzhanglyGit    }
454f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
455730cfbc0SXuan Hu  }
456*e1a85e9fSchengguanghui
457*e1a85e9fSchengguanghui  val perfEvents = basePerfEvents
458*e1a85e9fSchengguanghui  generatePerfEvent()
459730cfbc0SXuan Hu}
460730cfbc0SXuan Hu
461f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
462730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
463730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
464730cfbc0SXuan Hu    with HasXSParameter
465*e1a85e9fSchengguanghui    with HasPerfEvents
466730cfbc0SXuan Hu{
467730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
468730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
469730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
470730cfbc0SXuan Hu
471559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
472e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
473e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
474e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
475559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
476559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
477499caf4cSXuan Hu
478499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
479499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
480499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
481499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
482499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
483730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
484730cfbc0SXuan Hu
485853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
486853cd2d8SHaojin Tang
487fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
488596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
489596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
490596af5d2SHaojin Tang
491730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
492730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
493730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
49460f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
49560f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
49660f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
497c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
498c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
499c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
50060f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
501730cfbc0SXuan Hu  }
502730cfbc0SXuan Hu
503ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
504ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
505ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
506c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
507de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5087b753bebSXuan Hu    case _ =>
5097b753bebSXuan Hu  }
5107b753bebSXuan Hu
511ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
512ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
513ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
514c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
515c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5167b753bebSXuan Hu    case _ =>
5177b753bebSXuan Hu  }
518730cfbc0SXuan Hu
519559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
520559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
521670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
522670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
5238f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5248f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
525559c1710SHaojin Tang      // TODO: refactor ditry code
526559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
527559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
528559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
5298f1fa9b1Ssfencevma    case _ =>
5308f1fa9b1Ssfencevma  }
5318f1fa9b1Ssfencevma
532e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
533e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
534e62b6911SXuan Hu
535e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
536e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
537e62b6911SXuan Hu
538e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
539e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
540e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
541e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
542e62b6911SXuan Hu
543e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
544e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
545e62b6911SXuan Hu
546e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
547e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
5489b258a00Sxgkiri
5490438e8f4SHaojin Tang  val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten
5500438e8f4SHaojin Tang  d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) =>
551730cfbc0SXuan Hu    val isAllReady = staIQ.ready && stdIQ.ready
552e62b6911SXuan Hu    dp.ready := isAllReady
553e62b6911SXuan Hu    staIQ.valid := dp.valid && isAllReady
5540438e8f4SHaojin Tang    stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
5559b258a00Sxgkiri  }
556730cfbc0SXuan Hu
5570438e8f4SHaojin Tang  val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten
5580438e8f4SHaojin Tang  d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) =>
559e62b6911SXuan Hu    val isAllReady = hyaIQ.ready && hydIQ.ready
560e62b6911SXuan Hu    dp.ready := isAllReady
561e62b6911SXuan Hu    hyaIQ.valid := dp.valid && isAllReady
56256bceacbSHaojin Tang    hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
563e62b6911SXuan Hu  }
564730cfbc0SXuan Hu
565e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
566e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
56760f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
56860f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
56960f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
570c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
571c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
572c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
57360f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
574e62b6911SXuan Hu  }
575e62b6911SXuan Hu
576e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
577730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
578730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
579e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
580730cfbc0SXuan Hu    //                       \
581730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
582730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
583730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
58497b279b9SXuan Hu    val stdIdx = 1
5852d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
58613551487SzhanglyGit    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(1)
5872d270511Ssinsanction      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
5882d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
589730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
590730cfbc0SXuan Hu  }
591730cfbc0SXuan Hu
5922d270511Ssinsanction  vecMemIQs.foreach {
5932d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
5942d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
5952d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
5961f3d1b4dSXuan Hu      // not used
597b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
5981f3d1b4dSXuan Hu      // maybe not used
5991f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
6001f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
60160f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
60260f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
60360f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
604c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
605c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
606c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
60760f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
608f39a61a1SzhanglyGit
6092d270511Ssinsanction    case _ =>
6102d270511Ssinsanction  }
611b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
612b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
613b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
614b7c799beSzhanglyGit  }.flatten
615b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
616b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
617b7c799beSzhanglyGit    case (sink, source) =>
618b7c799beSzhanglyGit      sink := source
619b7c799beSzhanglyGit  }
6202d270511Ssinsanction
621730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
622730cfbc0SXuan Hu
623730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
624730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
625730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
626730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
627730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
628730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
629f3a9fb05SAnzo  dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount
630f3a9fb05SAnzo  dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount
631730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
6327e471bf8SXuan Hu
6337e471bf8SXuan Hu  dontTouch(io.vecLoadIssueResp)
634*e1a85e9fSchengguanghui
635*e1a85e9fSchengguanghui  val intBusyTablePerf = intBusyTable.get
636*e1a85e9fSchengguanghui  val fpBusyTablePerf  = fpBusyTable.get
637*e1a85e9fSchengguanghui  val vecBusyTablePerf = vfBusyTable.get
638*e1a85e9fSchengguanghui  val v0BusyTablePerf  = v0BusyTable.get
639*e1a85e9fSchengguanghui  val vlBusyTablePerf  = vlBusyTable.get
640*e1a85e9fSchengguanghui
641*e1a85e9fSchengguanghui  val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents)
642*e1a85e9fSchengguanghui  generatePerfEvent()
643730cfbc0SXuan Hu}
644