1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4730cfbc0SXuan Huimport chisel3._ 55d2b9cadSXuan Huimport chisel3.util._ 6bf35baadSXuan Huimport utils.SeqUtils 7dd473fffSXuan Huimport xiangshan.backend.BackendParams 85d2b9cadSXuan Huimport xiangshan.backend.Bundles._ 939c59369SXuan Huimport xiangshan.backend.datapath.DataConfig.DataConfig 10f39a61a1SzhanglyGitimport xiangshan.backend.datapath.WbConfig.{IntWB, PregWB, VfWB} 115d2b9cadSXuan Huimport xiangshan.backend.datapath.{WakeUpConfig, WakeUpSource} 1239c59369SXuan Huimport xiangshan.backend.exu.{ExeUnit, ExeUnitParams} 135d2b9cadSXuan Huimport xiangshan.backend.fu.{FuConfig, FuType} 14520f7dacSsinsanctionimport xiangshan.SelImm 15730cfbc0SXuan Hu 16730cfbc0SXuan Hucase class IssueBlockParams( 17730cfbc0SXuan Hu // top down 18670870b3SXuan Hu private val exuParams: Seq[ExeUnitParams], 1956bcaed7SHaojin Tang val numEntries : Int, 20bf35baadSXuan Hu numEnq : Int, 2128607074Ssinsanction numComp : Int, 22730cfbc0SXuan Hu numDeqOutside : Int = 0, 23730cfbc0SXuan Hu numWakeupFromOthers : Int = 0, 24730cfbc0SXuan Hu XLEN : Int = 64, 25730cfbc0SXuan Hu VLEN : Int = 128, 26730cfbc0SXuan Hu vaddrBits : Int = 39, 27730cfbc0SXuan Hu // calculate in scheduler 289b258a00Sxgkiri var idxInSchBlk : Int = 0, 29730cfbc0SXuan Hu)( 30730cfbc0SXuan Hu implicit 31730cfbc0SXuan Hu val schdType: SchedulerType, 32730cfbc0SXuan Hu) { 33dd473fffSXuan Hu var backendParam: BackendParams = null 34dd473fffSXuan Hu 35670870b3SXuan Hu val exuBlockParams: Seq[ExeUnitParams] = exuParams.filterNot(_.fakeUnit) 36670870b3SXuan Hu 37670870b3SXuan Hu val allExuParams = exuParams 38670870b3SXuan Hu 399b258a00Sxgkiri def updateIdx(idx: Int): Unit = { 409b258a00Sxgkiri this.idxInSchBlk = idx 419b258a00Sxgkiri } 429b258a00Sxgkiri 43730cfbc0SXuan Hu def inMemSchd: Boolean = schdType == MemScheduler() 44730cfbc0SXuan Hu 45730cfbc0SXuan Hu def inIntSchd: Boolean = schdType == IntScheduler() 46730cfbc0SXuan Hu 47730cfbc0SXuan Hu def inVfSchd: Boolean = schdType == VfScheduler() 48730cfbc0SXuan Hu 4997b279b9SXuan Hu def isMemAddrIQ: Boolean = inMemSchd && (LduCnt > 0 || StaCnt > 0 || VlduCnt > 0 || VstaCnt > 0 || HyuCnt > 0) 50730cfbc0SXuan Hu 51730cfbc0SXuan Hu def isLdAddrIQ: Boolean = inMemSchd && LduCnt > 0 52730cfbc0SXuan Hu 53730cfbc0SXuan Hu def isStAddrIQ: Boolean = inMemSchd && StaCnt > 0 54730cfbc0SXuan Hu 5556715025SXuan Hu def isHyAddrIQ: Boolean = inMemSchd && HyuCnt > 0 5656715025SXuan Hu 572d270511Ssinsanction def isVecMemAddrIQ: Boolean = inMemSchd && (VlduCnt > 0 || VstaCnt > 0) 582d270511Ssinsanction 592d270511Ssinsanction def isVecLdAddrIQ: Boolean = inMemSchd && VlduCnt > 0 602d270511Ssinsanction 612d270511Ssinsanction def isVecStAddrIQ: Boolean = inMemSchd && VstaCnt > 0 622d270511Ssinsanction 632d270511Ssinsanction def isVecStDataIQ: Boolean = inMemSchd && VstdCnt > 0 642d270511Ssinsanction 652d270511Ssinsanction def isVecMemIQ: Boolean = (isVecLdAddrIQ || isVecStAddrIQ || isVecStDataIQ) 662d270511Ssinsanction 67670870b3SXuan Hu def numExu: Int = exuBlockParams.count(!_.fakeUnit) 68730cfbc0SXuan Hu 69730cfbc0SXuan Hu def numIntSrc: Int = exuBlockParams.map(_.numIntSrc).max 70730cfbc0SXuan Hu 71730cfbc0SXuan Hu def numFpSrc: Int = exuBlockParams.map(_.numFpSrc).max 72730cfbc0SXuan Hu 73730cfbc0SXuan Hu def numVecSrc: Int = exuBlockParams.map(_.numVecSrc).max 74730cfbc0SXuan Hu 75730cfbc0SXuan Hu def numVfSrc: Int = exuBlockParams.map(_.numVfSrc).max 76730cfbc0SXuan Hu 77730cfbc0SXuan Hu def numRegSrc: Int = exuBlockParams.map(_.numRegSrc).max 78730cfbc0SXuan Hu 79730cfbc0SXuan Hu def numSrc: Int = exuBlockParams.map(_.numSrc).max 80730cfbc0SXuan Hu 81730cfbc0SXuan Hu def readIntRf: Boolean = numIntSrc > 0 82730cfbc0SXuan Hu 83730cfbc0SXuan Hu def readFpRf: Boolean = numFpSrc > 0 84730cfbc0SXuan Hu 85730cfbc0SXuan Hu def readVecRf: Boolean = numVecSrc > 0 86730cfbc0SXuan Hu 87730cfbc0SXuan Hu def readVfRf: Boolean = numVfSrc > 0 88730cfbc0SXuan Hu 89730cfbc0SXuan Hu def writeIntRf: Boolean = exuBlockParams.map(_.writeIntRf).reduce(_ || _) 90730cfbc0SXuan Hu 91730cfbc0SXuan Hu def writeFpRf: Boolean = exuBlockParams.map(_.writeFpRf).reduce(_ || _) 92730cfbc0SXuan Hu 93730cfbc0SXuan Hu def writeVecRf: Boolean = exuBlockParams.map(_.writeVecRf).reduce(_ || _) 94730cfbc0SXuan Hu 95730cfbc0SXuan Hu def exceptionOut: Seq[Int] = exuBlockParams.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted 96730cfbc0SXuan Hu 97730cfbc0SXuan Hu def hasLoadError: Boolean = exuBlockParams.map(_.hasLoadError).reduce(_ || _) 98730cfbc0SXuan Hu 99730cfbc0SXuan Hu def flushPipe: Boolean = exuBlockParams.map(_.flushPipe).reduce(_ || _) 100730cfbc0SXuan Hu 101730cfbc0SXuan Hu def replayInst: Boolean = exuBlockParams.map(_.replayInst).reduce(_ || _) 102730cfbc0SXuan Hu 103730cfbc0SXuan Hu def trigger: Boolean = exuBlockParams.map(_.trigger).reduce(_ || _) 104730cfbc0SXuan Hu 105730cfbc0SXuan Hu def needExceptionGen: Boolean = exceptionOut.nonEmpty || flushPipe || replayInst || trigger 106730cfbc0SXuan Hu 107730cfbc0SXuan Hu def needPc: Boolean = JmpCnt + BrhCnt + FenceCnt > 0 108730cfbc0SXuan Hu 109730cfbc0SXuan Hu def needSrcFrm: Boolean = exuBlockParams.map(_.needSrcFrm).reduce(_ || _) 110730cfbc0SXuan Hu 111*17985fbbSZiyue Zhang def needSrcVxrm: Boolean = exuBlockParams.map(_.needSrcVxrm).reduce(_ || _) 112*17985fbbSZiyue Zhang 113730cfbc0SXuan Hu def numPcReadPort: Int = (if (needPc) 1 else 0) * numEnq 114730cfbc0SXuan Hu 115730cfbc0SXuan Hu def numWriteIntRf: Int = exuBlockParams.count(_.writeIntRf) 116730cfbc0SXuan Hu 117730cfbc0SXuan Hu def numWriteFpRf: Int = exuBlockParams.count(_.writeFpRf) 118730cfbc0SXuan Hu 119730cfbc0SXuan Hu def numWriteVecRf: Int = exuBlockParams.count(_.writeVecRf) 120730cfbc0SXuan Hu 121730cfbc0SXuan Hu def numWriteVfRf: Int = exuBlockParams.count(_.writeVfRf) 122730cfbc0SXuan Hu 123730cfbc0SXuan Hu def numNoDataWB: Int = exuBlockParams.count(_.hasNoDataWB) 124730cfbc0SXuan Hu 125730cfbc0SXuan Hu def dataBitsMax: Int = if (numVecSrc > 0) VLEN else XLEN 126730cfbc0SXuan Hu 127730cfbc0SXuan Hu def numDeq: Int = numDeqOutside + exuBlockParams.length 128730cfbc0SXuan Hu 12928607074Ssinsanction def numSimp: Int = numEntries - numEnq - numComp 13028607074Ssinsanction 13128607074Ssinsanction def isAllComp: Boolean = numComp == (numEntries - numEnq) 13228607074Ssinsanction 13328607074Ssinsanction def isAllSimp: Boolean = numComp == 0 13428607074Ssinsanction 13528607074Ssinsanction def hasCompAndSimp: Boolean = !(isAllComp || isAllSimp) 13628607074Ssinsanction 137730cfbc0SXuan Hu def JmpCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.jmp)).sum 138730cfbc0SXuan Hu 139730cfbc0SXuan Hu def BrhCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.brh)).sum 140730cfbc0SXuan Hu 141730cfbc0SXuan Hu def I2fCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.i2f)).sum 142730cfbc0SXuan Hu 143730cfbc0SXuan Hu def CsrCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.csr)).sum 144730cfbc0SXuan Hu 145730cfbc0SXuan Hu def AluCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.alu)).sum 146730cfbc0SXuan Hu 147730cfbc0SXuan Hu def MulCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mul)).sum 148730cfbc0SXuan Hu 149730cfbc0SXuan Hu def DivCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.div)).sum 150730cfbc0SXuan Hu 151730cfbc0SXuan Hu def FenceCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fence)).sum 152730cfbc0SXuan Hu 153730cfbc0SXuan Hu def BkuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.bku)).sum 154730cfbc0SXuan Hu 155d91483a6Sfdy def VsetCnt: Int = exuBlockParams.map(_.fuConfigs.count(x => x.fuType == FuType.vsetiwi || x.fuType == FuType.vsetiwf || x.fuType == FuType.vsetfwf)).sum 156730cfbc0SXuan Hu 157730cfbc0SXuan Hu def FmacCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmac)).sum 158730cfbc0SXuan Hu 159730cfbc0SXuan Hu def FmiscCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmisc)).sum 160730cfbc0SXuan Hu 161730cfbc0SXuan Hu def fDivSqrtCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fDivSqrt)).sum 162730cfbc0SXuan Hu 163b133b458SXuan Hu def LduCnt: Int = exuBlockParams.count(x => x.hasLoadFu && !x.hasStoreAddrFu) 164730cfbc0SXuan Hu 165b133b458SXuan Hu def StaCnt: Int = exuBlockParams.count(x => !x.hasLoadFu && x.hasStoreAddrFu) 166730cfbc0SXuan Hu 167730cfbc0SXuan Hu def MouCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mou)).sum 168730cfbc0SXuan Hu 169730cfbc0SXuan Hu def StdCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "std")).sum 170730cfbc0SXuan Hu 171670870b3SXuan Hu def HyuCnt: Int = exuBlockParams.count(_.hasHyldaFu) // only count hylda, since it equals to hysta 172b133b458SXuan Hu 1738a66c02cSXuan Hu def LdExuCnt = LduCnt + HyuCnt 1748a66c02cSXuan Hu 175730cfbc0SXuan Hu def VipuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vipu)).sum 176730cfbc0SXuan Hu 177730cfbc0SXuan Hu def VfpuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vfpu)).sum 178730cfbc0SXuan Hu 179730cfbc0SXuan Hu def VlduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vldu)).sum 180730cfbc0SXuan Hu 181730cfbc0SXuan Hu def VstuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vstu)).sum 182730cfbc0SXuan Hu 1832d270511Ssinsanction def VstaCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "vsta")).sum 1842d270511Ssinsanction 1852d270511Ssinsanction def VstdCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "vstd")).sum 1862d270511Ssinsanction 187730cfbc0SXuan Hu def numRedirect: Int = exuBlockParams.count(_.hasRedirect) 188730cfbc0SXuan Hu 18939c59369SXuan Hu /** 19039c59369SXuan Hu * Get the regfile type that this issue queue need to read 19139c59369SXuan Hu */ 19239c59369SXuan Hu def pregReadSet: Set[DataConfig] = exuBlockParams.map(_.pregRdDataCfgSet).fold(Set())(_ union _) 19339c59369SXuan Hu 19439c59369SXuan Hu /** 19539c59369SXuan Hu * Get the regfile type that this issue queue need to read 19639c59369SXuan Hu */ 19739c59369SXuan Hu def pregWriteSet: Set[DataConfig] = exuBlockParams.map(_.pregWbDataCfgSet).fold(Set())(_ union _) 19839c59369SXuan Hu 19939c59369SXuan Hu /** 20039c59369SXuan Hu * Get the max width of psrc 20139c59369SXuan Hu */ 20239c59369SXuan Hu def rdPregIdxWidth = { 20339c59369SXuan Hu this.pregReadSet.map(cfg => backendParam.getPregParams(cfg).addrWidth).fold(0)(_ max _) 20439c59369SXuan Hu } 20539c59369SXuan Hu 20639c59369SXuan Hu /** 20739c59369SXuan Hu * Get the max width of pdest 20839c59369SXuan Hu */ 20939c59369SXuan Hu def wbPregIdxWidth = { 21039c59369SXuan Hu this.pregWriteSet.map(cfg => backendParam.getPregParams(cfg).addrWidth).fold(0)(_ max _) 21139c59369SXuan Hu } 21239c59369SXuan Hu 213bf35baadSXuan Hu def iqWakeUpSourcePairs: Seq[WakeUpConfig] = exuBlockParams.flatMap(_.iqWakeUpSourcePairs) 214bf35baadSXuan Hu 215bf35baadSXuan Hu /** Get exu source wake up 216bf35baadSXuan Hu * @todo replace with 217bf35baadSXuan Hu * exuBlockParams 218bf35baadSXuan Hu * .flatMap(_.iqWakeUpSinkPairs) 219bf35baadSXuan Hu * .map(_.source) 220bf35baadSXuan Hu * .distinctBy(_.name) 221bf35baadSXuan Hu * when xiangshan is updated to 2.13.11 222bf35baadSXuan Hu */ 223bf35baadSXuan Hu def wakeUpInExuSources: Seq[WakeUpSource] = { 224bf35baadSXuan Hu SeqUtils.distinctBy( 225bf35baadSXuan Hu exuBlockParams 226bf35baadSXuan Hu .flatMap(_.iqWakeUpSinkPairs) 227bf35baadSXuan Hu .map(_.source) 228bf35baadSXuan Hu )(_.name) 229bf35baadSXuan Hu } 230bf35baadSXuan Hu 231bf35baadSXuan Hu def wakeUpOutExuSources: Seq[WakeUpSource] = { 232bf35baadSXuan Hu SeqUtils.distinctBy( 233bf35baadSXuan Hu exuBlockParams 234bf35baadSXuan Hu .flatMap(_.iqWakeUpSourcePairs) 235bf35baadSXuan Hu .map(_.source) 236bf35baadSXuan Hu )(_.name) 237bf35baadSXuan Hu } 238bf35baadSXuan Hu 239bf35baadSXuan Hu def wakeUpToExuSinks = exuBlockParams 240bf35baadSXuan Hu .flatMap(_.iqWakeUpSourcePairs) 241bf35baadSXuan Hu .map(_.sink).distinct 242bf35baadSXuan Hu 2430c7ebb58Sxiaofeibao-xjtu def numWakeupToIQ: Int = wakeUpInExuSources.size 2440c7ebb58Sxiaofeibao-xjtu 245bf35baadSXuan Hu def numWakeupFromIQ: Int = wakeUpInExuSources.size 246bf35baadSXuan Hu 247bf35baadSXuan Hu def numAllWakeUp: Int = numWakeupFromWB + numWakeupFromIQ + numWakeupFromOthers 248730cfbc0SXuan Hu 24939c59369SXuan Hu def numWakeupFromWB = { 25039c59369SXuan Hu val pregSet = this.pregReadSet 25139c59369SXuan Hu pregSet.map(cfg => backendParam.getRfWriteSize(cfg)).sum 25239c59369SXuan Hu } 25339c59369SXuan Hu 254670870b3SXuan Hu def hasIQWakeUp: Boolean = numWakeupFromIQ > 0 && numRegSrc > 0 255c0be7f33SXuan Hu 25663101478SHaojin Tang def needWakeupFromIntWBPort = backendParam.allExuParams.filter(x => !wakeUpInExuSources.map(_.name).contains(x.name)).groupBy(x => x.getIntWBPort.getOrElse(IntWB(port = -1)).port).filter(_._1 != -1) 257f39a61a1SzhanglyGit 258f39a61a1SzhanglyGit def needWakeupFromVfWBPort = backendParam.allExuParams.groupBy(x => x.getVfWBPort.getOrElse(VfWB(port = -1)).port).filter(_._1 != -1) 259f39a61a1SzhanglyGit 260730cfbc0SXuan Hu def getFuCfgs: Seq[FuConfig] = exuBlockParams.flatMap(_.fuConfigs).distinct 261730cfbc0SXuan Hu 262f7f73727Ssinsanction def deqFuCfgs: Seq[Seq[FuConfig]] = exuBlockParams.map(_.fuConfigs) 263f7f73727Ssinsanction 264f7f73727Ssinsanction def deqFuInterSect: Seq[FuConfig] = if (numDeq == 2) deqFuCfgs(0).intersect(deqFuCfgs(1)) else Seq() 265f7f73727Ssinsanction 266f7f73727Ssinsanction def deqFuSame: Boolean = (numDeq == 2) && deqFuInterSect.length == deqFuCfgs(0).length && deqFuCfgs(0).length == deqFuCfgs(1).length 267f7f73727Ssinsanction 268f7f73727Ssinsanction def deqFuDiff: Boolean = (numDeq == 2) && deqFuInterSect.length == 0 269f7f73727Ssinsanction 270520f7dacSsinsanction def deqImmTypes: Seq[UInt] = getFuCfgs.flatMap(_.immType).distinct 271520f7dacSsinsanction 272520f7dacSsinsanction // set load imm to 32-bit for fused_lui_load 273520f7dacSsinsanction def deqImmTypesMaxLen: Int = if (isLdAddrIQ) 32 else deqImmTypes.map(SelImm.getImmUnion(_)).maxBy(_.len).len 274520f7dacSsinsanction 275520f7dacSsinsanction def needImm: Boolean = deqImmTypes.nonEmpty 276520f7dacSsinsanction 277730cfbc0SXuan Hu // cfgs(exuIdx)(set of exu's wb) 27839c59369SXuan Hu 27939c59369SXuan Hu /** 28039c59369SXuan Hu * Get [[PregWB]] of this IssueBlock 28139c59369SXuan Hu * @return set of [[PregWB]] of [[ExeUnit]] 28239c59369SXuan Hu */ 28339c59369SXuan Hu def getWbCfgs: Seq[Set[PregWB]] = { 284730cfbc0SXuan Hu exuBlockParams.map(exu => exu.wbPortConfigs.toSet) 285730cfbc0SXuan Hu } 286730cfbc0SXuan Hu 287730cfbc0SXuan Hu def canAccept(fuType: UInt): Bool = { 288730cfbc0SXuan Hu Cat(getFuCfgs.map(_.fuType.U === fuType)).orR 289730cfbc0SXuan Hu } 290730cfbc0SXuan Hu 291dd473fffSXuan Hu def bindBackendParam(param: BackendParams): Unit = { 292dd473fffSXuan Hu backendParam = param 293dd473fffSXuan Hu } 294dd473fffSXuan Hu 295acf41503Ssinsanction def wakeUpSourceExuIdx: Seq[Int] = { 296acf41503Ssinsanction wakeUpInExuSources.map(x => backendParam.getExuIdx(x.name)) 297acf41503Ssinsanction } 298acf41503Ssinsanction 299730cfbc0SXuan Hu def genExuInputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuInput]] = { 300730cfbc0SXuan Hu MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuInputBundle))) 301730cfbc0SXuan Hu } 302730cfbc0SXuan Hu 303730cfbc0SXuan Hu def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuOutput]] = { 304670870b3SXuan Hu MixedVec(this.exuParams.map(x => DecoupledIO(x.genExuOutputBundle))) 305730cfbc0SXuan Hu } 306730cfbc0SXuan Hu 307730cfbc0SXuan Hu def genExuOutputValidBundle(implicit p: Parameters): MixedVec[ValidIO[ExuOutput]] = { 308670870b3SXuan Hu MixedVec(this.exuParams.map(x => ValidIO(x.genExuOutputBundle))) 309730cfbc0SXuan Hu } 310730cfbc0SXuan Hu 3115d2b9cadSXuan Hu def genExuBypassValidBundle(implicit p: Parameters): MixedVec[ValidIO[ExuBypassBundle]] = { 312670870b3SXuan Hu MixedVec(this.exuParams.filterNot(_.fakeUnit).map(x => ValidIO(x.genExuBypassBundle))) 3135d2b9cadSXuan Hu } 3145d2b9cadSXuan Hu 315730cfbc0SXuan Hu def genIssueDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[IssueQueueIssueBundle]] = { 316670870b3SXuan Hu MixedVec(exuBlockParams.filterNot(_.fakeUnit).map(x => DecoupledIO(new IssueQueueIssueBundle(this, x)))) 317730cfbc0SXuan Hu } 318730cfbc0SXuan Hu 319c0be7f33SXuan Hu def genWBWakeUpSinkValidBundle: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 320c0be7f33SXuan Hu val intBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match { 321f39a61a1SzhanglyGit case IntScheduler() | MemScheduler() => needWakeupFromIntWBPort.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 322c0be7f33SXuan Hu case _ => Seq() 323c0be7f33SXuan Hu } 324c0be7f33SXuan Hu val vfBundle = schdType match { 325f39a61a1SzhanglyGit case VfScheduler() | MemScheduler() => needWakeupFromVfWBPort.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 326c0be7f33SXuan Hu case _ => Seq() 327c0be7f33SXuan Hu } 328c0be7f33SXuan Hu MixedVec(intBundle ++ vfBundle) 329bf35baadSXuan Hu } 330bf35baadSXuan Hu 331c0be7f33SXuan Hu def genIQWakeUpSourceValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = { 3324c5a0d77Sxiaofeibao-xjtu MixedVec(exuBlockParams.map(x => ValidIO(new IssueQueueIQWakeUpBundle(x.exuIdx, backendParam, x.copyWakeupOut, x.copyNum)))) 333c0be7f33SXuan Hu } 334c0be7f33SXuan Hu 335c0be7f33SXuan Hu def genIQWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = { 336c0be7f33SXuan Hu MixedVec(this.wakeUpInExuSources.map(x => ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam)))) 337c0be7f33SXuan Hu } 338c0be7f33SXuan Hu 339730cfbc0SXuan Hu def genOGRespBundle(implicit p: Parameters) = { 340730cfbc0SXuan Hu implicit val issueBlockParams = this 341730cfbc0SXuan Hu MixedVec(exuBlockParams.map(_ => new OGRespBundle)) 342730cfbc0SXuan Hu } 343730cfbc0SXuan Hu 344dd970561SzhanglyGit def genWbFuBusyTableWriteBundle()(implicit p: Parameters) = { 3458d29ec32Sczw implicit val issueBlockParams = this 346dd970561SzhanglyGit MixedVec(exuBlockParams.map(x => new WbFuBusyTableWriteBundle(x))) 3478d29ec32Sczw } 3488d29ec32Sczw 3492e0a7dc5Sfdy def genWbFuBusyTableReadBundle()(implicit p: Parameters) = { 3508d29ec32Sczw implicit val issueBlockParams = this 3512e0a7dc5Sfdy MixedVec(exuBlockParams.map{ x => 3522e0a7dc5Sfdy new WbFuBusyTableReadBundle(x) 3532e0a7dc5Sfdy }) 3542e0a7dc5Sfdy } 3552e0a7dc5Sfdy 3562e0a7dc5Sfdy def genWbConflictBundle()(implicit p: Parameters) = { 3572e0a7dc5Sfdy implicit val issueBlockParams = this 3582e0a7dc5Sfdy MixedVec(exuBlockParams.map { x => 3592e0a7dc5Sfdy new WbConflictBundle(x) 3602e0a7dc5Sfdy }) 3618d29ec32Sczw } 3628d29ec32Sczw 363730cfbc0SXuan Hu def getIQName = { 364730cfbc0SXuan Hu "IssueQueue" ++ getFuCfgs.map(_.name).distinct.map(_.capitalize).reduce(_ ++ _) 365730cfbc0SXuan Hu } 3660721d1aaSXuan Hu 3670721d1aaSXuan Hu def getEntryName = { 3680721d1aaSXuan Hu "Entries" ++ getFuCfgs.map(_.name).distinct.map(_.capitalize).reduce(_ ++ _) 3690721d1aaSXuan Hu } 370730cfbc0SXuan Hu} 371