xref: /XiangShan/src/main/scala/xiangshan/backend/issue/Scheduler.scala (revision 44f2941b36bd01d0dea9e5e076949f6438c0014d)
1730cfbc0SXuan Hupackage xiangshan.backend.issue
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4730cfbc0SXuan Huimport chisel3._
5730cfbc0SXuan Huimport chisel3.util._
6730cfbc0SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp}
7*44f2941bSJiru Sunimport utility.HasPerfEvents
8*44f2941bSJiru 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 {
84b6279fc6SZiyue Zhang    val vlIsZero = Input(Bool())
85b6279fc6SZiyue Zhang    val vlIsVlmax = Input(Bool())
86b6279fc6SZiyue Zhang  }
87b6279fc6SZiyue Zhang
88bf35baadSXuan Hu  val fromSchedulers = new Bundle {
89c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle)
90bf35baadSXuan Hu  }
91bf35baadSXuan Hu
92bf35baadSXuan Hu  val toSchedulers = new Bundle {
93c0be7f33SXuan Hu    val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle
94bf35baadSXuan Hu  }
95bf35baadSXuan Hu
96c0be7f33SXuan Hu  val fromDataPath = new Bundle {
9710fe9778SXuan Hu    val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle)))
98be9ff987Ssinsanction    val og0Cancel = Input(ExuVec())
99ea46c302SXuan Hu    // Todo: remove this after no cancel signal from og1
100be9ff987Ssinsanction    val og1Cancel = Input(ExuVec())
101f8b278aaSsinsanction    // replace RCIdx to Wakeup Queue
102f8b278aaSsinsanction    val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W))))
103c0be7f33SXuan Hu    // just be compatible to old code
104c0be7f33SXuan Hu    def apply(i: Int)(j: Int) = resp(i)(j)
105c0be7f33SXuan Hu  }
106c0be7f33SXuan Hu
1078a66c02cSXuan Hu  val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1088a66c02cSXuan Hu  val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1097e471bf8SXuan Hu  val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x)))))))
1100f55a0d3SHaojin Tang
1116810d1e8Ssfencevma  val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO))
112c0be7f33SXuan Hu
113730cfbc0SXuan Hu  val memIO = if (params.isMemSchd) Some(new Bundle {
114730cfbc0SXuan Hu    val lsqEnqIO = Flipped(new LsqEnqIO)
115730cfbc0SXuan Hu  }) else None
116730cfbc0SXuan Hu  val fromMem = if (params.isMemSchd) Some(new Bundle {
1177b753bebSXuan Hu    val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO))
1187b753bebSXuan Hu    val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO))
1198f1fa9b1Ssfencevma    val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO))
120fd490615Sweiding liu    val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true)))
121fd490615Sweiding liu    val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true)))
122730cfbc0SXuan Hu    val stIssuePtr = Input(new SqPtr())
123730cfbc0SXuan Hu    val lcommit = Input(UInt(log2Up(CommitWidth + 1).W))
124730cfbc0SXuan Hu    val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB
125fc45ed13SXuan Hu    val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst)))
1262d270511Ssinsanction    val lqDeqPtr = Input(new LqPtr)
1272d270511Ssinsanction    val sqDeqPtr = Input(new SqPtr)
128730cfbc0SXuan Hu    // from lsq
129730cfbc0SXuan Hu    val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W))
130730cfbc0SXuan Hu    val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W))
131730cfbc0SXuan Hu    val memWaitUpdateReq = Flipped(new MemWaitUpdateReq)
132730cfbc0SXuan Hu  }) else None
133730cfbc0SXuan Hu  val toMem = if (params.isMemSchd) Some(new Bundle {
134730cfbc0SXuan Hu    val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle))
135730cfbc0SXuan Hu  }) else None
13642b6cdf9Ssinsanction  val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None
137730cfbc0SXuan Hu}
138730cfbc0SXuan Hu
139730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
140730cfbc0SXuan Hu  extends LazyModuleImp(wrapper)
141730cfbc0SXuan Hu    with HasXSParameter
142730cfbc0SXuan Hu{
143730cfbc0SXuan Hu  val io = IO(new SchedulerIO())
144730cfbc0SXuan Hu
145730cfbc0SXuan Hu  // alias
146c0be7f33SXuan Hu  private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
147c0be7f33SXuan Hu    io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap
148730cfbc0SXuan Hu  private val schdType = params.schdType
149730cfbc0SXuan Hu
150730cfbc0SXuan Hu  // Modules
151730cfbc0SXuan Hu  val dispatch2Iq: Dispatch2IqImp = wrapper.dispatch2Iq.module
152730cfbc0SXuan Hu  val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module)
15382674533Sxiaofeibao  io.intIQValidNumVec := 0.U.asTypeOf(io.intIQValidNumVec)
15482674533Sxiaofeibao  io.fpIQValidNumVec := 0.U.asTypeOf(io.fpIQValidNumVec)
155ff3fcdf1Sxiaofeibao-xjtu  if (params.isIntSchd) {
15682674533Sxiaofeibao    dispatch2Iq.io.intIQValidNumVec.get := io.intIQValidNumVec
15782674533Sxiaofeibao    io.intIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
158ff3fcdf1Sxiaofeibao-xjtu  }
15982674533Sxiaofeibao  else if (params.isFpSchd) {
16082674533Sxiaofeibao    dispatch2Iq.io.fpIQValidNumVec.get := io.fpIQValidNumVec
16182674533Sxiaofeibao    io.fpIQValidNumVec := MixedVecInit(issueQueues.map(_.io.validCntDeqVec))
16282674533Sxiaofeibao  }
163730cfbc0SXuan Hu
16456bcaed7SHaojin Tang  // valid count
16556bcaed7SHaojin Tang  dispatch2Iq.io.iqValidCnt := issueQueues.filter(_.params.StdCnt == 0).map(_.io.status.validCnt)
16656bcaed7SHaojin Tang
167730cfbc0SXuan Hu  // BusyTable Modules
168730cfbc0SXuan Hu  val intBusyTable = schdType match {
169bc7d6943SzhanglyGit    case IntScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numIntStateRead, wrapper.numIntStateWrite, IntPhyRegs, IntWB())))
170730cfbc0SXuan Hu    case _ => None
171730cfbc0SXuan Hu  }
17260f0c5aeSxiaofeibao  val fpBusyTable = schdType match {
17360f0c5aeSxiaofeibao    case FpScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numFpStateRead, wrapper.numFpStateWrite, FpPhyRegs, FpWB())))
17460f0c5aeSxiaofeibao    case _ => None
17560f0c5aeSxiaofeibao  }
176730cfbc0SXuan Hu  val vfBusyTable = schdType match {
177bc7d6943SzhanglyGit    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVfStateRead, wrapper.numVfStateWrite, VfPhyRegs, VfWB())))
178730cfbc0SXuan Hu    case _ => None
179730cfbc0SXuan Hu  }
180c720aa49Ssinsanction  val v0BusyTable = schdType match {
181c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numV0StateRead, wrapper.numV0StateWrite, V0PhyRegs, V0WB())))
182c720aa49Ssinsanction    case _ => None
183c720aa49Ssinsanction  }
184c720aa49Ssinsanction  val vlBusyTable = schdType match {
185c720aa49Ssinsanction    case VfScheduler() | MemScheduler() => Some(Module(new BusyTable(dispatch2Iq.numVlStateRead, wrapper.numVlStateWrite, VlPhyRegs, VlWB())))
186c720aa49Ssinsanction    case _ => None
187c720aa49Ssinsanction  }
188730cfbc0SXuan Hu
189955b4beaSsinsanction  // RegCacheTagTable Module
190955b4beaSsinsanction  val rcTagTable = schdType match {
191955b4beaSsinsanction    case IntScheduler() | MemScheduler() => Some(Module(new RegCacheTagTable(dispatch2Iq.numRCTagTableStateRead)))
192955b4beaSsinsanction    case _ => None
193955b4beaSsinsanction  }
194955b4beaSsinsanction
195730cfbc0SXuan Hu  dispatch2Iq.io match { case dp2iq =>
196730cfbc0SXuan Hu    dp2iq.redirect <> io.fromCtrlBlock.flush
197730cfbc0SXuan Hu    dp2iq.in <> io.fromDispatch.uops
198730cfbc0SXuan Hu    dp2iq.readIntState.foreach(_ <> intBusyTable.get.io.read)
19960f0c5aeSxiaofeibao    dp2iq.readFpState.foreach(_ <> fpBusyTable.get.io.read)
200730cfbc0SXuan Hu    dp2iq.readVfState.foreach(_ <> vfBusyTable.get.io.read)
201c720aa49Ssinsanction    dp2iq.readV0State.foreach(_ <> v0BusyTable.get.io.read)
202c720aa49Ssinsanction    dp2iq.readVlState.foreach(_ <> vlBusyTable.get.io.read)
203955b4beaSsinsanction    dp2iq.readRCTagTableState.foreach(_ <> rcTagTable.get.io.readPorts)
204730cfbc0SXuan Hu  }
205730cfbc0SXuan Hu
206730cfbc0SXuan Hu  intBusyTable match {
207730cfbc0SXuan Hu    case Some(bt) =>
208730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
209730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isInt
210730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
211730cfbc0SXuan Hu      }
212730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
213730cfbc0SXuan Hu        wb.valid := io.intWriteBack(i).wen && io.intWriteBack(i).intWen
214730cfbc0SXuan Hu        wb.bits := io.intWriteBack(i).addr
215730cfbc0SXuan Hu      }
216bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
21737080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
21813551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
219730cfbc0SXuan Hu    case None =>
220730cfbc0SXuan Hu  }
221730cfbc0SXuan Hu
22260f0c5aeSxiaofeibao  fpBusyTable match {
223730cfbc0SXuan Hu    case Some(bt) =>
224730cfbc0SXuan Hu      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
225730cfbc0SXuan Hu        btAllocPregs.valid := dpAllocPregs.isFp
226730cfbc0SXuan Hu        btAllocPregs.bits := dpAllocPregs.preg
227730cfbc0SXuan Hu      }
228730cfbc0SXuan Hu      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
22960f0c5aeSxiaofeibao        wb.valid := io.fpWriteBack(i).wen && io.fpWriteBack(i).fpWen
23060f0c5aeSxiaofeibao        wb.bits := io.fpWriteBack(i).addr
23160f0c5aeSxiaofeibao      }
23260f0c5aeSxiaofeibao      bt.io.wakeUp := io.fromSchedulers.wakeupVec
23337080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
23460f0c5aeSxiaofeibao      bt.io.ldCancel := io.ldCancel
23560f0c5aeSxiaofeibao    case None =>
23660f0c5aeSxiaofeibao  }
23760f0c5aeSxiaofeibao
23860f0c5aeSxiaofeibao  vfBusyTable match {
23960f0c5aeSxiaofeibao    case Some(bt) =>
24060f0c5aeSxiaofeibao      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
24160f0c5aeSxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVec
24260f0c5aeSxiaofeibao        btAllocPregs.bits := dpAllocPregs.preg
24360f0c5aeSxiaofeibao      }
24460f0c5aeSxiaofeibao      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
24560f0c5aeSxiaofeibao        wb.valid := io.vfWriteBack(i).wen && io.vfWriteBack(i).vecWen
246730cfbc0SXuan Hu        wb.bits := io.vfWriteBack(i).addr
247730cfbc0SXuan Hu      }
248bc7d6943SzhanglyGit      bt.io.wakeUp := io.fromSchedulers.wakeupVec
24937080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
25013551487SzhanglyGit      bt.io.ldCancel := io.ldCancel
251730cfbc0SXuan Hu    case None =>
252730cfbc0SXuan Hu  }
253730cfbc0SXuan Hu
254c720aa49Ssinsanction  v0BusyTable match {
255c720aa49Ssinsanction    case Some(bt) =>
256c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
25729aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isV0
258c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
259c720aa49Ssinsanction      }
260c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
261c720aa49Ssinsanction        wb.valid := io.v0WriteBack(i).wen && io.v0WriteBack(i).v0Wen
262c720aa49Ssinsanction        wb.bits := io.v0WriteBack(i).addr
263c720aa49Ssinsanction      }
264c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
26537080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
266c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
267c720aa49Ssinsanction    case None =>
268c720aa49Ssinsanction  }
269c720aa49Ssinsanction
270c720aa49Ssinsanction  vlBusyTable match {
271c720aa49Ssinsanction    case Some(bt) =>
272c720aa49Ssinsanction      bt.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
27329aa55c1Sxiaofeibao        btAllocPregs.valid := dpAllocPregs.isVl
274c720aa49Ssinsanction        btAllocPregs.bits := dpAllocPregs.preg
275c720aa49Ssinsanction      }
276c720aa49Ssinsanction      bt.io.wbPregs.zipWithIndex.foreach { case (wb, i) =>
277c720aa49Ssinsanction        wb.valid := io.vlWriteBack(i).wen && io.vlWriteBack(i).vlWen
278c720aa49Ssinsanction        wb.bits := io.vlWriteBack(i).addr
279c720aa49Ssinsanction      }
280c720aa49Ssinsanction      bt.io.wakeUp := io.fromSchedulers.wakeupVec
28137080bd8Ssinsanction      bt.io.og0Cancel := io.fromDataPath.og0Cancel
282c720aa49Ssinsanction      bt.io.ldCancel := io.ldCancel
283c720aa49Ssinsanction    case None =>
284c720aa49Ssinsanction  }
285c720aa49Ssinsanction
286955b4beaSsinsanction  rcTagTable match {
287955b4beaSsinsanction    case Some(rct) =>
288955b4beaSsinsanction      rct.io.allocPregs.zip(io.fromDispatch.allocPregs).foreach { case (btAllocPregs, dpAllocPregs) =>
289955b4beaSsinsanction        btAllocPregs.valid := dpAllocPregs.isInt
290955b4beaSsinsanction        btAllocPregs.bits := dpAllocPregs.preg
291955b4beaSsinsanction      }
292955b4beaSsinsanction      rct.io.wakeupFromIQ := io.fromSchedulers.wakeupVec
293955b4beaSsinsanction      rct.io.og0Cancel := io.fromDataPath.og0Cancel
294955b4beaSsinsanction      rct.io.ldCancel := io.ldCancel
295955b4beaSsinsanction    case None =>
296955b4beaSsinsanction  }
297955b4beaSsinsanction
298f39a61a1SzhanglyGit  val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle)
29960f0c5aeSxiaofeibao  val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle)
300f39a61a1SzhanglyGit  val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle)
301c720aa49Ssinsanction  val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle)
302c720aa49Ssinsanction  val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle)
303f39a61a1SzhanglyGit
304f39a61a1SzhanglyGit  wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) =>
305f39a61a1SzhanglyGit    sink.valid := source.wen
306f39a61a1SzhanglyGit    sink.bits.rfWen := source.intWen
307f39a61a1SzhanglyGit    sink.bits.fpWen := source.fpWen
308f39a61a1SzhanglyGit    sink.bits.vecWen := source.vecWen
309c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
310c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
311f39a61a1SzhanglyGit    sink.bits.pdest := source.addr
312730cfbc0SXuan Hu  }
313f39a61a1SzhanglyGit
31460f0c5aeSxiaofeibao  wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) =>
31560f0c5aeSxiaofeibao    sink.valid := source.wen
31660f0c5aeSxiaofeibao    sink.bits.rfWen := source.intWen
31760f0c5aeSxiaofeibao    sink.bits.fpWen := source.fpWen
31860f0c5aeSxiaofeibao    sink.bits.vecWen := source.vecWen
319c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
320c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
32160f0c5aeSxiaofeibao    sink.bits.pdest := source.addr
32260f0c5aeSxiaofeibao  }
32360f0c5aeSxiaofeibao
324f39a61a1SzhanglyGit  wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) =>
325730cfbc0SXuan Hu    sink.valid := source.wen
326730cfbc0SXuan Hu    sink.bits.rfWen := source.intWen
327730cfbc0SXuan Hu    sink.bits.fpWen := source.fpWen
328730cfbc0SXuan Hu    sink.bits.vecWen := source.vecWen
329c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
330c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
331c720aa49Ssinsanction    sink.bits.pdest := source.addr
332c720aa49Ssinsanction  }
333c720aa49Ssinsanction
334c720aa49Ssinsanction  wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) =>
335c720aa49Ssinsanction    sink.valid := source.wen
336c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
337c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
338c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
339c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
340c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
341c720aa49Ssinsanction    sink.bits.pdest := source.addr
342c720aa49Ssinsanction  }
343c720aa49Ssinsanction
344c720aa49Ssinsanction  wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) =>
345c720aa49Ssinsanction    sink.valid := source.wen
346c720aa49Ssinsanction    sink.bits.rfWen := source.intWen
347c720aa49Ssinsanction    sink.bits.fpWen := source.fpWen
348c720aa49Ssinsanction    sink.bits.vecWen := source.vecWen
349c720aa49Ssinsanction    sink.bits.v0Wen := source.v0Wen
350c720aa49Ssinsanction    sink.bits.vlWen := source.vlWen
351730cfbc0SXuan Hu    sink.bits.pdest := source.addr
352730cfbc0SXuan Hu  }
353730cfbc0SXuan Hu
354bf35baadSXuan Hu  // Connect bundles having the same wakeup source
35559ef6009Sxiaofeibao-xjtu  issueQueues.zipWithIndex.foreach { case(iq, i) =>
356bf35baadSXuan Hu    iq.io.wakeupFromIQ.foreach { wakeUp =>
3570c7ebb58Sxiaofeibao-xjtu      val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx)
3580c7ebb58Sxiaofeibao-xjtu      val exuIdx = wakeUp.bits.exuIdx
3590c7ebb58Sxiaofeibao-xjtu      println(s"[Backend] Connect wakeup exuIdx ${exuIdx}")
3600c7ebb58Sxiaofeibao-xjtu      connectSamePort(wakeUp,wakeUpIn)
3610c7ebb58Sxiaofeibao-xjtu      backendParams.connectWakeup(exuIdx)
3620c7ebb58Sxiaofeibao-xjtu      if (backendParams.isCopyPdest(exuIdx)) {
3630c7ebb58Sxiaofeibao-xjtu        println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}")
3640c7ebb58Sxiaofeibao-xjtu        wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3654c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3664c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3674c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
368c720aa49Ssinsanction        if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
369c720aa49Ssinsanction        if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3704c5a0d77Sxiaofeibao-xjtu        if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx))
3710c7ebb58Sxiaofeibao-xjtu      }
37260912d84Sxiaofeibao-xjtu      if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B
37360f0c5aeSxiaofeibao      if (iq.params.numFpSrc == 0)  wakeUp.bits.fpWen := false.B
37460912d84Sxiaofeibao-xjtu      if (iq.params.numVfSrc == 0)  wakeUp.bits.vecWen := false.B
375c720aa49Ssinsanction      if (iq.params.numV0Src == 0)  wakeUp.bits.v0Wen := false.B
376c720aa49Ssinsanction      if (iq.params.numVlSrc == 0)  wakeUp.bits.vlWen := false.B
377bf35baadSXuan Hu    }
378ea46c302SXuan Hu    iq.io.og0Cancel := io.fromDataPath.og0Cancel
379ea46c302SXuan Hu    iq.io.og1Cancel := io.fromDataPath.og1Cancel
380e600b1ddSxiaofeibao-xjtu    if (iq.params.needLoadDependency)
3810f55a0d3SHaojin Tang      iq.io.ldCancel := io.ldCancel
382e600b1ddSxiaofeibao-xjtu    else
383e600b1ddSxiaofeibao-xjtu      iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel)
384bf35baadSXuan Hu  }
385bf35baadSXuan Hu
386b6279fc6SZiyue Zhang  // connect the vl writeback informatino to the issue queues
387b6279fc6SZiyue Zhang  issueQueues.zipWithIndex.foreach { case(iq, i) =>
388c720aa49Ssinsanction    iq.io.vlIsVlmax := io.vlWriteBackInfo.vlIsVlmax
389c720aa49Ssinsanction    iq.io.vlIsZero := io.vlWriteBackInfo.vlIsZero
390b6279fc6SZiyue Zhang  }
391b6279fc6SZiyue Zhang
392c0be7f33SXuan Hu  private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] =
393bf35baadSXuan Hu    issueQueues.flatMap(_.io.wakeupToIQ)
394c0be7f33SXuan Hu      .map(x => (x.bits.exuIdx, x))
395bf35baadSXuan Hu      .toMap
396bf35baadSXuan Hu
397bf35baadSXuan Hu  // Connect bundles having the same wakeup source
398bf35baadSXuan Hu  io.toSchedulers.wakeupVec.foreach { wakeUp =>
399c0be7f33SXuan Hu    wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx)
400bf35baadSXuan Hu  }
401bf35baadSXuan Hu
40259ef6009Sxiaofeibao-xjtu  io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) =>
40359ef6009Sxiaofeibao-xjtu    toDpDy <> issueQueues(i).io.deqDelay
40459ef6009Sxiaofeibao-xjtu  }
405bf35baadSXuan Hu
406f99b81adSHaojin Tang  // Response
407f99b81adSHaojin Tang  issueQueues.zipWithIndex.foreach { case (iq, i) =>
408f99b81adSHaojin Tang    iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) =>
409f99b81adSHaojin Tang      og0Resp := io.fromDataPath(i)(j).og0resp
410f99b81adSHaojin Tang    }
411f99b81adSHaojin Tang    iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) =>
412f99b81adSHaojin Tang      og1Resp := io.fromDataPath(i)(j).og1resp
413f99b81adSHaojin Tang    }
414f99b81adSHaojin Tang    iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) =>
415670870b3SXuan Hu      if (io.loadFinalIssueResp(i).isDefinedAt(j)) {
416f99b81adSHaojin Tang        finalIssueResp := io.loadFinalIssueResp(i)(j)
417670870b3SXuan Hu      } else {
418670870b3SXuan Hu        finalIssueResp := 0.U.asTypeOf(finalIssueResp)
419670870b3SXuan Hu      }
420f99b81adSHaojin Tang    })
421e8800897SXuan Hu    iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) =>
422aa2bcc31SzhanglyGit      if (io.memAddrIssueResp(i).isDefinedAt(j)) {
423e8800897SXuan Hu        memAddrIssueResp := io.memAddrIssueResp(i)(j)
424aa2bcc31SzhanglyGit      } else {
425aa2bcc31SzhanglyGit        memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp)
426aa2bcc31SzhanglyGit      }
427e8800897SXuan Hu    })
4287e471bf8SXuan Hu    iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) =>
4297e471bf8SXuan Hu      resp := io.vecLoadIssueResp(i)(deqIdx)
4307e471bf8SXuan Hu    })
431f99b81adSHaojin Tang    iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i)
432f99b81adSHaojin Tang    io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite
433f8b278aaSsinsanction    iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x))
434f8b278aaSsinsanction  }
43542b6cdf9Ssinsanction  if (params.needOg2Resp) {
43642b6cdf9Ssinsanction    issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) =>
43742b6cdf9Ssinsanction      iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) =>
43842b6cdf9Ssinsanction        iqOg2Resp := og2Resp
43942b6cdf9Ssinsanction      }
44042b6cdf9Ssinsanction    }
44142b6cdf9Ssinsanction  }
442f8b278aaSsinsanction
443f8b278aaSsinsanction  // Connect each replace RCIdx to IQ
444f8b278aaSsinsanction  if (params.needWriteRegCache) {
445f8b278aaSsinsanction    val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq =>
446f8b278aaSsinsanction      iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2)
447f8b278aaSsinsanction    }
448f8b278aaSsinsanction    iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) =>
449f8b278aaSsinsanction      iq := in
450f8b278aaSsinsanction    }
451f8b278aaSsinsanction
452f8b278aaSsinsanction    println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}")
453f8b278aaSsinsanction    println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}")
454f99b81adSHaojin Tang  }
455f99b81adSHaojin Tang
456e1a85e9fSchengguanghui  // perfEvent
457e1a85e9fSchengguanghui  val lastCycleDp2IqOutFireVec = RegNext(VecInit(dispatch2Iq.io.out.flatten.map(_.fire)))
458e1a85e9fSchengguanghui  val lastCycleIqEnqFireVec    = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten))
459e1a85e9fSchengguanghui  val lastCycleIqFullVec       = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready)))
460e1a85e9fSchengguanghui
461e1a85e9fSchengguanghui  val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) }
462e1a85e9fSchengguanghui  val basePerfEvents = Seq(
463e1a85e9fSchengguanghui    ("dispatch2Iq_out_fire_cnt", PopCount(lastCycleDp2IqOutFireVec)                 ),
464e1a85e9fSchengguanghui    ("issueQueue_enq_fire_cnt",  PopCount(lastCycleIqEnqFireVec)                    )
465e1a85e9fSchengguanghui  )  ++ issueQueueFullVecPerf
466e1a85e9fSchengguanghui
467c0be7f33SXuan Hu  println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
468bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}")
469bf35baadSXuan Hu
470bf35baadSXuan Hu  println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}")
471c0be7f33SXuan Hu  println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}")
472730cfbc0SXuan Hu}
473730cfbc0SXuan Hu
474730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
475730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
476730cfbc0SXuan Hu    with HasXSParameter
477e1a85e9fSchengguanghui    with HasPerfEvents
478730cfbc0SXuan Hu{
4792e0a7dc5Sfdy//  dontTouch(io.vfWbFuBusyTable)
480730cfbc0SXuan Hu  println(s"[SchedulerArithImp] " +
481730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
482730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
483730cfbc0SXuan Hu
484730cfbc0SXuan Hu  issueQueues.zipWithIndex.foreach { case (iq, i) =>
485730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
486730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
487e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
488e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
489e600b1ddSxiaofeibao-xjtu    }
490f39a61a1SzhanglyGit    val intWBIQ = params.schdType match {
491f39a61a1SzhanglyGit      case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1)
49260f0c5aeSxiaofeibao      case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1)
493c720aa49Ssinsanction      case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
494c720aa49Ssinsanction                             wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
495c720aa49Ssinsanction                             wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1))
496596af5d2SHaojin Tang      case _ => null
497f39a61a1SzhanglyGit    }
498f39a61a1SzhanglyGit    iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source}
499730cfbc0SXuan Hu  }
500e1a85e9fSchengguanghui
501e1a85e9fSchengguanghui  val perfEvents = basePerfEvents
502e1a85e9fSchengguanghui  generatePerfEvent()
503730cfbc0SXuan Hu}
504730cfbc0SXuan Hu
505f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly!
506730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters)
507730cfbc0SXuan Hu  extends SchedulerImpBase(wrapper)
508730cfbc0SXuan Hu    with HasXSParameter
509e1a85e9fSchengguanghui    with HasPerfEvents
510730cfbc0SXuan Hu{
511730cfbc0SXuan Hu  println(s"[SchedulerMemImp] " +
512730cfbc0SXuan Hu    s"has intBusyTable: ${intBusyTable.nonEmpty}, " +
513730cfbc0SXuan Hu    s"has vfBusyTable: ${vfBusyTable.nonEmpty}")
514730cfbc0SXuan Hu
515559c1710SHaojin Tang  val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ)
516e07131b2Ssinsanction  val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs
517e07131b2Ssinsanction  val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0)
518e07131b2Ssinsanction  val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0)
519559c1710SHaojin Tang  val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ)
520559c1710SHaojin Tang  val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip
521499caf4cSXuan Hu
522499caf4cSXuan Hu  println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}")
523499caf4cSXuan Hu  println(s"[SchedulerMemImp] stAddrIQs.size:  ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}")
524499caf4cSXuan Hu  println(s"[SchedulerMemImp] ldAddrIQs.size:  ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}")
525499caf4cSXuan Hu  println(s"[SchedulerMemImp] stDataIQs.size:  ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}")
526499caf4cSXuan Hu  println(s"[SchedulerMemImp] hyuIQs.size:     ${hyuIQs.size    }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}")
527730cfbc0SXuan Hu  require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty)
528730cfbc0SXuan Hu
529853cd2d8SHaojin Tang  io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed?
530853cd2d8SHaojin Tang
531fc45ed13SXuan Hu  private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten
532596af5d2SHaojin Tang  require(loadWakeUp.length == io.fromMem.get.wakeup.length)
533596af5d2SHaojin Tang  loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2)
534596af5d2SHaojin Tang
535730cfbc0SXuan Hu  memAddrIQs.zipWithIndex.foreach { case (iq, i) =>
536730cfbc0SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
537730cfbc0SXuan Hu    iq.io.enq <> dispatch2Iq.io.out(i)
538e600b1ddSxiaofeibao-xjtu    if (!iq.params.needLoadDependency) {
539e600b1ddSxiaofeibao-xjtu      iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency))
540e600b1ddSxiaofeibao-xjtu    }
54160f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
54260f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
54360f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
544c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++
545c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++
546c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)
54760f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
548730cfbc0SXuan Hu  }
549730cfbc0SXuan Hu
550ecfc6f16SXuan Hu  ldAddrIQs.zipWithIndex.foreach {
551ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
552ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head)
553c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
554de784418SXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5557b753bebSXuan Hu    case _ =>
5567b753bebSXuan Hu  }
5577b753bebSXuan Hu
558ecfc6f16SXuan Hu  stAddrIQs.zipWithIndex.foreach {
559ecfc6f16SXuan Hu    case (imp: IssueQueueMemAddrImp, i) =>
560ecfc6f16SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i)
561c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
562c14e89f4SHaojin Tang      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
5637b753bebSXuan Hu    case _ =>
5647b753bebSXuan Hu  }
565730cfbc0SXuan Hu
566559c1710SHaojin Tang  hyuIQs.zip(hyuIQIdxs).foreach {
567559c1710SHaojin Tang    case (imp: IssueQueueMemAddrImp, idx) =>
568670870b3SXuan Hu      imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head
569670870b3SXuan Hu      imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1))
5708f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
5718f1fa9b1Ssfencevma      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
572559c1710SHaojin Tang      // TODO: refactor ditry code
573559c1710SHaojin Tang      imp.io.deqDelay(1).ready := false.B
574559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).valid := false.B
575559c1710SHaojin Tang      io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits)
5768f1fa9b1Ssfencevma    case _ =>
5778f1fa9b1Ssfencevma  }
5788f1fa9b1Ssfencevma
579e62b6911SXuan Hu  private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk)
580e62b6911SXuan Hu  private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk)
581e62b6911SXuan Hu
582e62b6911SXuan Hu  println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq")
583e62b6911SXuan Hu  println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq")
584e62b6911SXuan Hu
585e62b6911SXuan Hu  private val staEnqs = stAddrIQs.map(_.io.enq).flatten
586e62b6911SXuan Hu  private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size)
587e62b6911SXuan Hu  private val hyaEnqs = hyuIQs.map(_.io.enq).flatten
588e62b6911SXuan Hu  private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size)
589e62b6911SXuan Hu
590e62b6911SXuan Hu  require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " +
591e62b6911SXuan Hu  s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})")
592e62b6911SXuan Hu
593e62b6911SXuan Hu  require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " +
594e62b6911SXuan Hu  s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})")
5959b258a00Sxgkiri
5960438e8f4SHaojin Tang  val d2IqStaOut = dispatch2Iq.io.out.zipWithIndex.filter(staIdxSeq contains _._2).unzip._1.flatten
5970438e8f4SHaojin Tang  d2IqStaOut.zip(staEnqs).zip(stdEnqs).foreach{ case((dp, staIQ), stdIQ) =>
598730cfbc0SXuan Hu    val isAllReady = staIQ.ready && stdIQ.ready
599e62b6911SXuan Hu    dp.ready := isAllReady
600e62b6911SXuan Hu    staIQ.valid := dp.valid && isAllReady
6010438e8f4SHaojin Tang    stdIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
6029b258a00Sxgkiri  }
603730cfbc0SXuan Hu
6040438e8f4SHaojin Tang  val d2IqHyaOut = dispatch2Iq.io.out.zipWithIndex.filter(hyaIdxSeq contains _._2).unzip._1.flatten
6050438e8f4SHaojin Tang  d2IqHyaOut.zip(hyaEnqs).zip(hydEnqs).foreach{ case((dp, hyaIQ), hydIQ) =>
606e62b6911SXuan Hu    val isAllReady = hyaIQ.ready && hydIQ.ready
607e62b6911SXuan Hu    dp.ready := isAllReady
608e62b6911SXuan Hu    hyaIQ.valid := dp.valid && isAllReady
60956bceacbSHaojin Tang    hydIQ.valid := dp.valid && isAllReady && FuType.FuTypeOrR(dp.bits.fuType, FuType.stu, FuType.mou)
610e62b6911SXuan Hu  }
611730cfbc0SXuan Hu
612e62b6911SXuan Hu  stDataIQs.zipWithIndex.foreach { case (iq, i) =>
613e62b6911SXuan Hu    iq.io.flush <> io.fromCtrlBlock.flush
61460f0c5aeSxiaofeibao    iq.io.wakeupFromWB.zip(
61560f0c5aeSxiaofeibao      wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
61660f0c5aeSxiaofeibao      wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
617c720aa49Ssinsanction      wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
618c720aa49Ssinsanction      wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
619c720aa49Ssinsanction      wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
62060f0c5aeSxiaofeibao    ).foreach{ case (sink, source) => sink := source}
621e62b6911SXuan Hu  }
622e62b6911SXuan Hu
623e62b6911SXuan Hu  (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) =>
624730cfbc0SXuan Hu    stdIQEnq.bits  := staIQEnq.bits
625730cfbc0SXuan Hu    // Store data reuses store addr src(1) in dispatch2iq
626e62b6911SXuan Hu    // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ]
627730cfbc0SXuan Hu    //                       \
628730cfbc0SXuan Hu    //                        ---src*(1)--> [stdIQ]
629730cfbc0SXuan Hu    // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1)
630730cfbc0SXuan Hu    // instead of dispatch2Iq.io.out(x).bits.src*(1)
63197b279b9SXuan Hu    val stdIdx = 1
6322d270511Ssinsanction    stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx)
633955b4beaSsinsanction    stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx)
6342d270511Ssinsanction    stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx)
6352d270511Ssinsanction    stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx)
636730cfbc0SXuan Hu    stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx
637955b4beaSsinsanction    stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx)
638955b4beaSsinsanction    stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx)
639730cfbc0SXuan Hu  }
640730cfbc0SXuan Hu
6412d270511Ssinsanction  vecMemIQs.foreach {
6422d270511Ssinsanction    case imp: IssueQueueVecMemImp =>
6432d270511Ssinsanction      imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr)
6442d270511Ssinsanction      imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr)
6451f3d1b4dSXuan Hu      // not used
646b7c799beSzhanglyGit      //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay
6471f3d1b4dSXuan Hu      // maybe not used
6481f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr
6491f3d1b4dSXuan Hu      imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq
65060f0c5aeSxiaofeibao      imp.io.wakeupFromWB.zip(
65160f0c5aeSxiaofeibao        wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
65260f0c5aeSxiaofeibao        wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
653c720aa49Ssinsanction        wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
654c720aa49Ssinsanction        wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++
655c720aa49Ssinsanction        wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq
65660f0c5aeSxiaofeibao      ).foreach{ case (sink, source) => sink := source}
657f39a61a1SzhanglyGit
6582d270511Ssinsanction    case _ =>
6592d270511Ssinsanction  }
660b7c799beSzhanglyGit  val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map {
661b7c799beSzhanglyGit    case imp: IssueQueueVecMemImp =>
662b7c799beSzhanglyGit      imp.io.memIO.get.feedbackIO
663b7c799beSzhanglyGit  }.flatten
664b7c799beSzhanglyGit  assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!")
665b7c799beSzhanglyGit  vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{
666b7c799beSzhanglyGit    case (sink, source) =>
667b7c799beSzhanglyGit      sink := source
668b7c799beSzhanglyGit  }
6692d270511Ssinsanction
670730cfbc0SXuan Hu  val lsqEnqCtrl = Module(new LsqEnqCtrl)
671730cfbc0SXuan Hu
672730cfbc0SXuan Hu  lsqEnqCtrl.io.redirect <> io.fromCtrlBlock.flush
673730cfbc0SXuan Hu  lsqEnqCtrl.io.enq <> dispatch2Iq.io.enqLsqIO.get
674730cfbc0SXuan Hu  lsqEnqCtrl.io.lcommit := io.fromMem.get.lcommit
675730cfbc0SXuan Hu  lsqEnqCtrl.io.scommit := io.fromMem.get.scommit
676730cfbc0SXuan Hu  lsqEnqCtrl.io.lqCancelCnt := io.fromMem.get.lqCancelCnt
677730cfbc0SXuan Hu  lsqEnqCtrl.io.sqCancelCnt := io.fromMem.get.sqCancelCnt
678f3a9fb05SAnzo  dispatch2Iq.io.lqFreeCount.get := lsqEnqCtrl.io.lqFreeCount
679f3a9fb05SAnzo  dispatch2Iq.io.sqFreeCount.get := lsqEnqCtrl.io.sqFreeCount
680730cfbc0SXuan Hu  io.memIO.get.lsqEnqIO <> lsqEnqCtrl.io.enqLsq
6817e471bf8SXuan Hu
6827e471bf8SXuan Hu  dontTouch(io.vecLoadIssueResp)
683e1a85e9fSchengguanghui
684e1a85e9fSchengguanghui  val intBusyTablePerf = intBusyTable.get
685e1a85e9fSchengguanghui  val fpBusyTablePerf  = fpBusyTable.get
686e1a85e9fSchengguanghui  val vecBusyTablePerf = vfBusyTable.get
687e1a85e9fSchengguanghui  val v0BusyTablePerf  = v0BusyTable.get
688e1a85e9fSchengguanghui  val vlBusyTablePerf  = vlBusyTable.get
689e1a85e9fSchengguanghui
690e1a85e9fSchengguanghui  val perfEvents = basePerfEvents ++ Seq(intBusyTablePerf, fpBusyTablePerf, vecBusyTablePerf, v0BusyTablePerf, vlBusyTablePerf).flatten(_.getPerfEvents)
691e1a85e9fSchengguanghui  generatePerfEvent()
692730cfbc0SXuan Hu}
693