xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision d88d4328dab9d6bdbbf1a85b9cc069ed5da759b8)
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
15730cfbc0SXuan Huimport xiangshan.backend.rename.BusyTable
162d270511Ssinsanctionimport xiangshan.mem.{LsqEnqCtrl, LsqEnqIO, MemWaitUpdateReq, SqPtr, LqPtr}
17c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig.V0WB
18c720aa49Ssinsanctionimport xiangshan.backend.regfile.VlPregParams
19955b4beaSsinsanctionimport xiangshan.backend.regcache.RegCacheTagTable
20730cfbc0SXuan Hu
21730cfbc0SXuan Husealed trait SchedulerType
22730cfbc0SXuan Hu
23730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType
2460f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType
25730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType
26730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType
27730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType
28730cfbc0SXuan Hu
29730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
301ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
311ca4a39dSXuan Hu
3239c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
3360f0c5aeSxiaofeibao  val numFpStateWrite = backendParams.numPregWb(FpData())
3439c59369SXuan Hu  val numVfStateWrite = backendParams.numPregWb(VecData())
3507b5cc60Sxiaofeibao  val numV0StateWrite = backendParams.numPregWb(V0Data())
3607b5cc60Sxiaofeibao  val numVlStateWrite = backendParams.numPregWb(VlData())
37730cfbc0SXuan Hu
38730cfbc0SXuan Hu  val dispatch2Iq = LazyModule(new Dispatch2Iq(params))
39730cfbc0SXuan Hu  val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName)))
40730cfbc0SXuan Hu
4183ba63b3SXuan Hu  lazy val module: SchedulerImpBase = params.schdType match {
42730cfbc0SXuan Hu    case IntScheduler() => new SchedulerArithImp(this)(params, p)
4360f0c5aeSxiaofeibao    case FpScheduler()  => new SchedulerArithImp(this)(params, p)
44730cfbc0SXuan Hu    case MemScheduler() => new SchedulerMemImp(this)(params, p)
45730cfbc0SXuan Hu    case VfScheduler() => new SchedulerArithImp(this)(params, p)
46730cfbc0SXuan Hu    case _ => null
47730cfbc0SXuan Hu  }
48730cfbc0SXuan Hu}
49730cfbc0SXuan Hu
507f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle {
5168d13085SXuan Hu  // params alias
527f8233d5SHaojin Tang  private val LoadQueueSize = VirtualLoadQueueSize
5368d13085SXuan Hu
54730cfbc0SXuan Hu  val fromTop = new Bundle {
55730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
56730cfbc0SXuan Hu  }
572e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
582e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
592e0a7dc5Sfdy  }
60dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
6182674533Sxiaofeibao  val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle))
6282674533Sxiaofeibao  val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle))
63dd970561SzhanglyGit
64730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
65730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
66730cfbc0SXuan Hu  }
67730cfbc0SXuan Hu  val fromDispatch = new Bundle {
68730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
69730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
70730cfbc0SXuan Hu  }
7139c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
72730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
7360f0c5aeSxiaofeibao  val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()),
7460f0c5aeSxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
7539c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
76730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
7707b5cc60Sxiaofeibao  val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()),
78c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth)))
7907b5cc60Sxiaofeibao  val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()),
80c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth)))
8159ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
82730cfbc0SXuan Hu
83c720aa49Ssinsanction  val vlWriteBackInfo = new Bundle {
84*d88d4328SZiyue Zhang    val vlFromIntIsZero  = Input(Bool())
85*d88d4328SZiyue Zhang    val vlFromIntIsVlmax = Input(Bool())
86*d88d4328SZiyue Zhang    val vlFromVfIsZero   = Input(Bool())
87*d88d4328SZiyue Zhang    val vlFromVfIsVlmax  = Input(Bool())
88b6279fc6SZiyue Zhang  }
89b6279fc6SZiyue Zhang
90bf35baadSXuan Hu  val fromSchedulers = new Bundle {
91c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
92bf35baadSXuan Hu  }
93bf35baadSXuan Hu
94bf35baadSXuan Hu  val toSchedulers = new Bundle {
95c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
96bf35baadSXuan Hu  }
97bf35baadSXuan Hu
98c0be7f33SXuan Hu  val fromDataPath = new Bundle {
9910fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
100be9ff987Ssinsanction    val og0Cancel = Input(ExuVec())
101ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
102be9ff987Ssinsanction    val og1Cancel = Input(ExuVec())
103f8b278aaSsinsanction    // replace RCIdx to Wakeup Queue
104f8b278aaSsinsanction    val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W))))
105c0be7f33SXuan Hu    // just be compatible to old code
106c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
107c0be7f33SXuan Hu  }
108c0be7f33SXuan Hu
1098a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, 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 memIO = if (params.isMemSchd) Some(new Bundle {
116730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
117730cfbc0SXuan Hu  }) else None
118730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1197b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1207b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1218f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
122fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
123fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
124730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
125730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
126730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
127fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1282d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1292d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
130730cfbc0SXuan Hu    // from lsq
131730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
132730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
133730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
134730cfbc0SXuan Hu  }) else None
135730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
136730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
137730cfbc0SXuan Hu  }) else None
13842b6cdf9Ssinsanction  val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None
139730cfbc0SXuan Hu}
140730cfbc0SXuan Hu
141730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
142730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
143730cfbc0SXuan Hu    with HasXSParameter
144730cfbc0SXuan Hu{
145730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
146730cfbc0SXuan Hu
147730cfbc0SXuan Hu  // alias
148c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
149c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
150730cfbc0SXuan Hu  private val schdType = params.schdType
151730cfbc0SXuan Hu
152730cfbc0SXuan Hu  // Modules
153730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
154730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
15582674533Sxiaofeibao  io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec)
15682674533Sxiaofeibao  io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec)
157ff3fcdf1Sxiaofeibao-xjtu  if (params.isIntSchd) {
15882674533Sxiaofeibao    dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec
15982674533Sxiaofeibao    io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
160ff3fcdf1Sxiaofeibao-xjtu  }
16182674533Sxiaofeibao  else if (params.isFpSchd) {
16282674533Sxiaofeibao    dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec
16382674533Sxiaofeibao    io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
16482674533Sxiaofeibao  }
165730cfbc0SXuan Hu
16656bcaed7SHaojin Tang  // valid count
16756bcaed7SHaojin Tang  dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt)
16856bcaed7SHaojin Tang
169730cfbc0SXuan Hu  // BusyTable Modules
170730cfbc0SXuan Hu  val intBusyTable = schdType match {
171bc7d6943SzhanglyGit    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB())))
172730cfbc0SXuan Hu    case _ => None
173730cfbc0SXuan Hu  }
17460f0c5aeSxiaofeibao  val fpBusyTable = schdType match {
17560f0c5aeSxiaofeibao    case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB())))
17660f0c5aeSxiaofeibao    case _ => None
17760f0c5aeSxiaofeibao  }
178730cfbc0SXuan Hu  val vfBusyTable = schdType match {
179bc7d6943SzhanglyGit    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB())))
180730cfbc0SXuan Hu    case _ => None
181730cfbc0SXuan Hu  }
182c720aa49Ssinsanction  val v0BusyTable = schdType match {
183c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB())))
184c720aa49Ssinsanction    case _ => None
185c720aa49Ssinsanction  }
186c720aa49Ssinsanction  val vlBusyTable = schdType match {
187c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB())))
188c720aa49Ssinsanction    case _ => None
189c720aa49Ssinsanction  }
190730cfbc0SXuan Hu
191955b4beaSsinsanction  // RegCacheTagTable Module
192955b4beaSsinsanction  val rcTagTable = schdType match {
193955b4beaSsinsanction    case IntScheduler() | MemScheduler() => Some(Module(new RegCacheTagTable(dispatch2Iq.numRCTagTableStateRead)))
194955b4beaSsinsanction    case _ => None
195955b4beaSsinsanction  }
196955b4beaSsinsanction
197730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
198730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
199730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
200730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
20160f0c5aeSxiaofeibao    dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read)
202730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
203c720aa49Ssinsanction    dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read)
204c720aa49Ssinsanction    dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read)
205955b4beaSsinsanction    dp2iq.readRCTagTableState.foreach(_ <> rcTagTable.get.io.readPorts)
206730cfbc0SXuan Hu  }
207730cfbc0SXuan Hu
208730cfbc0SXuan Hu  intBusyTable match {
209730cfbc0SXuan Hu    case Some(bt) =>
210730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
211730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
212730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
213730cfbc0SXuan Hu      }
214730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
215730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
216730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
217730cfbc0SXuan Hu      }
218bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
21937080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
22013551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
221730cfbc0SXuan Hu    case None =>
222730cfbc0SXuan Hu  }
223730cfbc0SXuan Hu
22460f0c5aeSxiaofeibao  fpBusyTable match {
225730cfbc0SXuan Hu    case Some(bt) =>
226730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
227730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
228730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
229730cfbc0SXuan Hu      }
230730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
23160f0c5aeSxiaofeibao        wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen
23260f0c5aeSxiaofeibao        wb.bits := io.fpWriteBack(i).addr
23360f0c5aeSxiaofeibao      }
23460f0c5aeSxiaofeibao      bt.io.wakeUp := io.fromSchedulers.wakeupVec
23537080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
23660f0c5aeSxiaofeibao      bt.io.ldCancel := io.ldCancel
23760f0c5aeSxiaofeibao    case None =>
23860f0c5aeSxiaofeibao  }
23960f0c5aeSxiaofeibao
24060f0c5aeSxiaofeibao  vfBusyTable match {
24160f0c5aeSxiaofeibao    case Some(bt) =>
24260f0c5aeSxiaofeibao      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
24360f0c5aeSxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVec
24460f0c5aeSxiaofeibao        btAllocPregs.bits := dpAllocPregs.preg
24560f0c5aeSxiaofeibao      }
24660f0c5aeSxiaofeibao      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
24760f0c5aeSxiaofeibao        wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen
248730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
249730cfbc0SXuan Hu      }
250bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
25137080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
25213551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
253730cfbc0SXuan Hu    case None =>
254730cfbc0SXuan Hu  }
255730cfbc0SXuan Hu
256c720aa49Ssinsanction  v0BusyTable match {
257c720aa49Ssinsanction    case Some(bt) =>
258c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
25929aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isV0
260c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
261c720aa49Ssinsanction      }
262c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
263c720aa49Ssinsanction        wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen
264c720aa49Ssinsanction        wb.bits := io.v0WriteBack(i).addr
265c720aa49Ssinsanction      }
266c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
26737080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
268c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
269c720aa49Ssinsanction    case None =>
270c720aa49Ssinsanction  }
271c720aa49Ssinsanction
272c720aa49Ssinsanction  vlBusyTable match {
273c720aa49Ssinsanction    case Some(bt) =>
274c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
27529aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVl
276c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
277c720aa49Ssinsanction      }
278c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
279c720aa49Ssinsanction        wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen
280c720aa49Ssinsanction        wb.bits := io.vlWriteBack(i).addr
281c720aa49Ssinsanction      }
282c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
28337080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
284c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
285c720aa49Ssinsanction    case None =>
286c720aa49Ssinsanction  }
287c720aa49Ssinsanction
288955b4beaSsinsanction  rcTagTable match {
289955b4beaSsinsanction    case Some(rct) =>
290955b4beaSsinsanction      rct.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
291955b4beaSsinsanction        btAllocPregs.valid := dpAllocPregs.isInt
292955b4beaSsinsanction        btAllocPregs.bits := dpAllocPregs.preg
293955b4beaSsinsanction      }
294955b4beaSsinsanction      rct.io.wakeupFromIQ := io.fromSchedulers.wakeupVec
295955b4beaSsinsanction      rct.io.og0Cancel := io.fromDataPath.og0Cancel
296955b4beaSsinsanction      rct.io.ldCancel := io.ldCancel
297955b4beaSsinsanction    case None =>
298955b4beaSsinsanction  }
299955b4beaSsinsanction
300f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
30160f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
302f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
303c720aa49Ssinsanction  val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle)
304c720aa49Ssinsanction  val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle)
305f39a61a1SzhanglyGit
306f39a61a1SzhanglyGit  wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) =>
307f39a61a1SzhanglyGit    sink.valid := source.wen
308f39a61a1SzhanglyGit    sink.bits.rfWen := source.intWen
309f39a61a1SzhanglyGit    sink.bits.fpWen := source.fpWen
310f39a61a1SzhanglyGit    sink.bits.vecWen := source.vecWen
311c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
312c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
313f39a61a1SzhanglyGit    sink.bits.pdest := source.addr
314730cfbc0SXuan Hu  }
315f39a61a1SzhanglyGit
31660f0c5aeSxiaofeibao  wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) =>
31760f0c5aeSxiaofeibao    sink.valid := source.wen
31860f0c5aeSxiaofeibao    sink.bits.rfWen := source.intWen
31960f0c5aeSxiaofeibao    sink.bits.fpWen := source.fpWen
32060f0c5aeSxiaofeibao    sink.bits.vecWen := source.vecWen
321c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
322c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
32360f0c5aeSxiaofeibao    sink.bits.pdest := source.addr
32460f0c5aeSxiaofeibao  }
32560f0c5aeSxiaofeibao
326f39a61a1SzhanglyGit  wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) =>
327730cfbc0SXuan Hu    sink.valid := source.wen
328730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
329730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
330730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
331c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
332c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
333c720aa49Ssinsanction    sink.bits.pdest := source.addr
334c720aa49Ssinsanction  }
335c720aa49Ssinsanction
336c720aa49Ssinsanction  wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) =>
337c720aa49Ssinsanction    sink.valid := source.wen
338c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
339c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
340c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
341c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
342c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
343c720aa49Ssinsanction    sink.bits.pdest := source.addr
344c720aa49Ssinsanction  }
345c720aa49Ssinsanction
346c720aa49Ssinsanction  wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) =>
347c720aa49Ssinsanction    sink.valid := source.wen
348c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
349c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
350c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
351c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
352c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
353730cfbc0SXuan Hu    sink.bits.pdest := source.addr
354730cfbc0SXuan Hu  }
355730cfbc0SXuan Hu
356bf35baadSXuan Hu  // Connect bundles having the same wakeup source
35759ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
358bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
3590c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
3600c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
3610c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
3620c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
3630c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
3640c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
3650c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
3660c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3674c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3684c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3694c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
370c720aa49Ssinsanction        if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
371c720aa49Ssinsanction        if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3724c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3730c7ebb58Sxiaofeibao-xjtu      }
37460912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
37560f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
37660912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
377c720aa49Ssinsanction      if (iq.params.numV0Src == 0)  wakeUp.bits.v0Wen := false.B
378c720aa49Ssinsanction      if (iq.params.numVlSrc == 0)  wakeUp.bits.vlWen := false.B
379bf35baadSXuan Hu    }
380ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
381ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
382e600b1ddSxiaofeibao-xjtu    if (iq.params.needLoadDependency)
3830f55a0d3SHaojin Tang      iq.io.ldCancel := io.ldCancel
384e600b1ddSxiaofeibao-xjtu    else
385e600b1ddSxiaofeibao-xjtu      iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel)
386bf35baadSXuan Hu  }
387bf35baadSXuan Hu
388b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
389b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
390*d88d4328SZiyue Zhang    iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax
391*d88d4328SZiyue Zhang    iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero
392*d88d4328SZiyue Zhang    iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax
393*d88d4328SZiyue Zhang    iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero
394b6279fc6SZiyue Zhang  }
395b6279fc6SZiyue Zhang
396c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
397bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
398c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
399bf35baadSXuan Hu      .toMap
400bf35baadSXuan Hu
401bf35baadSXuan Hu  // Connect bundles having the same wakeup source
402bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
403c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
404bf35baadSXuan Hu  }
405bf35baadSXuan Hu
40659ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
40759ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
40859ef6009Sxiaofeibao-xjtu  }
409bf35baadSXuan Hu
410f99b81adSHaojin Tang  // Response
411f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
412f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
413f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
414f99b81adSHaojin Tang    }
415f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
416f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
417f99b81adSHaojin Tang    }
418f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
419670870b3SXuan Hu      if (io.loadFinalIssueResp(i).isDefinedAt(j)) {
420f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
421670870b3SXuan Hu      } else {
422670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
423670870b3SXuan Hu      }
424f99b81adSHaojin Tang    })
425e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
426aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
427e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
428aa2bcc31SzhanglyGit      } else {
429aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
430aa2bcc31SzhanglyGit      }
431e8800897SXuan Hu    })
4327e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
4337e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
4347e471bf8SXuan Hu    })
435f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
436f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
437f8b278aaSsinsanction    iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x))
438f8b278aaSsinsanction  }
43942b6cdf9Ssinsanction  if (params.needOg2Resp) {
44042b6cdf9Ssinsanction    issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) =>
44142b6cdf9Ssinsanction      iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) =>
44242b6cdf9Ssinsanction        iqOg2Resp := og2Resp
44342b6cdf9Ssinsanction      }
44442b6cdf9Ssinsanction    }
44542b6cdf9Ssinsanction  }
446f8b278aaSsinsanction
447f8b278aaSsinsanction  // Connect each replace RCIdx to IQ
448f8b278aaSsinsanction  if (params.needWriteRegCache) {
449f8b278aaSsinsanction    val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq =>
450f8b278aaSsinsanction      iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2)
451f8b278aaSsinsanction    }
452f8b278aaSsinsanction    iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) =>
453f8b278aaSsinsanction      iq := in
454f8b278aaSsinsanction    }
455f8b278aaSsinsanction
456f8b278aaSsinsanction    println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}")
457f8b278aaSsinsanction    println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}")
458f99b81adSHaojin Tang  }
459f99b81adSHaojin Tang
460e1a85e9fSchengguanghui  // perfEvent
461e1a85e9fSchengguanghui  val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire)))
462e1a85e9fSchengguanghui  val lastCycleIqEnqFireVec    = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten))
463e1a85e9fSchengguanghui  val lastCycleIqFullVec       = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready)))
464e1a85e9fSchengguanghui
465e1a85e9fSchengguanghui  val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) }
466e1a85e9fSchengguanghui  val basePerfEvents = Seq(
467e1a85e9fSchengguanghui    ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec)                 ),
468e1a85e9fSchengguanghui    ("issueQueue_enq_fire_cnt",  PopCount(lastCycleIqEnqFireVec)                    )
469e1a85e9fSchengguanghui  )  ++ issueQueueFullVecPerf
470e1a85e9fSchengguanghui
471c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
472bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
473bf35baadSXuan Hu
474bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
475c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
476730cfbc0SXuan Hu}
477730cfbc0SXuan Hu
478730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
479730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
480730cfbc0SXuan Hu    with HasXSParameter
481e1a85e9fSchengguanghui    with HasPerfEvents
482730cfbc0SXuan Hu{
4832e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
484730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
485730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
486730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
487730cfbc0SXuan Hu
488730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
489730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
490730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
491e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
492e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
493e600b1ddSxiaofeibao-xjtu    }
494f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
495f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
49660f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
497c720aa49Ssinsanction      case VfScheduler() => (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))
500596af5d2SHaojin Tang      case _ => null
501f39a61a1SzhanglyGit    }
502f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
503730cfbc0SXuan Hu  }
504e1a85e9fSchengguanghui
505e1a85e9fSchengguanghui  val perfEvents = basePerfEvents
506e1a85e9fSchengguanghui  generatePerfEvent()
507730cfbc0SXuan Hu}
508730cfbc0SXuan Hu
509f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
510730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
511730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
512730cfbc0SXuan Hu    with HasXSParameter
513e1a85e9fSchengguanghui    with HasPerfEvents
514730cfbc0SXuan Hu{
515730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
516730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
517730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
518730cfbc0SXuan Hu
519559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
520e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
521e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
522e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
523559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
524559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
525499caf4cSXuan Hu
526499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
527499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
528499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
529499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
530499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
531730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
532730cfbc0SXuan Hu
533853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
534853cd2d8SHaojin Tang
535fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
536596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
537596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
538596af5d2SHaojin Tang
539730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
540730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
541730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
542e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
543e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
544e600b1ddSxiaofeibao-xjtu    }
54560f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
54660f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
54760f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
548c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
549c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
550c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
55160f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
552730cfbc0SXuan Hu  }
553730cfbc0SXuan Hu
554ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
555ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
556ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
557c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
558de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5597b753bebSXuan Hu    case _ =>
5607b753bebSXuan Hu  }
5617b753bebSXuan Hu
562ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
563ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
564ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
565c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
566c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5677b753bebSXuan Hu    case _ =>
5687b753bebSXuan Hu  }
569730cfbc0SXuan Hu
570559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
571559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
572670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
573670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
5748f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5758f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
576559c1710SHaojin Tang      // TODO: refactor ditry code
577559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
578559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
579559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
5808f1fa9b1Ssfencevma    case _ =>
5818f1fa9b1Ssfencevma  }
5828f1fa9b1Ssfencevma
583e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
584e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
585e62b6911SXuan Hu
586e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
587e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
588e62b6911SXuan Hu
589e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
590e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
591e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
592e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
593e62b6911SXuan Hu
594e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
595e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
596e62b6911SXuan Hu
597e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
598e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
5999b258a00Sxgkiri
6000438e8f4SHaojin Tang  val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten
6010438e8f4SHaojin Tang  d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) =>
602730cfbc0SXuan Hu    val isAllReady = staIQ.ready && stdIQ.ready
603e62b6911SXuan Hu    dp.ready := isAllReady
604e62b6911SXuan Hu    staIQ.valid := dp.valid && isAllReady
6050438e8f4SHaojin Tang    stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
6069b258a00Sxgkiri  }
607730cfbc0SXuan Hu
6080438e8f4SHaojin Tang  val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten
6090438e8f4SHaojin Tang  d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) =>
610e62b6911SXuan Hu    val isAllReady = hyaIQ.ready && hydIQ.ready
611e62b6911SXuan Hu    dp.ready := isAllReady
612e62b6911SXuan Hu    hyaIQ.valid := dp.valid && isAllReady
61356bceacbSHaojin Tang    hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
614e62b6911SXuan Hu  }
615730cfbc0SXuan Hu
616e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
617e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
61860f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
61960f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
62060f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
621c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
622c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
623c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
62460f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
625e62b6911SXuan Hu  }
626e62b6911SXuan Hu
627e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
628730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
629730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
630e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
631730cfbc0SXuan Hu    //                       \
632730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
633730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
634730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
63597b279b9SXuan Hu    val stdIdx = 1
6362d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
637955b4beaSsinsanction    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx)
6382d270511Ssinsanction    stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
6392d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
640730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
641955b4beaSsinsanction    stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx)
642955b4beaSsinsanction    stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx)
643730cfbc0SXuan Hu  }
644730cfbc0SXuan Hu
6452d270511Ssinsanction  vecMemIQs.foreach {
6462d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
6472d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
6482d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
6491f3d1b4dSXuan Hu      // not used
650b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
6511f3d1b4dSXuan Hu      // maybe not used
6521f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
6531f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
65460f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
65560f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
65660f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
657c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
658c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
659c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
66060f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
661f39a61a1SzhanglyGit
6622d270511Ssinsanction    case _ =>
6632d270511Ssinsanction  }
664b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
665b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
666b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
667b7c799beSzhanglyGit  }.flatten
668b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
669b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
670b7c799beSzhanglyGit    case (sink, source) =>
671b7c799beSzhanglyGit      sink := source
672b7c799beSzhanglyGit  }
6732d270511Ssinsanction
674730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
675730cfbc0SXuan Hu
676730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
677730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
678730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
679730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
680730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
681730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
682f3a9fb05SAnzo  dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount
683f3a9fb05SAnzo  dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount
684730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
6857e471bf8SXuan Hu
6867e471bf8SXuan Hu  dontTouch(io.vecLoadIssueResp)
687e1a85e9fSchengguanghui
688e1a85e9fSchengguanghui  val intBusyTablePerf = intBusyTable.get
689e1a85e9fSchengguanghui  val fpBusyTablePerf  = fpBusyTable.get
690e1a85e9fSchengguanghui  val vecBusyTablePerf = vfBusyTable.get
691e1a85e9fSchengguanghui  val v0BusyTablePerf  = v0BusyTable.get
692e1a85e9fSchengguanghui  val vlBusyTablePerf  = vlBusyTable.get
693e1a85e9fSchengguanghui
694e1a85e9fSchengguanghui  val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents)
695e1a85e9fSchengguanghui  generatePerfEvent()
696730cfbc0SXuan Hu}
697