1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4730cfbc0SXuan Huimport chisel3._ 5730cfbc0SXuan Huimport chisel3.util._ 6730cfbc0SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 744f2941bSJiru Sunimport utility.HasPerfEvents 844f2941bSJiru Sunimport utils.OptionWrapper 9730cfbc0SXuan Huimport xiangshan._ 1010fe9778SXuan Huimport xiangshan.backend.Bundles._ 11c720aa49Ssinsanctionimport xiangshan.backend.datapath.DataConfig._ 12c720aa49Ssinsanctionimport xiangshan.backend.datapath.WbConfig._ 13e62b6911SXuan Huimport xiangshan.backend.fu.FuType 14730cfbc0SXuan Huimport xiangshan.backend.regfile.RfWritePortWithConfig 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 issueQueue = params.issueBlockParams.map(x => LazyModule(new IssueQueue(x).suggestName(x.getIQName))) 38730cfbc0SXuan Hu 3983ba63b3SXuan Hu lazy val module: SchedulerImpBase = params.schdType match { 40730cfbc0SXuan Hu case IntScheduler() => new SchedulerArithImp(this)(params, p) 4160f0c5aeSxiaofeibao case FpScheduler() => new SchedulerArithImp(this)(params, p) 42730cfbc0SXuan Hu case MemScheduler() => new SchedulerMemImp(this)(params, p) 43730cfbc0SXuan Hu case VfScheduler() => new SchedulerArithImp(this)(params, p) 44730cfbc0SXuan Hu case _ => null 45730cfbc0SXuan Hu } 46730cfbc0SXuan Hu} 47730cfbc0SXuan Hu 487f8233d5SHaojin Tangclass SchedulerIO()(implicit params: SchdBlockParams, p: Parameters) extends XSBundle { 4968d13085SXuan Hu // params alias 507f8233d5SHaojin Tang private val LoadQueueSize = VirtualLoadQueueSize 510a7d1d5cSxiaofeibao val fromDispatchUopNum = params.issueBlockParams.filter(x => x.StdCnt == 0).map(_.numEnq).sum 520a7d1d5cSxiaofeibao val allIssueParams = params.issueBlockParams.filter(_.StdCnt == 0) 530a7d1d5cSxiaofeibao val IssueQueueDeqSum = allIssueParams.map(_.numDeq).sum 540a7d1d5cSxiaofeibao val maxIQSize = allIssueParams.map(_.numEntries).max 55730cfbc0SXuan Hu val fromTop = new Bundle { 56730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 57730cfbc0SXuan Hu } 582e0a7dc5Sfdy val fromWbFuBusyTable = new Bundle{ 592e0a7dc5Sfdy val fuBusyTableRead = MixedVec(params.issueBlockParams.map(x => Input(x.genWbFuBusyTableReadBundle))) 602e0a7dc5Sfdy } 61dd970561SzhanglyGit val wbFuBusyTable = MixedVec(params.issueBlockParams.map(x => Output(x.genWbFuBusyTableWriteBundle))) 620a7d1d5cSxiaofeibao val IQValidNumVec = Output(Vec(IssueQueueDeqSum, UInt((maxIQSize).U.getWidth.W))) 63dd970561SzhanglyGit 64730cfbc0SXuan Hu val fromCtrlBlock = new Bundle { 65730cfbc0SXuan Hu val flush = Flipped(ValidIO(new Redirect)) 66730cfbc0SXuan Hu } 67730cfbc0SXuan Hu val fromDispatch = new Bundle { 680a7d1d5cSxiaofeibao val uops = Vec(fromDispatchUopNum, 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))) 809df83ee5Sxiaofeibao val intWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(IntData()), 819df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.intPregParams.dataCfg, backendParams.intPregParams.addrWidth))) 829df83ee5Sxiaofeibao val fpWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(FpData()), 839df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.fpPregParams.dataCfg, backendParams.fpPregParams.addrWidth))) 849df83ee5Sxiaofeibao val vfWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VecData()), 859df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.vfPregParams.dataCfg, backendParams.vfPregParams.addrWidth))) 869df83ee5Sxiaofeibao val v0WriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(V0Data()), 879df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.v0PregParams.dataCfg, backendParams.v0PregParams.addrWidth))) 889df83ee5Sxiaofeibao val vlWriteBackDelayed = MixedVec(Vec(backendParams.numPregWb(VlData()), 899df83ee5Sxiaofeibao new RfWritePortWithConfig(backendParams.vlPregParams.dataCfg, backendParams.vlPregParams.addrWidth))) 9059ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 91730cfbc0SXuan Hu 92c720aa49Ssinsanction val vlWriteBackInfo = new Bundle { 93d88d4328SZiyue Zhang val vlFromIntIsZero = Input(Bool()) 94d88d4328SZiyue Zhang val vlFromIntIsVlmax = Input(Bool()) 95d88d4328SZiyue Zhang val vlFromVfIsZero = Input(Bool()) 96d88d4328SZiyue Zhang val vlFromVfIsVlmax = Input(Bool()) 97b6279fc6SZiyue Zhang } 98b6279fc6SZiyue Zhang 99bf35baadSXuan Hu val fromSchedulers = new Bundle { 100c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 1019df83ee5Sxiaofeibao val wakeupVecDelayed: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 102bf35baadSXuan Hu } 103bf35baadSXuan Hu 104bf35baadSXuan Hu val toSchedulers = new Bundle { 105c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 106bf35baadSXuan Hu } 107bf35baadSXuan Hu 108c0be7f33SXuan Hu val fromDataPath = new Bundle { 10910fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 110be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 111ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 112be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 113f8b278aaSsinsanction // replace RCIdx to Wakeup Queue 114f8b278aaSsinsanction val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W)))) 115c0be7f33SXuan Hu // just be compatible to old code 116c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 117c0be7f33SXuan Hu } 118c0be7f33SXuan Hu 1198a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1203bba894fSxiaofeibao val vecLoadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1218a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1227e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1230f55a0d3SHaojin Tang 1246810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 125c0be7f33SXuan Hu 126730cfbc0SXuan Hu val fromMem = if (params.isMemSchd) Some(new Bundle { 1277b753bebSXuan Hu val ldaFeedback = Flipped(Vec(params.LduCnt, new MemRSFeedbackIO)) 1287b753bebSXuan Hu val staFeedback = Flipped(Vec(params.StaCnt, new MemRSFeedbackIO)) 1298f1fa9b1Ssfencevma val hyuFeedback = Flipped(Vec(params.HyuCnt, new MemRSFeedbackIO)) 130fd490615Sweiding liu val vstuFeedback = Flipped(Vec(params.VstuCnt, new MemRSFeedbackIO(isVector = true))) 131fd490615Sweiding liu val vlduFeedback = Flipped(Vec(params.VlduCnt, new MemRSFeedbackIO(isVector = true))) 132730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 133730cfbc0SXuan Hu val lcommit = Input(UInt(log2Up(CommitWidth + 1).W)) 134730cfbc0SXuan Hu val scommit = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) // connected to `memBlock.io.sqDeq` instead of ROB 135fc45ed13SXuan Hu val wakeup = Vec(params.LdExuCnt, Flipped(Valid(new DynInst))) 1362d270511Ssinsanction val lqDeqPtr = Input(new LqPtr) 1372d270511Ssinsanction val sqDeqPtr = Input(new SqPtr) 138730cfbc0SXuan Hu // from lsq 139730cfbc0SXuan Hu val lqCancelCnt = Input(UInt(log2Up(LoadQueueSize + 1).W)) 140730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 141730cfbc0SXuan Hu val memWaitUpdateReq = Flipped(new MemWaitUpdateReq) 142730cfbc0SXuan Hu }) else None 143730cfbc0SXuan Hu val toMem = if (params.isMemSchd) Some(new Bundle { 144730cfbc0SXuan Hu val loadFastMatch = Output(Vec(params.LduCnt, new IssueQueueLoadBundle)) 145730cfbc0SXuan Hu }) else None 14642b6cdf9Ssinsanction val fromOg2Resp = if(params.needOg2Resp) Some(MixedVec(params.issueBlockParams.filter(_.needOg2Resp).map(x => Flipped(x.genOG2RespBundle)))) else None 147730cfbc0SXuan Hu} 148730cfbc0SXuan Hu 149730cfbc0SXuan Huabstract class SchedulerImpBase(wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 150730cfbc0SXuan Hu extends LazyModuleImp(wrapper) 151730cfbc0SXuan Hu with HasXSParameter 152730cfbc0SXuan Hu{ 153730cfbc0SXuan Hu val io = IO(new SchedulerIO()) 154730cfbc0SXuan Hu 155730cfbc0SXuan Hu // alias 156c0be7f33SXuan Hu private val iqWakeUpInMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 157c0be7f33SXuan Hu io.fromSchedulers.wakeupVec.map(x => (x.bits.exuIdx, x)).toMap 1589df83ee5Sxiaofeibao private val iqWakeUpInMapDelayed: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 1599df83ee5Sxiaofeibao io.fromSchedulers.wakeupVecDelayed.map(x => (x.bits.exuIdx, x)).toMap 160730cfbc0SXuan Hu private val schdType = params.schdType 161730cfbc0SXuan Hu 162730cfbc0SXuan Hu // Modules 163730cfbc0SXuan Hu val issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 164730cfbc0SXuan Hu 1650a7d1d5cSxiaofeibao io.IQValidNumVec := issueQueues.filter(_.params.StdCnt == 0).map(_.io.validCntDeqVec).flatten 166f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 16760f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 168f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 169c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 170c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 1719df83ee5Sxiaofeibao val wakeupFromIntWBVecDelayed = Wire(params.genIntWBWakeUpSinkValidBundle) 1729df83ee5Sxiaofeibao val wakeupFromFpWBVecDelayed = Wire(params.genFpWBWakeUpSinkValidBundle) 1739df83ee5Sxiaofeibao val wakeupFromVfWBVecDelayed = Wire(params.genVfWBWakeUpSinkValidBundle) 1749df83ee5Sxiaofeibao val wakeupFromV0WBVecDelayed = Wire(params.genV0WBWakeUpSinkValidBundle) 1759df83ee5Sxiaofeibao val wakeupFromVlWBVecDelayed = Wire(params.genVlWBWakeUpSinkValidBundle) 176f39a61a1SzhanglyGit 1779df83ee5Sxiaofeibao val wakeupFromWBVec = Seq(wakeupFromIntWBVec, wakeupFromFpWBVec, wakeupFromVfWBVec, wakeupFromV0WBVec, wakeupFromVlWBVec) 1789df83ee5Sxiaofeibao val allWriteBack = Seq(io.intWriteBack, io.fpWriteBack, io.vfWriteBack, io.v0WriteBack, io.vlWriteBack) 1799df83ee5Sxiaofeibao wakeupFromWBVec.zip(allWriteBack).map{ case (sinks, sources) => 1809df83ee5Sxiaofeibao sinks.zip(sources).map{ case (sink, source) => 181f39a61a1SzhanglyGit sink.valid := source.wen 182f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 183f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 184f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 185c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 186c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 187f39a61a1SzhanglyGit sink.bits.pdest := source.addr 188730cfbc0SXuan Hu } 1899df83ee5Sxiaofeibao } 190f39a61a1SzhanglyGit 1919df83ee5Sxiaofeibao val wakeupFromWBVecDelayed = Seq(wakeupFromIntWBVecDelayed, wakeupFromFpWBVecDelayed, wakeupFromVfWBVecDelayed, wakeupFromV0WBVecDelayed, wakeupFromVlWBVecDelayed) 1929df83ee5Sxiaofeibao val allWriteBackDelayed = Seq(io.intWriteBackDelayed, io.fpWriteBackDelayed, io.vfWriteBackDelayed, io.v0WriteBackDelayed, io.vlWriteBackDelayed) 1939df83ee5Sxiaofeibao wakeupFromWBVecDelayed.zip(allWriteBackDelayed).map { case (sinks, sources) => 1949df83ee5Sxiaofeibao sinks.zip(sources).map { case (sink, source) => 19560f0c5aeSxiaofeibao sink.valid := source.wen 19660f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 19760f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 19860f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 199c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 200c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 20160f0c5aeSxiaofeibao sink.bits.pdest := source.addr 20260f0c5aeSxiaofeibao } 203c720aa49Ssinsanction } 204bf35baadSXuan Hu // Connect bundles having the same wakeup source 20559ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 206bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 2070c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 2080c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 2090c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 2100c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 2110c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 2120c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 2130c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 2140c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2154c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2164c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2174c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 218c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 219c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2204c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2210c7ebb58Sxiaofeibao-xjtu } 22260912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 22360f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 22460912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 225c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 226c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 227bf35baadSXuan Hu } 2289df83ee5Sxiaofeibao iq.io.wakeupFromIQDelayed.foreach { wakeUp => 2299df83ee5Sxiaofeibao val wakeUpIn = iqWakeUpInMapDelayed(wakeUp.bits.exuIdx) 2309df83ee5Sxiaofeibao connectSamePort(wakeUp, wakeUpIn) 2319df83ee5Sxiaofeibao if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 2329df83ee5Sxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 2339df83ee5Sxiaofeibao if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 2349df83ee5Sxiaofeibao if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 2359df83ee5Sxiaofeibao if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 2369df83ee5Sxiaofeibao } 237ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 238ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 239e600b1ddSxiaofeibao-xjtu if (iq.params.needLoadDependency) 2400f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 241e600b1ddSxiaofeibao-xjtu else 242e600b1ddSxiaofeibao-xjtu iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel) 243bf35baadSXuan Hu } 244bf35baadSXuan Hu 245b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 246b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 247d88d4328SZiyue Zhang iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax 248d88d4328SZiyue Zhang iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero 249d88d4328SZiyue Zhang iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax 250d88d4328SZiyue Zhang iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero 251b6279fc6SZiyue Zhang } 252b6279fc6SZiyue Zhang 253c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 254bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 255c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 256bf35baadSXuan Hu .toMap 257bf35baadSXuan Hu 258bf35baadSXuan Hu // Connect bundles having the same wakeup source 259bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 260c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 261bf35baadSXuan Hu } 262bf35baadSXuan Hu 26359ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 26459ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 26559ef6009Sxiaofeibao-xjtu } 266bf35baadSXuan Hu 267f99b81adSHaojin Tang // Response 268f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 269f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 270f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 271f99b81adSHaojin Tang } 272f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 273f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 274f99b81adSHaojin Tang } 275f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 2763bba894fSxiaofeibao if (io.loadFinalIssueResp(i).isDefinedAt(j) && iq.params.isLdAddrIQ) { 277f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 2783bba894fSxiaofeibao } else if (io.vecLoadFinalIssueResp(i).isDefinedAt(j) && iq.params.isVecLduIQ) { 2793bba894fSxiaofeibao finalIssueResp := io.vecLoadFinalIssueResp(i)(j) 2803bba894fSxiaofeibao } 2813bba894fSxiaofeibao else { 282670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 283670870b3SXuan Hu } 284f99b81adSHaojin Tang }) 285e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 286aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 287e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 288aa2bcc31SzhanglyGit } else { 289aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 290aa2bcc31SzhanglyGit } 291e8800897SXuan Hu }) 2927e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 2937e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 2947e471bf8SXuan Hu }) 295f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 296f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 297f8b278aaSsinsanction iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x)) 298f8b278aaSsinsanction } 29942b6cdf9Ssinsanction if (params.needOg2Resp) { 30042b6cdf9Ssinsanction issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) => 30142b6cdf9Ssinsanction iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) => 30242b6cdf9Ssinsanction iqOg2Resp := og2Resp 30342b6cdf9Ssinsanction } 30442b6cdf9Ssinsanction } 30542b6cdf9Ssinsanction } 306f8b278aaSsinsanction 307f8b278aaSsinsanction // Connect each replace RCIdx to IQ 308f8b278aaSsinsanction if (params.needWriteRegCache) { 309f8b278aaSsinsanction val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq => 310f8b278aaSsinsanction iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2) 311f8b278aaSsinsanction } 312f8b278aaSsinsanction iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) => 313f8b278aaSsinsanction iq := in 314f8b278aaSsinsanction } 315f8b278aaSsinsanction 316f8b278aaSsinsanction println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}") 317f8b278aaSsinsanction println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}") 318f99b81adSHaojin Tang } 319f99b81adSHaojin Tang 320e1a85e9fSchengguanghui // perfEvent 321e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 322e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 323e1a85e9fSchengguanghui 324e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 325e1a85e9fSchengguanghui val basePerfEvents = Seq( 326e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 327e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 328e1a85e9fSchengguanghui 329c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 330bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 331bf35baadSXuan Hu 332bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 333c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 334730cfbc0SXuan Hu} 335730cfbc0SXuan Hu 336730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 337730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 338730cfbc0SXuan Hu with HasXSParameter 339e1a85e9fSchengguanghui with HasPerfEvents 340730cfbc0SXuan Hu{ 3410a7d1d5cSxiaofeibao val issueQueuesUopIn = issueQueues.map(_.io.enq).flatten 3420a7d1d5cSxiaofeibao issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2) 343730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 344730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 345e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 346e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 347e600b1ddSxiaofeibao-xjtu } 348f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 349f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 35060f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 351c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 352c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 353c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 354596af5d2SHaojin Tang case _ => null 355f39a61a1SzhanglyGit } 3569df83ee5Sxiaofeibao val intWBIQDelayed = params.schdType match { 3579df83ee5Sxiaofeibao case IntScheduler() => wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 3589df83ee5Sxiaofeibao case FpScheduler() => wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 3599df83ee5Sxiaofeibao case VfScheduler() => (wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 3609df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 3619df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 3629df83ee5Sxiaofeibao case _ => null 3639df83ee5Sxiaofeibao } 364f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 3659df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip(intWBIQDelayed).foreach{ case (sink, source) => sink := source} 366730cfbc0SXuan Hu } 367e1a85e9fSchengguanghui 368e1a85e9fSchengguanghui val perfEvents = basePerfEvents 369e1a85e9fSchengguanghui generatePerfEvent() 370730cfbc0SXuan Hu} 371730cfbc0SXuan Hu 372f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 373730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 374730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 375730cfbc0SXuan Hu with HasXSParameter 376e1a85e9fSchengguanghui with HasPerfEvents 377730cfbc0SXuan Hu{ 378730cfbc0SXuan Hu 3790a7d1d5cSxiaofeibao val issueQueuesUopIn = issueQueues.filter(_.params.StdCnt == 0).map(_.io.enq).flatten 3800a7d1d5cSxiaofeibao issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2) 3810a7d1d5cSxiaofeibao val noStdExuParams = params.issueBlockParams.map(x => Seq.fill(x.numEnq)(x.exuBlockParams)).flatten.filter{x => x.map(!_.hasStdFu).reduce(_ && _)} 3820a7d1d5cSxiaofeibao val staIdx = noStdExuParams.zipWithIndex.filter{x => x._1.map(_.hasStoreAddrFu).reduce(_ || _)}.map(_._2) 3830a7d1d5cSxiaofeibao val staReady = issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq.map(_.ready)).flatten 3840a7d1d5cSxiaofeibao val stdReady = issueQueues.filter(iq => iq.params.StdCnt > 0).map(_.io.enq.map(_.ready)).flatten 3850a7d1d5cSxiaofeibao staIdx.zipWithIndex.map{ case (sta, i) => { 3860a7d1d5cSxiaofeibao io.fromDispatch.uops(sta).ready := staReady(i) && stdReady(i) 3870a7d1d5cSxiaofeibao }} 388*9ab8b572Sxiaofeibao issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq).flatten.zipWithIndex.map{ case (iq, idx) => 389*9ab8b572Sxiaofeibao iq.valid := io.fromDispatch.uops(staIdx(idx)).valid && !io.fromDispatch.uops(staIdx(idx)).bits.isDropAmocasSta 39041eedc8dSlinzhida } 39141eedc8dSlinzhida val staValidFromDispatch = staIdx.map(idx => io.fromDispatch.uops(idx).valid) 392559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 393e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 394e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 395e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 396559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 397559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 398499caf4cSXuan Hu 399499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 400499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 401499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 402499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 403499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 404730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 405730cfbc0SXuan Hu 406853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 407853cd2d8SHaojin Tang 408fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 409596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 410596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 411596af5d2SHaojin Tang 412730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 413730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 414e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 415e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 416e600b1ddSxiaofeibao-xjtu } 41760f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 41860f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 41960f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 420c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 421c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 422c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 42360f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 4249df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip( 4259df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 4269df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 4279df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 4289df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 4299df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 4309df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 431730cfbc0SXuan Hu } 432730cfbc0SXuan Hu 433ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 434ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 435ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 436c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 437de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4387b753bebSXuan Hu case _ => 4397b753bebSXuan Hu } 4407b753bebSXuan Hu 441ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 442ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 443ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 444c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 445c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4467b753bebSXuan Hu case _ => 4477b753bebSXuan Hu } 448730cfbc0SXuan Hu 449559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 450559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 451670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 452670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 4538f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 4548f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 455559c1710SHaojin Tang // TODO: refactor ditry code 456559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 457559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 458559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 4598f1fa9b1Ssfencevma case _ => 4608f1fa9b1Ssfencevma } 4618f1fa9b1Ssfencevma 462e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 463e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 464e62b6911SXuan Hu 465e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 466e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 467e62b6911SXuan Hu 468e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 469e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 470e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 471e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 472e62b6911SXuan Hu 473e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 474e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 475e62b6911SXuan Hu 476e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 477e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 4789b258a00Sxgkiri 479e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 480e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 48160f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 48260f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 48360f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 484c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 485c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 486c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 48760f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 4889df83ee5Sxiaofeibao iq.io.wakeupFromWBDelayed.zip( 4899df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 4909df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 4919df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 4929df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 4939df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 4949df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 4950a7d1d5cSxiaofeibao // here disable fp load fast wakeup to std, and no FEX wakeup to std 4960a7d1d5cSxiaofeibao iq.io.wakeupFromIQ.map(_.bits.fpWen := false.B) 497e62b6911SXuan Hu } 498e62b6911SXuan Hu 499e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 50041eedc8dSlinzhida stdIQEnq.valid := staValidFromDispatch(i) 501730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 502730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 503e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 504730cfbc0SXuan Hu // \ 505730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 506730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 507730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 50897b279b9SXuan Hu val stdIdx = 1 5092d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 510955b4beaSsinsanction stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx) 5112d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 5122d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 513730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 514955b4beaSsinsanction stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx) 515955b4beaSsinsanction stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx) 516730cfbc0SXuan Hu } 517730cfbc0SXuan Hu 5182d270511Ssinsanction vecMemIQs.foreach { 5192d270511Ssinsanction case imp: IssueQueueVecMemImp => 5202d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 5212d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 5221f3d1b4dSXuan Hu // not used 523b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 5241f3d1b4dSXuan Hu // maybe not used 5251f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 5261f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 52760f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 52860f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 52960f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 530c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 531c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 532c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 53360f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 5349df83ee5Sxiaofeibao imp.io.wakeupFromWBDelayed.zip( 5359df83ee5Sxiaofeibao wakeupFromIntWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 5369df83ee5Sxiaofeibao wakeupFromFpWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 5379df83ee5Sxiaofeibao wakeupFromVfWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 5389df83ee5Sxiaofeibao wakeupFromV0WBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 5399df83ee5Sxiaofeibao wakeupFromVlWBVecDelayed.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 5409df83ee5Sxiaofeibao ).foreach { case (sink, source) => sink := source } 541f39a61a1SzhanglyGit 5422d270511Ssinsanction case _ => 5432d270511Ssinsanction } 544b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 545b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 546b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 547b7c799beSzhanglyGit }.flatten 548b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 549b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 550b7c799beSzhanglyGit case (sink, source) => 551b7c799beSzhanglyGit sink := source 552b7c799beSzhanglyGit } 5532d270511Ssinsanction 5540a7d1d5cSxiaofeibao val perfEvents = basePerfEvents 555e1a85e9fSchengguanghui generatePerfEvent() 556730cfbc0SXuan Hu} 557