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 51*0a7d1d5cSxiaofeibao val fromDispatchUopNum = params.issueBlockParams.filter(x => x.StdCnt == 0).map(_.numEnq).sum 52*0a7d1d5cSxiaofeibao val allIssueParams = params.issueBlockParams.filter(_.StdCnt == 0) 53*0a7d1d5cSxiaofeibao val IssueQueueDeqSum = allIssueParams.map(_.numDeq).sum 54*0a7d1d5cSxiaofeibao 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))) 62*0a7d1d5cSxiaofeibao 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 { 68*0a7d1d5cSxiaofeibao 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))) 8059ef6009Sxiaofeibao-xjtu val toDataPathAfterDelay: MixedVec[MixedVec[DecoupledIO[IssueQueueIssueBundle]]] = MixedVec(params.issueBlockParams.map(_.genIssueDecoupledBundle)) 81730cfbc0SXuan Hu 82c720aa49Ssinsanction val vlWriteBackInfo = new Bundle { 83d88d4328SZiyue Zhang val vlFromIntIsZero = Input(Bool()) 84d88d4328SZiyue Zhang val vlFromIntIsVlmax = Input(Bool()) 85d88d4328SZiyue Zhang val vlFromVfIsZero = Input(Bool()) 86d88d4328SZiyue Zhang val vlFromVfIsVlmax = Input(Bool()) 87b6279fc6SZiyue Zhang } 88b6279fc6SZiyue Zhang 89bf35baadSXuan Hu val fromSchedulers = new Bundle { 90c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = Flipped(params.genIQWakeUpInValidBundle) 91bf35baadSXuan Hu } 92bf35baadSXuan Hu 93bf35baadSXuan Hu val toSchedulers = new Bundle { 94c0be7f33SXuan Hu val wakeupVec: MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = params.genIQWakeUpOutValidBundle 95bf35baadSXuan Hu } 96bf35baadSXuan Hu 97c0be7f33SXuan Hu val fromDataPath = new Bundle { 9810fe9778SXuan Hu val resp: MixedVec[MixedVec[OGRespBundle]] = MixedVec(params.issueBlockParams.map(x => Flipped(x.genOGRespBundle))) 99be9ff987Ssinsanction val og0Cancel = Input(ExuVec()) 100ea46c302SXuan Hu // Todo: remove this after no cancel signal from og1 101be9ff987Ssinsanction val og1Cancel = Input(ExuVec()) 102f8b278aaSsinsanction // replace RCIdx to Wakeup Queue 103f8b278aaSsinsanction val replaceRCIdx = OptionWrapper(params.needWriteRegCache, Vec(params.numWriteRegCache, Input(UInt(RegCacheIdxWidth.W)))) 104c0be7f33SXuan Hu // just be compatible to old code 105c0be7f33SXuan Hu def apply(i: Int)(j: Int) = resp(i)(j) 106c0be7f33SXuan Hu } 107c0be7f33SXuan Hu 1088a66c02cSXuan Hu val loadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1093bba894fSxiaofeibao val vecLoadFinalIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1108a66c02cSXuan Hu val memAddrIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.LdExuCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1117e471bf8SXuan Hu val vecLoadIssueResp = MixedVec(params.issueBlockParams.map(x => MixedVec(Vec(x.VlduCnt, Flipped(ValidIO(new IssueQueueDeqRespBundle()(p, x))))))) 1120f55a0d3SHaojin Tang 1136810d1e8Ssfencevma val ldCancel = Vec(backendParams.LduCnt + backendParams.HyuCnt, Flipped(new LoadCancelIO)) 114c0be7f33SXuan Hu 115730cfbc0SXuan Hu val 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 13542b6cdf9Ssinsanction 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 issueQueues: Seq[IssueQueueImp] = wrapper.issueQueue.map(_.module) 151730cfbc0SXuan Hu 152*0a7d1d5cSxiaofeibao io.IQValidNumVec := issueQueues.filter(_.params.StdCnt == 0).map(_.io.validCntDeqVec).flatten 153f39a61a1SzhanglyGit val wakeupFromIntWBVec = Wire(params.genIntWBWakeUpSinkValidBundle) 15460f0c5aeSxiaofeibao val wakeupFromFpWBVec = Wire(params.genFpWBWakeUpSinkValidBundle) 155f39a61a1SzhanglyGit val wakeupFromVfWBVec = Wire(params.genVfWBWakeUpSinkValidBundle) 156c720aa49Ssinsanction val wakeupFromV0WBVec = Wire(params.genV0WBWakeUpSinkValidBundle) 157c720aa49Ssinsanction val wakeupFromVlWBVec = Wire(params.genVlWBWakeUpSinkValidBundle) 158f39a61a1SzhanglyGit 159f39a61a1SzhanglyGit wakeupFromIntWBVec.zip(io.intWriteBack).foreach { case (sink, source) => 160f39a61a1SzhanglyGit sink.valid := source.wen 161f39a61a1SzhanglyGit sink.bits.rfWen := source.intWen 162f39a61a1SzhanglyGit sink.bits.fpWen := source.fpWen 163f39a61a1SzhanglyGit sink.bits.vecWen := source.vecWen 164c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 165c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 166f39a61a1SzhanglyGit sink.bits.pdest := source.addr 167730cfbc0SXuan Hu } 168f39a61a1SzhanglyGit 16960f0c5aeSxiaofeibao wakeupFromFpWBVec.zip(io.fpWriteBack).foreach { case (sink, source) => 17060f0c5aeSxiaofeibao sink.valid := source.wen 17160f0c5aeSxiaofeibao sink.bits.rfWen := source.intWen 17260f0c5aeSxiaofeibao sink.bits.fpWen := source.fpWen 17360f0c5aeSxiaofeibao sink.bits.vecWen := source.vecWen 174c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 175c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 17660f0c5aeSxiaofeibao sink.bits.pdest := source.addr 17760f0c5aeSxiaofeibao } 17860f0c5aeSxiaofeibao 179f39a61a1SzhanglyGit wakeupFromVfWBVec.zip(io.vfWriteBack).foreach { case (sink, source) => 180730cfbc0SXuan Hu sink.valid := source.wen 181730cfbc0SXuan Hu sink.bits.rfWen := source.intWen 182730cfbc0SXuan Hu sink.bits.fpWen := source.fpWen 183730cfbc0SXuan Hu sink.bits.vecWen := source.vecWen 184c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 185c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 186c720aa49Ssinsanction sink.bits.pdest := source.addr 187c720aa49Ssinsanction } 188c720aa49Ssinsanction 189c720aa49Ssinsanction wakeupFromV0WBVec.zip(io.v0WriteBack).foreach { case (sink, source) => 190c720aa49Ssinsanction sink.valid := source.wen 191c720aa49Ssinsanction sink.bits.rfWen := source.intWen 192c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 193c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 194c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 195c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 196c720aa49Ssinsanction sink.bits.pdest := source.addr 197c720aa49Ssinsanction } 198c720aa49Ssinsanction 199c720aa49Ssinsanction wakeupFromVlWBVec.zip(io.vlWriteBack).foreach { case (sink, source) => 200c720aa49Ssinsanction sink.valid := source.wen 201c720aa49Ssinsanction sink.bits.rfWen := source.intWen 202c720aa49Ssinsanction sink.bits.fpWen := source.fpWen 203c720aa49Ssinsanction sink.bits.vecWen := source.vecWen 204c720aa49Ssinsanction sink.bits.v0Wen := source.v0Wen 205c720aa49Ssinsanction sink.bits.vlWen := source.vlWen 206730cfbc0SXuan Hu sink.bits.pdest := source.addr 207730cfbc0SXuan Hu } 208730cfbc0SXuan Hu 209bf35baadSXuan Hu // Connect bundles having the same wakeup source 21059ef6009Sxiaofeibao-xjtu issueQueues.zipWithIndex.foreach { case(iq, i) => 211bf35baadSXuan Hu iq.io.wakeupFromIQ.foreach { wakeUp => 2120c7ebb58Sxiaofeibao-xjtu val wakeUpIn = iqWakeUpInMap(wakeUp.bits.exuIdx) 2130c7ebb58Sxiaofeibao-xjtu val exuIdx = wakeUp.bits.exuIdx 2140c7ebb58Sxiaofeibao-xjtu println(s"[Backend] Connect wakeup exuIdx ${exuIdx}") 2150c7ebb58Sxiaofeibao-xjtu connectSamePort(wakeUp,wakeUpIn) 2160c7ebb58Sxiaofeibao-xjtu backendParams.connectWakeup(exuIdx) 2170c7ebb58Sxiaofeibao-xjtu if (backendParams.isCopyPdest(exuIdx)) { 2180c7ebb58Sxiaofeibao-xjtu println(s"[Backend] exuIdx ${exuIdx} use pdestCopy ${backendParams.getCopyPdestIndex(exuIdx)}") 2190c7ebb58Sxiaofeibao-xjtu wakeUp.bits.pdest := wakeUpIn.bits.pdestCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2204c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.rfWenCopy.nonEmpty) wakeUp.bits.rfWen := wakeUpIn.bits.rfWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2214c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.fpWenCopy.nonEmpty) wakeUp.bits.fpWen := wakeUpIn.bits.fpWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2224c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.vecWenCopy.nonEmpty) wakeUp.bits.vecWen := wakeUpIn.bits.vecWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 223c720aa49Ssinsanction if (wakeUpIn.bits.v0WenCopy.nonEmpty) wakeUp.bits.v0Wen := wakeUpIn.bits.v0WenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 224c720aa49Ssinsanction if (wakeUpIn.bits.vlWenCopy.nonEmpty) wakeUp.bits.vlWen := wakeUpIn.bits.vlWenCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2254c5a0d77Sxiaofeibao-xjtu if (wakeUpIn.bits.loadDependencyCopy.nonEmpty) wakeUp.bits.loadDependency := wakeUpIn.bits.loadDependencyCopy.get(backendParams.getCopyPdestIndex(exuIdx)) 2260c7ebb58Sxiaofeibao-xjtu } 22760912d84Sxiaofeibao-xjtu if (iq.params.numIntSrc == 0) wakeUp.bits.rfWen := false.B 22860f0c5aeSxiaofeibao if (iq.params.numFpSrc == 0) wakeUp.bits.fpWen := false.B 22960912d84Sxiaofeibao-xjtu if (iq.params.numVfSrc == 0) wakeUp.bits.vecWen := false.B 230c720aa49Ssinsanction if (iq.params.numV0Src == 0) wakeUp.bits.v0Wen := false.B 231c720aa49Ssinsanction if (iq.params.numVlSrc == 0) wakeUp.bits.vlWen := false.B 232bf35baadSXuan Hu } 233ea46c302SXuan Hu iq.io.og0Cancel := io.fromDataPath.og0Cancel 234ea46c302SXuan Hu iq.io.og1Cancel := io.fromDataPath.og1Cancel 235e600b1ddSxiaofeibao-xjtu if (iq.params.needLoadDependency) 2360f55a0d3SHaojin Tang iq.io.ldCancel := io.ldCancel 237e600b1ddSxiaofeibao-xjtu else 238e600b1ddSxiaofeibao-xjtu iq.io.ldCancel := 0.U.asTypeOf(io.ldCancel) 239bf35baadSXuan Hu } 240bf35baadSXuan Hu 241b6279fc6SZiyue Zhang // connect the vl writeback informatino to the issue queues 242b6279fc6SZiyue Zhang issueQueues.zipWithIndex.foreach { case(iq, i) => 243d88d4328SZiyue Zhang iq.io.vlFromIntIsVlmax := io.vlWriteBackInfo.vlFromIntIsVlmax 244d88d4328SZiyue Zhang iq.io.vlFromIntIsZero := io.vlWriteBackInfo.vlFromIntIsZero 245d88d4328SZiyue Zhang iq.io.vlFromVfIsVlmax := io.vlWriteBackInfo.vlFromVfIsVlmax 246d88d4328SZiyue Zhang iq.io.vlFromVfIsZero := io.vlWriteBackInfo.vlFromVfIsZero 247b6279fc6SZiyue Zhang } 248b6279fc6SZiyue Zhang 249c0be7f33SXuan Hu private val iqWakeUpOutMap: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = 250bf35baadSXuan Hu issueQueues.flatMap(_.io.wakeupToIQ) 251c0be7f33SXuan Hu .map(x => (x.bits.exuIdx, x)) 252bf35baadSXuan Hu .toMap 253bf35baadSXuan Hu 254bf35baadSXuan Hu // Connect bundles having the same wakeup source 255bf35baadSXuan Hu io.toSchedulers.wakeupVec.foreach { wakeUp => 256c0be7f33SXuan Hu wakeUp := iqWakeUpOutMap(wakeUp.bits.exuIdx) 257bf35baadSXuan Hu } 258bf35baadSXuan Hu 25959ef6009Sxiaofeibao-xjtu io.toDataPathAfterDelay.zipWithIndex.foreach { case (toDpDy, i) => 26059ef6009Sxiaofeibao-xjtu toDpDy <> issueQueues(i).io.deqDelay 26159ef6009Sxiaofeibao-xjtu } 262bf35baadSXuan Hu 263f99b81adSHaojin Tang // Response 264f99b81adSHaojin Tang issueQueues.zipWithIndex.foreach { case (iq, i) => 265f99b81adSHaojin Tang iq.io.og0Resp.zipWithIndex.foreach { case (og0Resp, j) => 266f99b81adSHaojin Tang og0Resp := io.fromDataPath(i)(j).og0resp 267f99b81adSHaojin Tang } 268f99b81adSHaojin Tang iq.io.og1Resp.zipWithIndex.foreach { case (og1Resp, j) => 269f99b81adSHaojin Tang og1Resp := io.fromDataPath(i)(j).og1resp 270f99b81adSHaojin Tang } 271f99b81adSHaojin Tang iq.io.finalIssueResp.foreach(_.zipWithIndex.foreach { case (finalIssueResp, j) => 2723bba894fSxiaofeibao if (io.loadFinalIssueResp(i).isDefinedAt(j) && iq.params.isLdAddrIQ) { 273f99b81adSHaojin Tang finalIssueResp := io.loadFinalIssueResp(i)(j) 2743bba894fSxiaofeibao } else if (io.vecLoadFinalIssueResp(i).isDefinedAt(j) && iq.params.isVecLduIQ) { 2753bba894fSxiaofeibao finalIssueResp := io.vecLoadFinalIssueResp(i)(j) 2763bba894fSxiaofeibao } 2773bba894fSxiaofeibao else { 278670870b3SXuan Hu finalIssueResp := 0.U.asTypeOf(finalIssueResp) 279670870b3SXuan Hu } 280f99b81adSHaojin Tang }) 281e8800897SXuan Hu iq.io.memAddrIssueResp.foreach(_.zipWithIndex.foreach { case (memAddrIssueResp, j) => 282aa2bcc31SzhanglyGit if (io.memAddrIssueResp(i).isDefinedAt(j)) { 283e8800897SXuan Hu memAddrIssueResp := io.memAddrIssueResp(i)(j) 284aa2bcc31SzhanglyGit } else { 285aa2bcc31SzhanglyGit memAddrIssueResp := 0.U.asTypeOf(memAddrIssueResp) 286aa2bcc31SzhanglyGit } 287e8800897SXuan Hu }) 2887e471bf8SXuan Hu iq.io.vecLoadIssueResp.foreach(_.zipWithIndex.foreach { case (resp, deqIdx) => 2897e471bf8SXuan Hu resp := io.vecLoadIssueResp(i)(deqIdx) 2907e471bf8SXuan Hu }) 291f99b81adSHaojin Tang iq.io.wbBusyTableRead := io.fromWbFuBusyTable.fuBusyTableRead(i) 292f99b81adSHaojin Tang io.wbFuBusyTable(i) := iq.io.wbBusyTableWrite 293f8b278aaSsinsanction iq.io.replaceRCIdx.foreach(x => x := 0.U.asTypeOf(x)) 294f8b278aaSsinsanction } 29542b6cdf9Ssinsanction if (params.needOg2Resp) { 29642b6cdf9Ssinsanction issueQueues.filter(_.params.needOg2Resp).zip(io.fromOg2Resp.get).foreach{ case (iq, og2RespVec) => 29742b6cdf9Ssinsanction iq.io.og2Resp.get.zip(og2RespVec).foreach{ case (iqOg2Resp, og2Resp) => 29842b6cdf9Ssinsanction iqOg2Resp := og2Resp 29942b6cdf9Ssinsanction } 30042b6cdf9Ssinsanction } 30142b6cdf9Ssinsanction } 302f8b278aaSsinsanction 303f8b278aaSsinsanction // Connect each replace RCIdx to IQ 304f8b278aaSsinsanction if (params.needWriteRegCache) { 305f8b278aaSsinsanction val iqReplaceRCIdxVec = issueQueues.filter(_.params.needWriteRegCache).flatMap{ iq => 306f8b278aaSsinsanction iq.params.allExuParams.zip(iq.io.replaceRCIdx.get).filter(_._1.needWriteRegCache).map(_._2) 307f8b278aaSsinsanction } 308f8b278aaSsinsanction iqReplaceRCIdxVec.zip(io.fromDataPath.replaceRCIdx.get).foreach{ case (iq, in) => 309f8b278aaSsinsanction iq := in 310f8b278aaSsinsanction } 311f8b278aaSsinsanction 312f8b278aaSsinsanction println(s"[Scheduler] numWriteRegCache: ${params.numWriteRegCache}") 313f8b278aaSsinsanction println(s"[Scheduler] iqReplaceRCIdxVec: ${iqReplaceRCIdxVec.size}") 314f99b81adSHaojin Tang } 315f99b81adSHaojin Tang 316e1a85e9fSchengguanghui // perfEvent 317e1a85e9fSchengguanghui val lastCycleIqEnqFireVec = RegNext(VecInit(issueQueues.map(_.io.enq.map(_.fire)).flatten)) 318e1a85e9fSchengguanghui val lastCycleIqFullVec = RegNext(VecInit(issueQueues.map(_.io.enq.head.ready))) 319e1a85e9fSchengguanghui 320e1a85e9fSchengguanghui val issueQueueFullVecPerf = issueQueues.zip(lastCycleIqFullVec)map{ case (iq, full) => (iq.params.getIQName + s"_full", full) } 321e1a85e9fSchengguanghui val basePerfEvents = Seq( 322e1a85e9fSchengguanghui ("issueQueue_enq_fire_cnt", PopCount(lastCycleIqEnqFireVec) ) 323e1a85e9fSchengguanghui ) ++ issueQueueFullVecPerf 324e1a85e9fSchengguanghui 325c0be7f33SXuan Hu println(s"[Scheduler] io.fromSchedulers.wakeupVec: ${io.fromSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 326bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpInKeys: ${iqWakeUpInMap.keys}") 327bf35baadSXuan Hu 328bf35baadSXuan Hu println(s"[Scheduler] iqWakeUpOutKeys: ${iqWakeUpOutMap.keys}") 329c0be7f33SXuan Hu println(s"[Scheduler] io.toSchedulers.wakeupVec: ${io.toSchedulers.wakeupVec.map(x => backendParams.getExuName(x.bits.exuIdx))}") 330730cfbc0SXuan Hu} 331730cfbc0SXuan Hu 332730cfbc0SXuan Huclass SchedulerArithImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 333730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 334730cfbc0SXuan Hu with HasXSParameter 335e1a85e9fSchengguanghui with HasPerfEvents 336730cfbc0SXuan Hu{ 337*0a7d1d5cSxiaofeibao val issueQueuesUopIn = issueQueues.map(_.io.enq).flatten 338*0a7d1d5cSxiaofeibao issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2) 339730cfbc0SXuan Hu issueQueues.zipWithIndex.foreach { case (iq, i) => 340730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 341e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 342e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 343e600b1ddSxiaofeibao-xjtu } 344f39a61a1SzhanglyGit val intWBIQ = params.schdType match { 345f39a61a1SzhanglyGit case IntScheduler() => wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) 34660f0c5aeSxiaofeibao case FpScheduler() => wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) 347c720aa49Ssinsanction case VfScheduler() => (wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 348c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 349c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1)) 350596af5d2SHaojin Tang case _ => null 351f39a61a1SzhanglyGit } 352f39a61a1SzhanglyGit iq.io.wakeupFromWB.zip(intWBIQ).foreach{ case (sink, source) => sink := source} 353730cfbc0SXuan Hu } 354e1a85e9fSchengguanghui 355e1a85e9fSchengguanghui val perfEvents = basePerfEvents 356e1a85e9fSchengguanghui generatePerfEvent() 357730cfbc0SXuan Hu} 358730cfbc0SXuan Hu 359f99b81adSHaojin Tang// FIXME: Vector mem instructions may not be handled properly! 360730cfbc0SXuan Huclass SchedulerMemImp(override val wrapper: Scheduler)(implicit params: SchdBlockParams, p: Parameters) 361730cfbc0SXuan Hu extends SchedulerImpBase(wrapper) 362730cfbc0SXuan Hu with HasXSParameter 363e1a85e9fSchengguanghui with HasPerfEvents 364730cfbc0SXuan Hu{ 365730cfbc0SXuan Hu 366*0a7d1d5cSxiaofeibao val issueQueuesUopIn = issueQueues.filter(_.params.StdCnt == 0).map(_.io.enq).flatten 367*0a7d1d5cSxiaofeibao issueQueuesUopIn.zip(io.fromDispatch.uops).map(x => x._1 <> x._2) 368*0a7d1d5cSxiaofeibao val noStdExuParams = params.issueBlockParams.map(x => Seq.fill(x.numEnq)(x.exuBlockParams)).flatten.filter{x => x.map(!_.hasStdFu).reduce(_ && _)} 369*0a7d1d5cSxiaofeibao val staIdx = noStdExuParams.zipWithIndex.filter{x => x._1.map(_.hasStoreAddrFu).reduce(_ || _)}.map(_._2) 370*0a7d1d5cSxiaofeibao val staReady = issueQueues.filter(iq => iq.params.StaCnt > 0).map(_.io.enq.map(_.ready)).flatten 371*0a7d1d5cSxiaofeibao val stdReady = issueQueues.filter(iq => iq.params.StdCnt > 0).map(_.io.enq.map(_.ready)).flatten 372*0a7d1d5cSxiaofeibao staIdx.zipWithIndex.map{ case (sta, i) => { 373*0a7d1d5cSxiaofeibao io.fromDispatch.uops(sta).ready := staReady(i) && stdReady(i) 374*0a7d1d5cSxiaofeibao }} 375559c1710SHaojin Tang val memAddrIQs = issueQueues.filter(_.params.isMemAddrIQ) 376e07131b2Ssinsanction val stAddrIQs = issueQueues.filter(iq => iq.params.StaCnt > 0) // included in memAddrIQs 377e07131b2Ssinsanction val ldAddrIQs = issueQueues.filter(iq => iq.params.LduCnt > 0) 378e07131b2Ssinsanction val stDataIQs = issueQueues.filter(iq => iq.params.StdCnt > 0) 379559c1710SHaojin Tang val vecMemIQs = issueQueues.filter(_.params.isVecMemIQ) 380559c1710SHaojin Tang val (hyuIQs, hyuIQIdxs) = issueQueues.zipWithIndex.filter(_._1.params.HyuCnt > 0).unzip 381499caf4cSXuan Hu 382499caf4cSXuan Hu println(s"[SchedulerMemImp] memAddrIQs.size: ${memAddrIQs.size}, enq.size: ${memAddrIQs.map(_.io.enq.size).sum}") 383499caf4cSXuan Hu println(s"[SchedulerMemImp] stAddrIQs.size: ${stAddrIQs.size }, enq.size: ${stAddrIQs.map(_.io.enq.size).sum}") 384499caf4cSXuan Hu println(s"[SchedulerMemImp] ldAddrIQs.size: ${ldAddrIQs.size }, enq.size: ${ldAddrIQs.map(_.io.enq.size).sum}") 385499caf4cSXuan Hu println(s"[SchedulerMemImp] stDataIQs.size: ${stDataIQs.size }, enq.size: ${stDataIQs.map(_.io.enq.size).sum}") 386499caf4cSXuan Hu println(s"[SchedulerMemImp] hyuIQs.size: ${hyuIQs.size }, enq.size: ${hyuIQs.map(_.io.enq.size).sum}") 387730cfbc0SXuan Hu require(memAddrIQs.nonEmpty && stDataIQs.nonEmpty) 388730cfbc0SXuan Hu 389853cd2d8SHaojin Tang io.toMem.get.loadFastMatch := 0.U.asTypeOf(io.toMem.get.loadFastMatch) // TODO: is still needed? 390853cd2d8SHaojin Tang 391fc45ed13SXuan Hu private val loadWakeUp = issueQueues.filter(_.params.LdExuCnt > 0).map(_.asInstanceOf[IssueQueueMemAddrImp].io.memIO.get.loadWakeUp).flatten 392596af5d2SHaojin Tang require(loadWakeUp.length == io.fromMem.get.wakeup.length) 393596af5d2SHaojin Tang loadWakeUp.zip(io.fromMem.get.wakeup).foreach(x => x._1 := x._2) 394596af5d2SHaojin Tang 395730cfbc0SXuan Hu memAddrIQs.zipWithIndex.foreach { case (iq, i) => 396730cfbc0SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 397e600b1ddSxiaofeibao-xjtu if (!iq.params.needLoadDependency) { 398e600b1ddSxiaofeibao-xjtu iq.io.enq.map(x => x.bits.srcLoadDependency := 0.U.asTypeOf(x.bits.srcLoadDependency)) 399e600b1ddSxiaofeibao-xjtu } 40060f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 40160f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 40260f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 403c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 404c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1) ++ 405c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1) 40660f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 407730cfbc0SXuan Hu } 408730cfbc0SXuan Hu 409ecfc6f16SXuan Hu ldAddrIQs.zipWithIndex.foreach { 410ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 411ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO.head) 412c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 413de784418SXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4147b753bebSXuan Hu case _ => 4157b753bebSXuan Hu } 4167b753bebSXuan Hu 417ecfc6f16SXuan Hu stAddrIQs.zipWithIndex.foreach { 418ecfc6f16SXuan Hu case (imp: IssueQueueMemAddrImp, i) => 419ecfc6f16SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.staFeedback(i) 420c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 421c14e89f4SHaojin Tang imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 4227b753bebSXuan Hu case _ => 4237b753bebSXuan Hu } 424730cfbc0SXuan Hu 425559c1710SHaojin Tang hyuIQs.zip(hyuIQIdxs).foreach { 426559c1710SHaojin Tang case (imp: IssueQueueMemAddrImp, idx) => 427670870b3SXuan Hu imp.io.memIO.get.feedbackIO.head := io.fromMem.get.hyuFeedback.head 428670870b3SXuan Hu imp.io.memIO.get.feedbackIO(1) := 0.U.asTypeOf(imp.io.memIO.get.feedbackIO(1)) 4298f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 4308f1fa9b1Ssfencevma imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 431559c1710SHaojin Tang // TODO: refactor ditry code 432559c1710SHaojin Tang imp.io.deqDelay(1).ready := false.B 433559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).valid := false.B 434559c1710SHaojin Tang io.toDataPathAfterDelay(idx)(1).bits := 0.U.asTypeOf(io.toDataPathAfterDelay(idx)(1).bits) 4358f1fa9b1Ssfencevma case _ => 4368f1fa9b1Ssfencevma } 4378f1fa9b1Ssfencevma 438e62b6911SXuan Hu private val staIdxSeq = (stAddrIQs).map(iq => iq.params.idxInSchBlk) 439e62b6911SXuan Hu private val hyaIdxSeq = (hyuIQs).map(iq => iq.params.idxInSchBlk) 440e62b6911SXuan Hu 441e62b6911SXuan Hu println(s"[SchedulerMemImp] sta iq idx in memSchdBlock: $staIdxSeq") 442e62b6911SXuan Hu println(s"[SchedulerMemImp] hya iq idx in memSchdBlock: $hyaIdxSeq") 443e62b6911SXuan Hu 444e62b6911SXuan Hu private val staEnqs = stAddrIQs.map(_.io.enq).flatten 445e62b6911SXuan Hu private val stdEnqs = stDataIQs.map(_.io.enq).flatten.take(staEnqs.size) 446e62b6911SXuan Hu private val hyaEnqs = hyuIQs.map(_.io.enq).flatten 447e62b6911SXuan Hu private val hydEnqs = stDataIQs.map(_.io.enq).flatten.drop(staEnqs.size) 448e62b6911SXuan Hu 449e62b6911SXuan Hu require(staEnqs.size == stdEnqs.size, s"number of enq ports of store address IQs(${staEnqs.size}) " + 450e62b6911SXuan Hu s"should be equal to number of enq ports of store data IQs(${stdEnqs.size})") 451e62b6911SXuan Hu 452e62b6911SXuan Hu require(hyaEnqs.size == hydEnqs.size, s"number of enq ports of hybrid address IQs(${hyaEnqs.size}) " + 453e62b6911SXuan Hu s"should be equal to number of enq ports of hybrid data IQs(${hydEnqs.size})") 4549b258a00Sxgkiri 455e62b6911SXuan Hu stDataIQs.zipWithIndex.foreach { case (iq, i) => 456e62b6911SXuan Hu iq.io.flush <> io.fromCtrlBlock.flush 45760f0c5aeSxiaofeibao iq.io.wakeupFromWB.zip( 45860f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 45960f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 460c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 461c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => iq.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 462c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => iq.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 46360f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 464*0a7d1d5cSxiaofeibao // here disable fp load fast wakeup to std, and no FEX wakeup to std 465*0a7d1d5cSxiaofeibao iq.io.wakeupFromIQ.map(_.bits.fpWen := false.B) 466e62b6911SXuan Hu } 467e62b6911SXuan Hu 468e62b6911SXuan Hu (stdEnqs ++ hydEnqs).zip(staEnqs ++ hyaEnqs).zipWithIndex.foreach { case ((stdIQEnq, staIQEnq), i) => 469*0a7d1d5cSxiaofeibao stdIQEnq.valid := staIQEnq.valid && FuType.FuTypeOrR(staIQEnq.bits.fuType, FuType.stu, FuType.mou) 470730cfbc0SXuan Hu stdIQEnq.bits := staIQEnq.bits 471730cfbc0SXuan Hu // Store data reuses store addr src(1) in dispatch2iq 472e62b6911SXuan Hu // [dispatch2iq] --src*------src*(0)--> [staIQ|hyaIQ] 473730cfbc0SXuan Hu // \ 474730cfbc0SXuan Hu // ---src*(1)--> [stdIQ] 475730cfbc0SXuan Hu // Since the src(1) of sta is easier to get, stdIQEnq.bits.src*(0) is assigned to staIQEnq.bits.src*(1) 476730cfbc0SXuan Hu // instead of dispatch2Iq.io.out(x).bits.src*(1) 47797b279b9SXuan Hu val stdIdx = 1 4782d270511Ssinsanction stdIQEnq.bits.srcState(0) := staIQEnq.bits.srcState(stdIdx) 479955b4beaSsinsanction stdIQEnq.bits.srcLoadDependency(0) := staIQEnq.bits.srcLoadDependency(stdIdx) 4802d270511Ssinsanction stdIQEnq.bits.srcType(0) := staIQEnq.bits.srcType(stdIdx) 4812d270511Ssinsanction stdIQEnq.bits.psrc(0) := staIQEnq.bits.psrc(stdIdx) 482730cfbc0SXuan Hu stdIQEnq.bits.sqIdx := staIQEnq.bits.sqIdx 483955b4beaSsinsanction stdIQEnq.bits.useRegCache(0) := staIQEnq.bits.useRegCache(stdIdx) 484955b4beaSsinsanction stdIQEnq.bits.regCacheIdx(0) := staIQEnq.bits.regCacheIdx(stdIdx) 485730cfbc0SXuan Hu } 486730cfbc0SXuan Hu 4872d270511Ssinsanction vecMemIQs.foreach { 4882d270511Ssinsanction case imp: IssueQueueVecMemImp => 4892d270511Ssinsanction imp.io.memIO.get.sqDeqPtr.foreach(_ := io.fromMem.get.sqDeqPtr) 4902d270511Ssinsanction imp.io.memIO.get.lqDeqPtr.foreach(_ := io.fromMem.get.lqDeqPtr) 4911f3d1b4dSXuan Hu // not used 492b7c799beSzhanglyGit //imp.io.memIO.get.feedbackIO.head := io.fromMem.get.vstuFeedback.head // only vector store replay 4931f3d1b4dSXuan Hu // maybe not used 4941f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.stIssuePtr := io.fromMem.get.stIssuePtr 4951f3d1b4dSXuan Hu imp.io.memIO.get.checkWait.memWaitUpdateReq := io.fromMem.get.memWaitUpdateReq 49660f0c5aeSxiaofeibao imp.io.wakeupFromWB.zip( 49760f0c5aeSxiaofeibao wakeupFromIntWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromIntWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 49860f0c5aeSxiaofeibao wakeupFromFpWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromFpWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 499c720aa49Ssinsanction wakeupFromVfWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVfWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 500c720aa49Ssinsanction wakeupFromV0WBVec.zipWithIndex.filter(x => imp.params.needWakeupFromV0WBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq ++ 501c720aa49Ssinsanction wakeupFromVlWBVec.zipWithIndex.filter(x => imp.params.needWakeupFromVlWBPort.keys.toSeq.contains(x._2)).map(_._1).toSeq 50260f0c5aeSxiaofeibao ).foreach{ case (sink, source) => sink := source} 503f39a61a1SzhanglyGit 5042d270511Ssinsanction case _ => 5052d270511Ssinsanction } 506b7c799beSzhanglyGit val vecMemFeedbackIO: Seq[MemRSFeedbackIO] = vecMemIQs.map { 507b7c799beSzhanglyGit case imp: IssueQueueVecMemImp => 508b7c799beSzhanglyGit imp.io.memIO.get.feedbackIO 509b7c799beSzhanglyGit }.flatten 510b7c799beSzhanglyGit assert(vecMemFeedbackIO.size == io.fromMem.get.vstuFeedback.size, "vecMemFeedback size dont match!") 511b7c799beSzhanglyGit vecMemFeedbackIO.zip(io.fromMem.get.vstuFeedback).foreach{ 512b7c799beSzhanglyGit case (sink, source) => 513b7c799beSzhanglyGit sink := source 514b7c799beSzhanglyGit } 5152d270511Ssinsanction 516*0a7d1d5cSxiaofeibao val perfEvents = basePerfEvents 517e1a85e9fSchengguanghui generatePerfEvent() 518730cfbc0SXuan Hu} 519