xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 42b6cdf9744fdb03eb7e5a7e7505d0c89eb40abd)
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
18955b4beaSsinsanctionimport xiangshan.backend.regcache.RegCacheTagTable
19730cfbc0SXuan Hu
20730cfbc0SXuan Husealed trait SchedulerType
21730cfbc0SXuan Hu
22730cfbc0SXuan Hucase class IntScheduler() extends SchedulerType
2360f0c5aeSxiaofeibaocase class FpScheduler() extends SchedulerType
24730cfbc0SXuan Hucase class MemScheduler() extends SchedulerType
25730cfbc0SXuan Hucase class VfScheduler() extends SchedulerType
26730cfbc0SXuan Hucase class NoScheduler() extends SchedulerType
27730cfbc0SXuan Hu
28730cfbc0SXuan Huclass Scheduler(val params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter {
291ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
301ca4a39dSXuan Hu
3139c59369SXuan Hu  val numIntStateWrite = backendParams.numPregWb(IntData())
3260f0c5aeSxiaofeibao  val numFpStateWrite = backendParams.numPregWb(FpData())
3339c59369SXuan Hu  val numVfStateWrite = backendParams.numPregWb(VecData())
3407b5cc60Sxiaofeibao  val numV0StateWrite = backendParams.numPregWb(V0Data())
3507b5cc60Sxiaofeibao  val numVlStateWrite = backendParams.numPregWb(VlData())
36730cfbc0SXuan Hu
37730cfbc0SXuan Hu  val dispatch2Iq = LazyModule(new Dispatch2Iq(params))
38730cfbc0SXuan Hu  val issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName)))
39730cfbc0SXuan Hu
4083ba63b3SXuan Hu  lazy val module: SchedulerImpBase = params.schdType match {
41730cfbc0SXuan Hu    case IntScheduler() => new SchedulerArithImp(this)(params, p)
4260f0c5aeSxiaofeibao    case FpScheduler()  => new SchedulerArithImp(this)(params, p)
43730cfbc0SXuan Hu    case MemScheduler() => new SchedulerMemImp(this)(params, p)
44730cfbc0SXuan Hu    case VfScheduler() => new SchedulerArithImp(this)(params, p)
45730cfbc0SXuan Hu    case _ => null
46730cfbc0SXuan Hu  }
47730cfbc0SXuan Hu}
48730cfbc0SXuan Hu
497f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle {
5068d13085SXuan Hu  // params alias
517f8233d5SHaojin Tang  private val LoadQueueSize = VirtualLoadQueueSize
5268d13085SXuan Hu
53730cfbc0SXuan Hu  val fromTop = new Bundle {
54730cfbc0SXuan Hu    val hartId = Input(UInt(8.W))
55730cfbc0SXuan Hu  }
562e0a7dc5Sfdy  val fromWbFuBusyTable = new Bundle{
572e0a7dc5Sfdy    val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle)))
582e0a7dc5Sfdy  }
59dd970561SzhanglyGit  val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle)))
6082674533Sxiaofeibao  val intIQValidNumVec = Output(MixedVec(backendParams.genIntIQValidNumBundle))
6182674533Sxiaofeibao  val fpIQValidNumVec = Output(MixedVec(backendParams.genFpIQValidNumBundle))
62dd970561SzhanglyGit
63730cfbc0SXuan Hu  val fromCtrlBlock = new Bundle {
64730cfbc0SXuan Hu    val flush = Flipped(ValidIO(new Redirect))
65730cfbc0SXuan Hu  }
66730cfbc0SXuan Hu  val fromDispatch = new Bundle {
67730cfbc0SXuan Hu    val allocPregs = Vec(RenameWidth, Input(new ResetPregStateReq))
68730cfbc0SXuan Hu    val uops =  Vec(params.numUopIn, Flipped(DecoupledIO(new DynInst)))
69730cfbc0SXuan Hu  }
7039c59369SXuan Hu  val intWriteBack = MixedVec(Vec(backendParams.numPregWb(IntData()),
71730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth)))
7260f0c5aeSxiaofeibao  val fpWriteBack = MixedVec(Vec(backendParams.numPregWb(FpData()),
7360f0c5aeSxiaofeibao    new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth)))
7439c59369SXuan Hu  val vfWriteBack = MixedVec(Vec(backendParams.numPregWb(VecData()),
75730cfbc0SXuan Hu    new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth)))
7607b5cc60Sxiaofeibao  val v0WriteBack = MixedVec(Vec(backendParams.numPregWb(V0Data()),
77c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth)))
7807b5cc60Sxiaofeibao  val vlWriteBack = MixedVec(Vec(backendParams.numPregWb(VlData()),
79c720aa49Ssinsanction    new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth)))
8059ef6009Sxiaofeibao-xjtu  val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle))
81730cfbc0SXuan Hu
82c720aa49Ssinsanction  val vlWriteBackInfo = new Bundle {
83b6279fc6SZiyue Zhang    val vlIsZero = Input(Bool())
84b6279fc6SZiyue Zhang    val vlIsVlmax = Input(Bool())
85b6279fc6SZiyue Zhang  }
86b6279fc6SZiyue Zhang
87bf35baadSXuan Hu  val fromSchedulers = new Bundle {
88c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
89bf35baadSXuan Hu  }
90bf35baadSXuan Hu
91bf35baadSXuan Hu  val toSchedulers = new Bundle {
92c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
93bf35baadSXuan Hu  }
94bf35baadSXuan Hu
95c0be7f33SXuan Hu  val fromDataPath = new Bundle {
9610fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
97be9ff987Ssinsanction    val og0Cancel = Input(ExuVec())
98ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
99be9ff987Ssinsanction    val og1Cancel = Input(ExuVec())
100f8b278aaSsinsanction    // replace RCIdx to Wakeup Queue
101f8b278aaSsinsanction    val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W))))
102c0be7f33SXuan Hu    // just be compatible to old code
103c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
104c0be7f33SXuan Hu  }
105c0be7f33SXuan Hu
1068a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1078a66c02cSXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1087e471bf8SXuan Hu  val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1090f55a0d3SHaojin Tang
1106810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
111c0be7f33SXuan Hu
112730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
113730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
114730cfbc0SXuan Hu  }) else None
115730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1167b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1177b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1188f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
119fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
120fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
121730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
122730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
123730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
124fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1252d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1262d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
127730cfbc0SXuan Hu    // from lsq
128730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
129730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
130730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
131730cfbc0SXuan Hu  }) else None
132730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
133730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
134730cfbc0SXuan Hu  }) else None
135*42b6cdf9Ssinsanction  val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None
136730cfbc0SXuan Hu}
137730cfbc0SXuan Hu
138730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
139730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
140730cfbc0SXuan Hu    with HasXSParameter
141730cfbc0SXuan Hu{
142730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
143730cfbc0SXuan Hu
144730cfbc0SXuan Hu  // alias
145c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
146c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
147730cfbc0SXuan Hu  private val schdType = params.schdType
148730cfbc0SXuan Hu
149730cfbc0SXuan Hu  // Modules
150730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
151730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
15282674533Sxiaofeibao  io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec)
15382674533Sxiaofeibao  io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec)
154ff3fcdf1Sxiaofeibao-xjtu  if (params.isIntSchd) {
15582674533Sxiaofeibao    dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec
15682674533Sxiaofeibao    io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
157ff3fcdf1Sxiaofeibao-xjtu  }
15882674533Sxiaofeibao  else if (params.isFpSchd) {
15982674533Sxiaofeibao    dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec
16082674533Sxiaofeibao    io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
16182674533Sxiaofeibao  }
162730cfbc0SXuan Hu
16356bcaed7SHaojin Tang  // valid count
16456bcaed7SHaojin Tang  dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt)
16556bcaed7SHaojin Tang
166730cfbc0SXuan Hu  // BusyTable Modules
167730cfbc0SXuan Hu  val intBusyTable = schdType match {
168bc7d6943SzhanglyGit    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB())))
169730cfbc0SXuan Hu    case _ => None
170730cfbc0SXuan Hu  }
17160f0c5aeSxiaofeibao  val fpBusyTable = schdType match {
17260f0c5aeSxiaofeibao    case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB())))
17360f0c5aeSxiaofeibao    case _ => None
17460f0c5aeSxiaofeibao  }
175730cfbc0SXuan Hu  val vfBusyTable = schdType match {
176bc7d6943SzhanglyGit    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB())))
177730cfbc0SXuan Hu    case _ => None
178730cfbc0SXuan Hu  }
179c720aa49Ssinsanction  val v0BusyTable = schdType match {
180c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB())))
181c720aa49Ssinsanction    case _ => None
182c720aa49Ssinsanction  }
183c720aa49Ssinsanction  val vlBusyTable = schdType match {
184c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB())))
185c720aa49Ssinsanction    case _ => None
186c720aa49Ssinsanction  }
187730cfbc0SXuan Hu
188955b4beaSsinsanction  // RegCacheTagTable Module
189955b4beaSsinsanction  val rcTagTable = schdType match {
190955b4beaSsinsanction    case IntScheduler() | MemScheduler() => Some(Module(new RegCacheTagTable(dispatch2Iq.numRCTagTableStateRead)))
191955b4beaSsinsanction    case _ => None
192955b4beaSsinsanction  }
193955b4beaSsinsanction
194730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
195730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
196730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
197730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
19860f0c5aeSxiaofeibao    dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read)
199730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
200c720aa49Ssinsanction    dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read)
201c720aa49Ssinsanction    dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read)
202955b4beaSsinsanction    dp2iq.readRCTagTableState.foreach(_ <> rcTagTable.get.io.readPorts)
203730cfbc0SXuan Hu  }
204730cfbc0SXuan Hu
205730cfbc0SXuan Hu  intBusyTable match {
206730cfbc0SXuan Hu    case Some(bt) =>
207730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
208730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
209730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
210730cfbc0SXuan Hu      }
211730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
212730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
213730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
214730cfbc0SXuan Hu      }
215bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
21637080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
21713551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
218730cfbc0SXuan Hu    case None =>
219730cfbc0SXuan Hu  }
220730cfbc0SXuan Hu
22160f0c5aeSxiaofeibao  fpBusyTable match {
222730cfbc0SXuan Hu    case Some(bt) =>
223730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
224730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
225730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
226730cfbc0SXuan Hu      }
227730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
22860f0c5aeSxiaofeibao        wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen
22960f0c5aeSxiaofeibao        wb.bits := io.fpWriteBack(i).addr
23060f0c5aeSxiaofeibao      }
23160f0c5aeSxiaofeibao      bt.io.wakeUp := io.fromSchedulers.wakeupVec
23237080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
23360f0c5aeSxiaofeibao      bt.io.ldCancel := io.ldCancel
23460f0c5aeSxiaofeibao    case None =>
23560f0c5aeSxiaofeibao  }
23660f0c5aeSxiaofeibao
23760f0c5aeSxiaofeibao  vfBusyTable match {
23860f0c5aeSxiaofeibao    case Some(bt) =>
23960f0c5aeSxiaofeibao      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
24060f0c5aeSxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVec
24160f0c5aeSxiaofeibao        btAllocPregs.bits := dpAllocPregs.preg
24260f0c5aeSxiaofeibao      }
24360f0c5aeSxiaofeibao      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
24460f0c5aeSxiaofeibao        wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen
245730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
246730cfbc0SXuan Hu      }
247bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
24837080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
24913551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
250730cfbc0SXuan Hu    case None =>
251730cfbc0SXuan Hu  }
252730cfbc0SXuan Hu
253c720aa49Ssinsanction  v0BusyTable match {
254c720aa49Ssinsanction    case Some(bt) =>
255c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
25629aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isV0
257c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
258c720aa49Ssinsanction      }
259c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
260c720aa49Ssinsanction        wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen
261c720aa49Ssinsanction        wb.bits := io.v0WriteBack(i).addr
262c720aa49Ssinsanction      }
263c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
26437080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
265c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
266c720aa49Ssinsanction    case None =>
267c720aa49Ssinsanction  }
268c720aa49Ssinsanction
269c720aa49Ssinsanction  vlBusyTable match {
270c720aa49Ssinsanction    case Some(bt) =>
271c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
27229aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVl
273c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
274c720aa49Ssinsanction      }
275c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
276c720aa49Ssinsanction        wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen
277c720aa49Ssinsanction        wb.bits := io.vlWriteBack(i).addr
278c720aa49Ssinsanction      }
279c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
28037080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
281c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
282c720aa49Ssinsanction    case None =>
283c720aa49Ssinsanction  }
284c720aa49Ssinsanction
285955b4beaSsinsanction  rcTagTable match {
286955b4beaSsinsanction    case Some(rct) =>
287955b4beaSsinsanction      rct.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
288955b4beaSsinsanction        btAllocPregs.valid := dpAllocPregs.isInt
289955b4beaSsinsanction        btAllocPregs.bits := dpAllocPregs.preg
290955b4beaSsinsanction      }
291955b4beaSsinsanction      rct.io.wakeupFromIQ := io.fromSchedulers.wakeupVec
292955b4beaSsinsanction      rct.io.og0Cancel := io.fromDataPath.og0Cancel
293955b4beaSsinsanction      rct.io.ldCancel := io.ldCancel
294955b4beaSsinsanction    case None =>
295955b4beaSsinsanction  }
296955b4beaSsinsanction
297f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
29860f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
299f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
300c720aa49Ssinsanction  val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle)
301c720aa49Ssinsanction  val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle)
302f39a61a1SzhanglyGit
303f39a61a1SzhanglyGit  wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) =>
304f39a61a1SzhanglyGit    sink.valid := source.wen
305f39a61a1SzhanglyGit    sink.bits.rfWen := source.intWen
306f39a61a1SzhanglyGit    sink.bits.fpWen := source.fpWen
307f39a61a1SzhanglyGit    sink.bits.vecWen := source.vecWen
308c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
309c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
310f39a61a1SzhanglyGit    sink.bits.pdest := source.addr
311730cfbc0SXuan Hu  }
312f39a61a1SzhanglyGit
31360f0c5aeSxiaofeibao  wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) =>
31460f0c5aeSxiaofeibao    sink.valid := source.wen
31560f0c5aeSxiaofeibao    sink.bits.rfWen := source.intWen
31660f0c5aeSxiaofeibao    sink.bits.fpWen := source.fpWen
31760f0c5aeSxiaofeibao    sink.bits.vecWen := source.vecWen
318c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
319c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
32060f0c5aeSxiaofeibao    sink.bits.pdest := source.addr
32160f0c5aeSxiaofeibao  }
32260f0c5aeSxiaofeibao
323f39a61a1SzhanglyGit  wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) =>
324730cfbc0SXuan Hu    sink.valid := source.wen
325730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
326730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
327730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
328c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
329c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
330c720aa49Ssinsanction    sink.bits.pdest := source.addr
331c720aa49Ssinsanction  }
332c720aa49Ssinsanction
333c720aa49Ssinsanction  wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) =>
334c720aa49Ssinsanction    sink.valid := source.wen
335c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
336c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
337c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
338c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
339c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
340c720aa49Ssinsanction    sink.bits.pdest := source.addr
341c720aa49Ssinsanction  }
342c720aa49Ssinsanction
343c720aa49Ssinsanction  wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) =>
344c720aa49Ssinsanction    sink.valid := source.wen
345c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
346c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
347c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
348c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
349c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
350730cfbc0SXuan Hu    sink.bits.pdest := source.addr
351730cfbc0SXuan Hu  }
352730cfbc0SXuan Hu
353bf35baadSXuan Hu  // Connect bundles having the same wakeup source
35459ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
355bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
3560c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
3570c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
3580c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
3590c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
3600c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
3610c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
3620c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
3630c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3644c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3654c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3664c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
367c720aa49Ssinsanction        if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
368c720aa49Ssinsanction        if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3694c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3700c7ebb58Sxiaofeibao-xjtu      }
37160912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
37260f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
37360912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
374c720aa49Ssinsanction      if (iq.params.numV0Src == 0)  wakeUp.bits.v0Wen := false.B
375c720aa49Ssinsanction      if (iq.params.numVlSrc == 0)  wakeUp.bits.vlWen := false.B
376bf35baadSXuan Hu    }
377ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
378ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
379e600b1ddSxiaofeibao-xjtu    if (iq.params.needLoadDependency)
3800f55a0d3SHaojin Tang      iq.io.ldCancel := io.ldCancel
381e600b1ddSxiaofeibao-xjtu    else
382e600b1ddSxiaofeibao-xjtu      iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel)
383bf35baadSXuan Hu  }
384bf35baadSXuan Hu
385b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
386b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
387c720aa49Ssinsanction    iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax
388c720aa49Ssinsanction    iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero
389b6279fc6SZiyue Zhang  }
390b6279fc6SZiyue Zhang
391c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
392bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
393c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
394bf35baadSXuan Hu      .toMap
395bf35baadSXuan Hu
396bf35baadSXuan Hu  // Connect bundles having the same wakeup source
397bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
398c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
399bf35baadSXuan Hu  }
400bf35baadSXuan Hu
40159ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
40259ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
40359ef6009Sxiaofeibao-xjtu  }
404bf35baadSXuan Hu
405f99b81adSHaojin Tang  // Response
406f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
407f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
408f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
409f99b81adSHaojin Tang    }
410f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
411f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
412f99b81adSHaojin Tang    }
413f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
414670870b3SXuan Hu      if (io.loadFinalIssueResp(i).isDefinedAt(j)) {
415f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
416670870b3SXuan Hu      } else {
417670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
418670870b3SXuan Hu      }
419f99b81adSHaojin Tang    })
420e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
421aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
422e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
423aa2bcc31SzhanglyGit      } else {
424aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
425aa2bcc31SzhanglyGit      }
426e8800897SXuan Hu    })
4277e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
4287e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
4297e471bf8SXuan Hu    })
430f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
431f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
432f8b278aaSsinsanction    iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x))
433f8b278aaSsinsanction  }
434*42b6cdf9Ssinsanction  if (params.needOg2Resp) {
435*42b6cdf9Ssinsanction    issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) =>
436*42b6cdf9Ssinsanction      iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) =>
437*42b6cdf9Ssinsanction        iqOg2Resp := og2Resp
438*42b6cdf9Ssinsanction      }
439*42b6cdf9Ssinsanction    }
440*42b6cdf9Ssinsanction  }
441f8b278aaSsinsanction
442f8b278aaSsinsanction  // Connect each replace RCIdx to IQ
443f8b278aaSsinsanction  if (params.needWriteRegCache) {
444f8b278aaSsinsanction    val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq =>
445f8b278aaSsinsanction      iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2)
446f8b278aaSsinsanction    }
447f8b278aaSsinsanction    iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) =>
448f8b278aaSsinsanction      iq := in
449f8b278aaSsinsanction    }
450f8b278aaSsinsanction
451f8b278aaSsinsanction    println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}")
452f8b278aaSsinsanction    println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}")
453f99b81adSHaojin Tang  }
454f99b81adSHaojin Tang
455e1a85e9fSchengguanghui  // perfEvent
456e1a85e9fSchengguanghui  val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire)))
457e1a85e9fSchengguanghui  val lastCycleIqEnqFireVec    = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten))
458e1a85e9fSchengguanghui  val lastCycleIqFullVec       = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready)))
459e1a85e9fSchengguanghui
460e1a85e9fSchengguanghui  val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) }
461e1a85e9fSchengguanghui  val basePerfEvents = Seq(
462e1a85e9fSchengguanghui    ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec)                 ),
463e1a85e9fSchengguanghui    ("issueQueue_enq_fire_cnt",  PopCount(lastCycleIqEnqFireVec)                    )
464e1a85e9fSchengguanghui  )  ++ issueQueueFullVecPerf
465e1a85e9fSchengguanghui
466c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
467bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
468bf35baadSXuan Hu
469bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
470c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
471730cfbc0SXuan Hu}
472730cfbc0SXuan Hu
473730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
474730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
475730cfbc0SXuan Hu    with HasXSParameter
476e1a85e9fSchengguanghui    with HasPerfEvents
477730cfbc0SXuan Hu{
4782e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
479730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
480730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
481730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
482730cfbc0SXuan Hu
483730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
484730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
485730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
486e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
487e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
488e600b1ddSxiaofeibao-xjtu    }
489f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
490f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
49160f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
492c720aa49Ssinsanction      case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
493c720aa49Ssinsanction                             wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
494c720aa49Ssinsanction                             wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
495596af5d2SHaojin Tang      case _ => null
496f39a61a1SzhanglyGit    }
497f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
498730cfbc0SXuan Hu  }
499e1a85e9fSchengguanghui
500e1a85e9fSchengguanghui  val perfEvents = basePerfEvents
501e1a85e9fSchengguanghui  generatePerfEvent()
502730cfbc0SXuan Hu}
503730cfbc0SXuan Hu
504f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
505730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
506730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
507730cfbc0SXuan Hu    with HasXSParameter
508e1a85e9fSchengguanghui    with HasPerfEvents
509730cfbc0SXuan Hu{
510730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
511730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
512730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
513730cfbc0SXuan Hu
514559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
515e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
516e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
517e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
518559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
519559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
520499caf4cSXuan Hu
521499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
522499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
523499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
524499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
525499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
526730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
527730cfbc0SXuan Hu
528853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
529853cd2d8SHaojin Tang
530fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
531596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
532596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
533596af5d2SHaojin Tang
534730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
535730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
536730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
537e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
538e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
539e600b1ddSxiaofeibao-xjtu    }
54060f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
54160f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
54260f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
543c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
544c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
545c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
54660f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
547730cfbc0SXuan Hu  }
548730cfbc0SXuan Hu
549ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
550ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
551ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
552c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
553de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5547b753bebSXuan Hu    case _ =>
5557b753bebSXuan Hu  }
5567b753bebSXuan Hu
557ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
558ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
559ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
560c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
561c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5627b753bebSXuan Hu    case _ =>
5637b753bebSXuan Hu  }
564730cfbc0SXuan Hu
565559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
566559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
567670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
568670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
5698f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5708f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
571559c1710SHaojin Tang      // TODO: refactor ditry code
572559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
573559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
574559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
5758f1fa9b1Ssfencevma    case _ =>
5768f1fa9b1Ssfencevma  }
5778f1fa9b1Ssfencevma
578e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
579e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
580e62b6911SXuan Hu
581e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
582e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
583e62b6911SXuan Hu
584e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
585e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
586e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
587e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
588e62b6911SXuan Hu
589e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
590e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
591e62b6911SXuan Hu
592e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
593e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
5949b258a00Sxgkiri
5950438e8f4SHaojin Tang  val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten
5960438e8f4SHaojin Tang  d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) =>
597730cfbc0SXuan Hu    val isAllReady = staIQ.ready && stdIQ.ready
598e62b6911SXuan Hu    dp.ready := isAllReady
599e62b6911SXuan Hu    staIQ.valid := dp.valid && isAllReady
6000438e8f4SHaojin Tang    stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
6019b258a00Sxgkiri  }
602730cfbc0SXuan Hu
6030438e8f4SHaojin Tang  val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten
6040438e8f4SHaojin Tang  d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) =>
605e62b6911SXuan Hu    val isAllReady = hyaIQ.ready && hydIQ.ready
606e62b6911SXuan Hu    dp.ready := isAllReady
607e62b6911SXuan Hu    hyaIQ.valid := dp.valid && isAllReady
60856bceacbSHaojin Tang    hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
609e62b6911SXuan Hu  }
610730cfbc0SXuan Hu
611e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
612e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
61360f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
61460f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
61560f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
616c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
617c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
618c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
61960f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
620e62b6911SXuan Hu  }
621e62b6911SXuan Hu
622e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
623730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
624730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
625e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
626730cfbc0SXuan Hu    //                       \
627730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
628730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
629730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
63097b279b9SXuan Hu    val stdIdx = 1
6312d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
632955b4beaSsinsanction    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx)
6332d270511Ssinsanction    stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
6342d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
635730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
636955b4beaSsinsanction    stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx)
637955b4beaSsinsanction    stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx)
638730cfbc0SXuan Hu  }
639730cfbc0SXuan Hu
6402d270511Ssinsanction  vecMemIQs.foreach {
6412d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
6422d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
6432d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
6441f3d1b4dSXuan Hu      // not used
645b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
6461f3d1b4dSXuan Hu      // maybe not used
6471f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
6481f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
64960f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
65060f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
65160f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
652c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
653c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
654c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
65560f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
656f39a61a1SzhanglyGit
6572d270511Ssinsanction    case _ =>
6582d270511Ssinsanction  }
659b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
660b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
661b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
662b7c799beSzhanglyGit  }.flatten
663b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
664b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
665b7c799beSzhanglyGit    case (sink, source) =>
666b7c799beSzhanglyGit      sink := source
667b7c799beSzhanglyGit  }
6682d270511Ssinsanction
669730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
670730cfbc0SXuan Hu
671730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
672730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
673730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
674730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
675730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
676730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
677f3a9fb05SAnzo  dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount
678f3a9fb05SAnzo  dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount
679730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
6807e471bf8SXuan Hu
6817e471bf8SXuan Hu  dontTouch(io.vecLoadIssueResp)
682e1a85e9fSchengguanghui
683e1a85e9fSchengguanghui  val intBusyTablePerf = intBusyTable.get
684e1a85e9fSchengguanghui  val fpBusyTablePerf  = fpBusyTable.get
685e1a85e9fSchengguanghui  val vecBusyTablePerf = vfBusyTable.get
686e1a85e9fSchengguanghui  val v0BusyTablePerf  = v0BusyTable.get
687e1a85e9fSchengguanghui  val vlBusyTablePerf  = vlBusyTable.get
688e1a85e9fSchengguanghui
689e1a85e9fSchengguanghui  val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents)
690e1a85e9fSchengguanghui  generatePerfEvent()
691730cfbc0SXuan Hu}
692