xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 37080bd8109fe3abe41a95c8cbf3cf15f788a16f)
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}
7e1a85e9fSchengguanghuiimport 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))
99c0be7f33SXuan Hu    // just be compatible to old code
100c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
101c0be7f33SXuan Hu  }
102c0be7f33SXuan Hu
1038a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1048a66c02cSXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1057e471bf8SXuan Hu  val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1060f55a0d3SHaojin Tang
1076810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
108c0be7f33SXuan Hu
109730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
110730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
111730cfbc0SXuan Hu  }) else None
112730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1137b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1147b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1158f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
116fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
117fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
118730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
119730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
120730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
121fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1222d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1232d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
124730cfbc0SXuan Hu    // from lsq
125730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
126730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
127730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
128730cfbc0SXuan Hu  }) else None
129730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
130730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
131730cfbc0SXuan Hu  }) else None
132c38df446SzhanglyGit  val fromOg2 = if(params.isVfSchd) Some(MixedVec(params.issueBlockParams.map(x => Flipped(x.genOG2RespBundle)))) else None
133730cfbc0SXuan Hu}
134730cfbc0SXuan Hu
135730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
136730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
137730cfbc0SXuan Hu    with HasXSParameter
138730cfbc0SXuan Hu{
139730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
140730cfbc0SXuan Hu
141730cfbc0SXuan Hu  // alias
142c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
143c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
144730cfbc0SXuan Hu  private val schdType = params.schdType
145730cfbc0SXuan Hu
146730cfbc0SXuan Hu  // Modules
147730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
148730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
14982674533Sxiaofeibao  io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec)
15082674533Sxiaofeibao  io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec)
151ff3fcdf1Sxiaofeibao-xjtu  if (params.isIntSchd) {
15282674533Sxiaofeibao    dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec
15382674533Sxiaofeibao    io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
154ff3fcdf1Sxiaofeibao-xjtu  }
15582674533Sxiaofeibao  else if (params.isFpSchd) {
15682674533Sxiaofeibao    dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec
15782674533Sxiaofeibao    io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
15882674533Sxiaofeibao  }
159730cfbc0SXuan Hu
16056bcaed7SHaojin Tang  // valid count
16156bcaed7SHaojin Tang  dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt)
16256bcaed7SHaojin Tang
163730cfbc0SXuan Hu  // BusyTable Modules
164730cfbc0SXuan Hu  val intBusyTable = schdType match {
165bc7d6943SzhanglyGit    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB())))
166730cfbc0SXuan Hu    case _ => None
167730cfbc0SXuan Hu  }
16860f0c5aeSxiaofeibao  val fpBusyTable = schdType match {
16960f0c5aeSxiaofeibao    case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB())))
17060f0c5aeSxiaofeibao    case _ => None
17160f0c5aeSxiaofeibao  }
172730cfbc0SXuan Hu  val vfBusyTable = schdType match {
173bc7d6943SzhanglyGit    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB())))
174730cfbc0SXuan Hu    case _ => None
175730cfbc0SXuan Hu  }
176c720aa49Ssinsanction  val v0BusyTable = schdType match {
177c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB())))
178c720aa49Ssinsanction    case _ => None
179c720aa49Ssinsanction  }
180c720aa49Ssinsanction  val vlBusyTable = schdType match {
181c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB())))
182c720aa49Ssinsanction    case _ => None
183c720aa49Ssinsanction  }
184730cfbc0SXuan Hu
185730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
186730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
187730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
188730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
18960f0c5aeSxiaofeibao    dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read)
190730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
191c720aa49Ssinsanction    dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read)
192c720aa49Ssinsanction    dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read)
193730cfbc0SXuan Hu  }
194730cfbc0SXuan Hu
195730cfbc0SXuan Hu  intBusyTable match {
196730cfbc0SXuan Hu    case Some(bt) =>
197730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
198730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
199730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
200730cfbc0SXuan Hu      }
201730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
202730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
203730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
204730cfbc0SXuan Hu      }
205bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
206*37080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
20713551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
208730cfbc0SXuan Hu    case None =>
209730cfbc0SXuan Hu  }
210730cfbc0SXuan Hu
21160f0c5aeSxiaofeibao  fpBusyTable match {
212730cfbc0SXuan Hu    case Some(bt) =>
213730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
214730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
215730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
216730cfbc0SXuan Hu      }
217730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
21860f0c5aeSxiaofeibao        wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen
21960f0c5aeSxiaofeibao        wb.bits := io.fpWriteBack(i).addr
22060f0c5aeSxiaofeibao      }
22160f0c5aeSxiaofeibao      bt.io.wakeUp := io.fromSchedulers.wakeupVec
222*37080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
22360f0c5aeSxiaofeibao      bt.io.ldCancel := io.ldCancel
22460f0c5aeSxiaofeibao    case None =>
22560f0c5aeSxiaofeibao  }
22660f0c5aeSxiaofeibao
22760f0c5aeSxiaofeibao  vfBusyTable match {
22860f0c5aeSxiaofeibao    case Some(bt) =>
22960f0c5aeSxiaofeibao      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
23060f0c5aeSxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVec
23160f0c5aeSxiaofeibao        btAllocPregs.bits := dpAllocPregs.preg
23260f0c5aeSxiaofeibao      }
23360f0c5aeSxiaofeibao      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
23460f0c5aeSxiaofeibao        wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen
235730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
236730cfbc0SXuan Hu      }
237bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
238*37080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
23913551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
240730cfbc0SXuan Hu    case None =>
241730cfbc0SXuan Hu  }
242730cfbc0SXuan Hu
243c720aa49Ssinsanction  v0BusyTable match {
244c720aa49Ssinsanction    case Some(bt) =>
245c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
24629aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isV0
247c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
248c720aa49Ssinsanction      }
249c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
250c720aa49Ssinsanction        wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen
251c720aa49Ssinsanction        wb.bits := io.v0WriteBack(i).addr
252c720aa49Ssinsanction      }
253c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
254*37080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
255c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
256c720aa49Ssinsanction    case None =>
257c720aa49Ssinsanction  }
258c720aa49Ssinsanction
259c720aa49Ssinsanction  vlBusyTable match {
260c720aa49Ssinsanction    case Some(bt) =>
261c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
26229aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVl
263c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
264c720aa49Ssinsanction      }
265c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
266c720aa49Ssinsanction        wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen
267c720aa49Ssinsanction        wb.bits := io.vlWriteBack(i).addr
268c720aa49Ssinsanction      }
269c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
270*37080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
271c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
272c720aa49Ssinsanction    case None =>
273c720aa49Ssinsanction  }
274c720aa49Ssinsanction
275f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
27660f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
277f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
278c720aa49Ssinsanction  val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle)
279c720aa49Ssinsanction  val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle)
280f39a61a1SzhanglyGit
281f39a61a1SzhanglyGit  wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) =>
282f39a61a1SzhanglyGit    sink.valid := source.wen
283f39a61a1SzhanglyGit    sink.bits.rfWen := source.intWen
284f39a61a1SzhanglyGit    sink.bits.fpWen := source.fpWen
285f39a61a1SzhanglyGit    sink.bits.vecWen := source.vecWen
286c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
287c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
288f39a61a1SzhanglyGit    sink.bits.pdest := source.addr
289730cfbc0SXuan Hu  }
290f39a61a1SzhanglyGit
29160f0c5aeSxiaofeibao  wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) =>
29260f0c5aeSxiaofeibao    sink.valid := source.wen
29360f0c5aeSxiaofeibao    sink.bits.rfWen := source.intWen
29460f0c5aeSxiaofeibao    sink.bits.fpWen := source.fpWen
29560f0c5aeSxiaofeibao    sink.bits.vecWen := source.vecWen
296c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
297c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
29860f0c5aeSxiaofeibao    sink.bits.pdest := source.addr
29960f0c5aeSxiaofeibao  }
30060f0c5aeSxiaofeibao
301f39a61a1SzhanglyGit  wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) =>
302730cfbc0SXuan Hu    sink.valid := source.wen
303730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
304730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
305730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
306c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
307c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
308c720aa49Ssinsanction    sink.bits.pdest := source.addr
309c720aa49Ssinsanction  }
310c720aa49Ssinsanction
311c720aa49Ssinsanction  wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) =>
312c720aa49Ssinsanction    sink.valid := source.wen
313c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
314c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
315c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
316c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
317c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
318c720aa49Ssinsanction    sink.bits.pdest := source.addr
319c720aa49Ssinsanction  }
320c720aa49Ssinsanction
321c720aa49Ssinsanction  wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) =>
322c720aa49Ssinsanction    sink.valid := source.wen
323c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
324c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
325c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
326c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
327c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
328730cfbc0SXuan Hu    sink.bits.pdest := source.addr
329730cfbc0SXuan Hu  }
330730cfbc0SXuan Hu
331bf35baadSXuan Hu  // Connect bundles having the same wakeup source
33259ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
333bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
3340c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
3350c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
3360c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
3370c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
3380c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
3390c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
3400c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
3410c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3424c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3434c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3444c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
345c720aa49Ssinsanction        if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
346c720aa49Ssinsanction        if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3474c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3480c7ebb58Sxiaofeibao-xjtu      }
34960912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
35060f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
35160912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
352c720aa49Ssinsanction      if (iq.params.numV0Src == 0)  wakeUp.bits.v0Wen := false.B
353c720aa49Ssinsanction      if (iq.params.numVlSrc == 0)  wakeUp.bits.vlWen := false.B
354bf35baadSXuan Hu    }
355ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
356ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
3570f55a0d3SHaojin Tang    iq.io.ldCancel := io.ldCancel
358bf35baadSXuan Hu  }
359bf35baadSXuan Hu
360b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
361b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
362c720aa49Ssinsanction    iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax
363c720aa49Ssinsanction    iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero
364b6279fc6SZiyue Zhang  }
365b6279fc6SZiyue Zhang
366c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
367bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
368c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
369bf35baadSXuan Hu      .toMap
370bf35baadSXuan Hu
371bf35baadSXuan Hu  // Connect bundles having the same wakeup source
372bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
373c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
374bf35baadSXuan Hu  }
375bf35baadSXuan Hu
37659ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
37759ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
37859ef6009Sxiaofeibao-xjtu  }
379bf35baadSXuan Hu
380f99b81adSHaojin Tang  // Response
381f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
382f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
383f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
384f99b81adSHaojin Tang    }
385f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
386f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
387f99b81adSHaojin Tang    }
388f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
389670870b3SXuan Hu      if (io.loadFinalIssueResp(i).isDefinedAt(j)) {
390f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
391670870b3SXuan Hu      } else {
392670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
393670870b3SXuan Hu      }
394f99b81adSHaojin Tang    })
395e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
396aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
397e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
398aa2bcc31SzhanglyGit      } else {
399aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
400aa2bcc31SzhanglyGit      }
401e8800897SXuan Hu    })
4027e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
4037e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
4047e471bf8SXuan Hu    })
405c38df446SzhanglyGit    if(params.isVfSchd) {
406c38df446SzhanglyGit      iq.io.og2Resp.get.zipWithIndex.foreach { case (og2Resp, exuIdx) =>
407c38df446SzhanglyGit        og2Resp := io.fromOg2.get(i)(exuIdx)
408c38df446SzhanglyGit      }
409c38df446SzhanglyGit    }
410f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
411f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
412f99b81adSHaojin Tang  }
413f99b81adSHaojin Tang
414e1a85e9fSchengguanghui  // perfEvent
415e1a85e9fSchengguanghui  val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire)))
416e1a85e9fSchengguanghui  val lastCycleIqEnqFireVec    = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten))
417e1a85e9fSchengguanghui  val lastCycleIqFullVec       = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready)))
418e1a85e9fSchengguanghui
419e1a85e9fSchengguanghui  val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) }
420e1a85e9fSchengguanghui  val basePerfEvents = Seq(
421e1a85e9fSchengguanghui    ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec)                 ),
422e1a85e9fSchengguanghui    ("issueQueue_enq_fire_cnt",  PopCount(lastCycleIqEnqFireVec)                    )
423e1a85e9fSchengguanghui  )  ++ issueQueueFullVecPerf
424e1a85e9fSchengguanghui
425c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
426bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
427bf35baadSXuan Hu
428bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
429c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
430730cfbc0SXuan Hu}
431730cfbc0SXuan Hu
432730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
433730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
434730cfbc0SXuan Hu    with HasXSParameter
435e1a85e9fSchengguanghui    with HasPerfEvents
436730cfbc0SXuan Hu{
4372e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
438730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
439730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
440730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
441730cfbc0SXuan Hu
442730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
443730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
444730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
445f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
446f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
44760f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
448c720aa49Ssinsanction      case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
449c720aa49Ssinsanction                             wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
450c720aa49Ssinsanction                             wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
451596af5d2SHaojin Tang      case _ => null
452f39a61a1SzhanglyGit    }
453f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
454730cfbc0SXuan Hu  }
455e1a85e9fSchengguanghui
456e1a85e9fSchengguanghui  val perfEvents = basePerfEvents
457e1a85e9fSchengguanghui  generatePerfEvent()
458730cfbc0SXuan Hu}
459730cfbc0SXuan Hu
460f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
461730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
462730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
463730cfbc0SXuan Hu    with HasXSParameter
464e1a85e9fSchengguanghui    with HasPerfEvents
465730cfbc0SXuan Hu{
466730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
467730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
468730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
469730cfbc0SXuan Hu
470559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
471e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
472e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
473e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
474559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
475559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
476499caf4cSXuan Hu
477499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
478499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
479499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
480499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
481499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
482730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
483730cfbc0SXuan Hu
484853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
485853cd2d8SHaojin Tang
486fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
487596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
488596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
489596af5d2SHaojin Tang
490730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
491730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
492730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
49360f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
49460f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
49560f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
496c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
497c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
498c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
49960f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
500730cfbc0SXuan Hu  }
501730cfbc0SXuan Hu
502ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
503ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
504ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
505c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
506de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5077b753bebSXuan Hu    case _ =>
5087b753bebSXuan Hu  }
5097b753bebSXuan Hu
510ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
511ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
512ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
513c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
514c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5157b753bebSXuan Hu    case _ =>
5167b753bebSXuan Hu  }
517730cfbc0SXuan Hu
518559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
519559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
520670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
521670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
5228f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5238f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
524559c1710SHaojin Tang      // TODO: refactor ditry code
525559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
526559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
527559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
5288f1fa9b1Ssfencevma    case _ =>
5298f1fa9b1Ssfencevma  }
5308f1fa9b1Ssfencevma
531e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
532e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
533e62b6911SXuan Hu
534e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
535e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
536e62b6911SXuan Hu
537e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
538e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
539e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
540e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
541e62b6911SXuan Hu
542e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
543e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
544e62b6911SXuan Hu
545e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
546e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
5479b258a00Sxgkiri
5480438e8f4SHaojin Tang  val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten
5490438e8f4SHaojin Tang  d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) =>
550730cfbc0SXuan Hu    val isAllReady = staIQ.ready && stdIQ.ready
551e62b6911SXuan Hu    dp.ready := isAllReady
552e62b6911SXuan Hu    staIQ.valid := dp.valid && isAllReady
5530438e8f4SHaojin Tang    stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
5549b258a00Sxgkiri  }
555730cfbc0SXuan Hu
5560438e8f4SHaojin Tang  val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten
5570438e8f4SHaojin Tang  d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) =>
558e62b6911SXuan Hu    val isAllReady = hyaIQ.ready && hydIQ.ready
559e62b6911SXuan Hu    dp.ready := isAllReady
560e62b6911SXuan Hu    hyaIQ.valid := dp.valid && isAllReady
56156bceacbSHaojin Tang    hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
562e62b6911SXuan Hu  }
563730cfbc0SXuan Hu
564e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
565e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
56660f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
56760f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
56860f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
569c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
570c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
571c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
57260f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
573e62b6911SXuan Hu  }
574e62b6911SXuan Hu
575e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
576730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
577730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
578e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
579730cfbc0SXuan Hu    //                       \
580730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
581730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
582730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
58397b279b9SXuan Hu    val stdIdx = 1
5842d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
58513551487SzhanglyGit    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(1)
5862d270511Ssinsanction      stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
5872d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
588730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
589730cfbc0SXuan Hu  }
590730cfbc0SXuan Hu
5912d270511Ssinsanction  vecMemIQs.foreach {
5922d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
5932d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
5942d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
5951f3d1b4dSXuan Hu      // not used
596b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
5971f3d1b4dSXuan Hu      // maybe not used
5981f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5991f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
60060f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
60160f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
60260f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
603c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
604c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
605c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
60660f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
607f39a61a1SzhanglyGit
6082d270511Ssinsanction    case _ =>
6092d270511Ssinsanction  }
610b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
611b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
612b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
613b7c799beSzhanglyGit  }.flatten
614b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
615b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
616b7c799beSzhanglyGit    case (sink, source) =>
617b7c799beSzhanglyGit      sink := source
618b7c799beSzhanglyGit  }
6192d270511Ssinsanction
620730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
621730cfbc0SXuan Hu
622730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
623730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
624730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
625730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
626730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
627730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
628f3a9fb05SAnzo  dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount
629f3a9fb05SAnzo  dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount
630730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
6317e471bf8SXuan Hu
6327e471bf8SXuan Hu  dontTouch(io.vecLoadIssueResp)
633e1a85e9fSchengguanghui
634e1a85e9fSchengguanghui  val intBusyTablePerf = intBusyTable.get
635e1a85e9fSchengguanghui  val fpBusyTablePerf  = fpBusyTable.get
636e1a85e9fSchengguanghui  val vecBusyTablePerf = vfBusyTable.get
637e1a85e9fSchengguanghui  val v0BusyTablePerf  = v0BusyTable.get
638e1a85e9fSchengguanghui  val vlBusyTablePerf  = vlBusyTable.get
639e1a85e9fSchengguanghui
640e1a85e9fSchengguanghui  val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents)
641e1a85e9fSchengguanghui  generatePerfEvent()
642730cfbc0SXuan Hu}
643