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 10de8bd1d0Ssinsanctionimport xiangshan.backend.datapath.WbConfig._ 115d2b9cadSXuan Huimport xiangshan.backend.datapath.{WakeUpConfig, WakeUpSource} 1239c59369SXuan Huimport xiangshan.backend.exu.{ExeUnit, ExeUnitParams} 135d2b9cadSXuan Huimport xiangshan.backend.fu.{FuConfig, FuType} 14520f7dacSsinsanctionimport xiangshan.SelImm 15c38df446SzhanglyGitimport xiangshan.backend.issue.EntryBundles.EntryDeqRespBundle 16730cfbc0SXuan Hu 17730cfbc0SXuan Hucase class IssueBlockParams( 18730cfbc0SXuan Hu // top down 19670870b3SXuan Hu private val exuParams: Seq[ExeUnitParams], 2056bcaed7SHaojin Tang val numEntries : Int, 21bf35baadSXuan Hu numEnq : Int, 2228607074Ssinsanction numComp : Int, 23730cfbc0SXuan Hu numDeqOutside : Int = 0, 24730cfbc0SXuan Hu numWakeupFromOthers : Int = 0, 25730cfbc0SXuan Hu XLEN : Int = 64, 26730cfbc0SXuan Hu VLEN : Int = 128, 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 49e07131b2Ssinsanction def isMemAddrIQ: Boolean = inMemSchd && (LduCnt > 0 || StaCnt > 0 || VlduCnt > 0 || VstuCnt > 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 5742b6cdf9Ssinsanction def isVecLduIQ: Boolean = inMemSchd && (VlduCnt + VseglduCnt) > 0 582d270511Ssinsanction 5942b6cdf9Ssinsanction def isVecStuIQ: Boolean = inMemSchd && (VstuCnt + VsegstuCnt) > 0 602d270511Ssinsanction 61e07131b2Ssinsanction def isVecMemIQ: Boolean = isVecLduIQ || isVecStuIQ 622d270511Ssinsanction 6338f78b5dSxiaofeibao-xjtu def needFeedBackSqIdx: Boolean = isVecMemIQ || isStAddrIQ 6438f78b5dSxiaofeibao-xjtu 6528ac1c16Sxiaofeibao-xjtu def needFeedBackLqIdx: Boolean = isVecMemIQ || isLdAddrIQ 6628ac1c16Sxiaofeibao-xjtu 67e600b1ddSxiaofeibao-xjtu def needLoadDependency: Boolean = exuBlockParams.map(_.needLoadDependency).reduce(_ || _) 68e600b1ddSxiaofeibao-xjtu 69670870b3SXuan Hu def numExu: Int = exuBlockParams.count(!_.fakeUnit) 70730cfbc0SXuan Hu 71730cfbc0SXuan Hu def numIntSrc: Int = exuBlockParams.map(_.numIntSrc).max 72730cfbc0SXuan Hu 73730cfbc0SXuan Hu def numFpSrc: Int = exuBlockParams.map(_.numFpSrc).max 74730cfbc0SXuan Hu 75730cfbc0SXuan Hu def numVecSrc: Int = exuBlockParams.map(_.numVecSrc).max 76730cfbc0SXuan Hu 77730cfbc0SXuan Hu def numVfSrc: Int = exuBlockParams.map(_.numVfSrc).max 78730cfbc0SXuan Hu 79de8bd1d0Ssinsanction def numV0Src: Int = exuBlockParams.map(_.numV0Src).max 80de8bd1d0Ssinsanction 81de8bd1d0Ssinsanction def numVlSrc: Int = exuBlockParams.map(_.numVlSrc).max 82de8bd1d0Ssinsanction 83730cfbc0SXuan Hu def numRegSrc: Int = exuBlockParams.map(_.numRegSrc).max 84730cfbc0SXuan Hu 85730cfbc0SXuan Hu def numSrc: Int = exuBlockParams.map(_.numSrc).max 86730cfbc0SXuan Hu 87730cfbc0SXuan Hu def readIntRf: Boolean = numIntSrc > 0 88730cfbc0SXuan Hu 89730cfbc0SXuan Hu def readFpRf: Boolean = numFpSrc > 0 90730cfbc0SXuan Hu 91730cfbc0SXuan Hu def readVecRf: Boolean = numVecSrc > 0 92730cfbc0SXuan Hu 93730cfbc0SXuan Hu def readVfRf: Boolean = numVfSrc > 0 94730cfbc0SXuan Hu 95399ac7a1Ssinsanction def readV0Rf: Boolean = numV0Src > 0 96399ac7a1Ssinsanction 97399ac7a1Ssinsanction def readVlRf: Boolean = numVlSrc > 0 98399ac7a1Ssinsanction 99730cfbc0SXuan Hu def writeIntRf: Boolean = exuBlockParams.map(_.writeIntRf).reduce(_ || _) 100730cfbc0SXuan Hu 101730cfbc0SXuan Hu def writeFpRf: Boolean = exuBlockParams.map(_.writeFpRf).reduce(_ || _) 102730cfbc0SXuan Hu 103730cfbc0SXuan Hu def writeVecRf: Boolean = exuBlockParams.map(_.writeVecRf).reduce(_ || _) 104730cfbc0SXuan Hu 105dd461822Ssinsanction def writeV0Rf: Boolean = exuBlockParams.map(_.writeV0Rf).reduce(_ || _) 106dd461822Ssinsanction 107dd461822Ssinsanction def writeVlRf: Boolean = exuBlockParams.map(_.writeVlRf).reduce(_ || _) 108dd461822Ssinsanction 109730cfbc0SXuan Hu def exceptionOut: Seq[Int] = exuBlockParams.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted 110730cfbc0SXuan Hu 111730cfbc0SXuan Hu def hasLoadError: Boolean = exuBlockParams.map(_.hasLoadError).reduce(_ || _) 112730cfbc0SXuan Hu 113730cfbc0SXuan Hu def flushPipe: Boolean = exuBlockParams.map(_.flushPipe).reduce(_ || _) 114730cfbc0SXuan Hu 115730cfbc0SXuan Hu def replayInst: Boolean = exuBlockParams.map(_.replayInst).reduce(_ || _) 116730cfbc0SXuan Hu 117730cfbc0SXuan Hu def trigger: Boolean = exuBlockParams.map(_.trigger).reduce(_ || _) 118730cfbc0SXuan Hu 119730cfbc0SXuan Hu def needExceptionGen: Boolean = exceptionOut.nonEmpty || flushPipe || replayInst || trigger 120730cfbc0SXuan Hu 121730cfbc0SXuan Hu def needPc: Boolean = JmpCnt + BrhCnt + FenceCnt > 0 122730cfbc0SXuan Hu 123730cfbc0SXuan Hu def needSrcFrm: Boolean = exuBlockParams.map(_.needSrcFrm).reduce(_ || _) 124730cfbc0SXuan Hu 12517985fbbSZiyue Zhang def needSrcVxrm: Boolean = exuBlockParams.map(_.needSrcVxrm).reduce(_ || _) 12617985fbbSZiyue Zhang 127b6279fc6SZiyue Zhang def writeVConfig: Boolean = exuBlockParams.map(_.writeVConfig).reduce(_ || _) 128b6279fc6SZiyue Zhang 1297e4f0b19SZiyue-Zhang def writeVType: Boolean = exuBlockParams.map(_.writeVType).reduce(_ || _) 1307e4f0b19SZiyue-Zhang 131730cfbc0SXuan Hu def numWriteIntRf: Int = exuBlockParams.count(_.writeIntRf) 132730cfbc0SXuan Hu 133730cfbc0SXuan Hu def numWriteFpRf: Int = exuBlockParams.count(_.writeFpRf) 134730cfbc0SXuan Hu 135730cfbc0SXuan Hu def numWriteVecRf: Int = exuBlockParams.count(_.writeVecRf) 136730cfbc0SXuan Hu 137730cfbc0SXuan Hu def numWriteVfRf: Int = exuBlockParams.count(_.writeVfRf) 138730cfbc0SXuan Hu 139730cfbc0SXuan Hu def numNoDataWB: Int = exuBlockParams.count(_.hasNoDataWB) 140730cfbc0SXuan Hu 141730cfbc0SXuan Hu def dataBitsMax: Int = if (numVecSrc > 0) VLEN else XLEN 142730cfbc0SXuan Hu 143730cfbc0SXuan Hu def numDeq: Int = numDeqOutside + exuBlockParams.length 144730cfbc0SXuan Hu 14528607074Ssinsanction def numSimp: Int = numEntries - numEnq - numComp 14628607074Ssinsanction 14728607074Ssinsanction def isAllComp: Boolean = numComp == (numEntries - numEnq) 14828607074Ssinsanction 14928607074Ssinsanction def isAllSimp: Boolean = numComp == 0 15028607074Ssinsanction 15128607074Ssinsanction def hasCompAndSimp: Boolean = !(isAllComp || isAllSimp) 15228607074Ssinsanction 153730cfbc0SXuan Hu def JmpCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.jmp)).sum 154730cfbc0SXuan Hu 155730cfbc0SXuan Hu def BrhCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.brh)).sum 156730cfbc0SXuan Hu 157730cfbc0SXuan Hu def I2fCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.i2f)).sum 158730cfbc0SXuan Hu 159730cfbc0SXuan Hu def CsrCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.csr)).sum 160730cfbc0SXuan Hu 161730cfbc0SXuan Hu def AluCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.alu)).sum 162730cfbc0SXuan Hu 163730cfbc0SXuan Hu def MulCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mul)).sum 164730cfbc0SXuan Hu 165730cfbc0SXuan Hu def DivCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.div)).sum 166730cfbc0SXuan Hu 167730cfbc0SXuan Hu def FenceCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fence)).sum 168730cfbc0SXuan Hu 169730cfbc0SXuan Hu def BkuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.bku)).sum 170730cfbc0SXuan Hu 171d91483a6Sfdy def VsetCnt: Int = exuBlockParams.map(_.fuConfigs.count(x => x.fuType == FuType.vsetiwi || x.fuType == FuType.vsetiwf || x.fuType == FuType.vsetfwf)).sum 172730cfbc0SXuan Hu 173730cfbc0SXuan Hu def FmacCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmac)).sum 174730cfbc0SXuan Hu 175730cfbc0SXuan Hu def fDivSqrtCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fDivSqrt)).sum 176730cfbc0SXuan Hu 177b133b458SXuan Hu def LduCnt: Int = exuBlockParams.count(x => x.hasLoadFu && !x.hasStoreAddrFu) 178730cfbc0SXuan Hu 179b133b458SXuan Hu def StaCnt: Int = exuBlockParams.count(x => !x.hasLoadFu && x.hasStoreAddrFu) 180730cfbc0SXuan Hu 181730cfbc0SXuan Hu def MouCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mou)).sum 182730cfbc0SXuan Hu 183730cfbc0SXuan Hu def StdCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "std")).sum 184730cfbc0SXuan Hu 185670870b3SXuan Hu def HyuCnt: Int = exuBlockParams.count(_.hasHyldaFu) // only count hylda, since it equals to hysta 186b133b458SXuan Hu 1878a66c02cSXuan Hu def LdExuCnt = LduCnt + HyuCnt 1888a66c02cSXuan Hu 189730cfbc0SXuan Hu def VipuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vipu)).sum 190730cfbc0SXuan Hu 191730cfbc0SXuan Hu def VfpuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vfpu)).sum 192730cfbc0SXuan Hu 193730cfbc0SXuan Hu def VlduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vldu)).sum 194730cfbc0SXuan Hu 195730cfbc0SXuan Hu def VstuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vstu)).sum 196730cfbc0SXuan Hu 19742b6cdf9Ssinsanction def VseglduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vsegldu)).sum 19842b6cdf9Ssinsanction 19942b6cdf9Ssinsanction def VsegstuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vsegstu)).sum 20042b6cdf9Ssinsanction 201730cfbc0SXuan Hu def numRedirect: Int = exuBlockParams.count(_.hasRedirect) 202730cfbc0SXuan Hu 203f8b278aaSsinsanction def numWriteRegCache: Int = exuBlockParams.map(x => if (x.needWriteRegCache) 1 else 0).sum 204f8b278aaSsinsanction 205f8b278aaSsinsanction def needWriteRegCache: Boolean = numWriteRegCache > 0 206f8b278aaSsinsanction 2074c2a845dSsinsanction def needReadRegCache: Boolean = exuBlockParams.map(_.needReadRegCache).reduce(_ || _) 2084c2a845dSsinsanction 20942b6cdf9Ssinsanction def needOg2Resp: Boolean = exuBlockParams.map(_.needOg2).reduce(_ || _) 21042b6cdf9Ssinsanction 21139c59369SXuan Hu /** 21239c59369SXuan Hu * Get the regfile type that this issue queue need to read 21339c59369SXuan Hu */ 21439c59369SXuan Hu def pregReadSet: Set[DataConfig] = exuBlockParams.map(_.pregRdDataCfgSet).fold(Set())(_ union _) 21539c59369SXuan Hu 21639c59369SXuan Hu /** 21739c59369SXuan Hu * Get the regfile type that this issue queue need to read 21839c59369SXuan Hu */ 21939c59369SXuan Hu def pregWriteSet: Set[DataConfig] = exuBlockParams.map(_.pregWbDataCfgSet).fold(Set())(_ union _) 22039c59369SXuan Hu 22139c59369SXuan Hu /** 22239c59369SXuan Hu * Get the max width of psrc 22339c59369SXuan Hu */ 22439c59369SXuan Hu def rdPregIdxWidth = { 22539c59369SXuan Hu this.pregReadSet.map(cfg => backendParam.getPregParams(cfg).addrWidth).fold(0)(_ max _) 22639c59369SXuan Hu } 22739c59369SXuan Hu 22839c59369SXuan Hu /** 22939c59369SXuan Hu * Get the max width of pdest 23039c59369SXuan Hu */ 23139c59369SXuan Hu def wbPregIdxWidth = { 23239c59369SXuan Hu this.pregWriteSet.map(cfg => backendParam.getPregParams(cfg).addrWidth).fold(0)(_ max _) 23339c59369SXuan Hu } 23439c59369SXuan Hu 235bf35baadSXuan Hu def iqWakeUpSourcePairs: Seq[WakeUpConfig] = exuBlockParams.flatMap(_.iqWakeUpSourcePairs) 236bf35baadSXuan Hu 237edb1dfafSHaojin Tang /** 238edb1dfafSHaojin Tang * Get exu source wake up 239bf35baadSXuan Hu */ 240bf35baadSXuan Hu def wakeUpInExuSources: Seq[WakeUpSource] = { 241bf35baadSXuan Hu exuBlockParams 242bf35baadSXuan Hu .flatMap(_.iqWakeUpSinkPairs) 243bf35baadSXuan Hu .map(_.source) 244edb1dfafSHaojin Tang .distinctBy(_.name) 245bf35baadSXuan Hu } 246bf35baadSXuan Hu 247bf35baadSXuan Hu def wakeUpOutExuSources: Seq[WakeUpSource] = { 248bf35baadSXuan Hu exuBlockParams 249bf35baadSXuan Hu .flatMap(_.iqWakeUpSourcePairs) 250bf35baadSXuan Hu .map(_.source) 251edb1dfafSHaojin Tang .distinctBy(_.name) 252bf35baadSXuan Hu } 253bf35baadSXuan Hu 254bf35baadSXuan Hu def wakeUpToExuSinks = exuBlockParams 255bf35baadSXuan Hu .flatMap(_.iqWakeUpSourcePairs) 256bf35baadSXuan Hu .map(_.sink).distinct 257bf35baadSXuan Hu 2580c7ebb58Sxiaofeibao-xjtu def numWakeupToIQ: Int = wakeUpInExuSources.size 2590c7ebb58Sxiaofeibao-xjtu 260bf35baadSXuan Hu def numWakeupFromIQ: Int = wakeUpInExuSources.size 261bf35baadSXuan Hu 262bf35baadSXuan Hu def numAllWakeUp: Int = numWakeupFromWB + numWakeupFromIQ + numWakeupFromOthers 263730cfbc0SXuan Hu 26439c59369SXuan Hu def numWakeupFromWB = { 26539c59369SXuan Hu val pregSet = this.pregReadSet 26639c59369SXuan Hu pregSet.map(cfg => backendParam.getRfWriteSize(cfg)).sum 26739c59369SXuan Hu } 26839c59369SXuan Hu 269670870b3SXuan Hu def hasIQWakeUp: Boolean = numWakeupFromIQ > 0 && numRegSrc > 0 270c0be7f33SXuan Hu 271399ac7a1Ssinsanction def needWakeupFromIntWBPort = backendParam.allExuParams.filter(x => !wakeUpInExuSources.map(_.name).contains(x.name) && this.readIntRf).groupBy(x => x.getIntWBPort.getOrElse(IntWB(port = -1)).port).filter(_._1 != -1) 272f39a61a1SzhanglyGit 2730a7d1d5cSxiaofeibao def needWakeupFromFpWBPort = if (this.exuBlockParams.map(_.hasStdFu).reduce(_ || _)) { 2740a7d1d5cSxiaofeibao // here add fp load WB wakeup to std 2750a7d1d5cSxiaofeibao backendParam.allExuParams.filter(x => (!wakeUpInExuSources.map(_.name).contains(x.name) || x.hasLoadExu) && this.readFpRf).groupBy(x => x.getFpWBPort.getOrElse(FpWB(port = -1)).port).filter(_._1 != -1) 2760a7d1d5cSxiaofeibao } 2770a7d1d5cSxiaofeibao else { 2780a7d1d5cSxiaofeibao backendParam.allExuParams.filter(x => !wakeUpInExuSources.map(_.name).contains(x.name) && this.readFpRf).groupBy(x => x.getFpWBPort.getOrElse(FpWB(port = -1)).port).filter(_._1 != -1) 2790a7d1d5cSxiaofeibao } 28060f0c5aeSxiaofeibao 281399ac7a1Ssinsanction def needWakeupFromVfWBPort = backendParam.allExuParams.filter(x => !wakeUpInExuSources.map(_.name).contains(x.name) && this.readVecRf).groupBy(x => x.getVfWBPort.getOrElse(VfWB(port = -1)).port).filter(_._1 != -1) 282f39a61a1SzhanglyGit 283399ac7a1Ssinsanction def needWakeupFromV0WBPort = backendParam.allExuParams.filter(x => !wakeUpInExuSources.map(_.name).contains(x.name) && this.readV0Rf).groupBy(x => x.getV0WBPort.getOrElse(V0WB(port = -1)).port).filter(_._1 != -1) 284de8bd1d0Ssinsanction 285399ac7a1Ssinsanction def needWakeupFromVlWBPort = backendParam.allExuParams.filter(x => !wakeUpInExuSources.map(_.name).contains(x.name) && this.readVlRf).groupBy(x => x.getVlWBPort.getOrElse(VlWB(port = -1)).port).filter(_._1 != -1) 286de8bd1d0Ssinsanction 287de111a36Ssinsanction def hasWakeupFromMem: Boolean = backendParam.allExuParams.filter(x => wakeUpInExuSources.map(_.name).contains(x.name)).map(_.isMemExeUnit).fold(false)(_ | _) 288de111a36Ssinsanction 289de111a36Ssinsanction def hasWakeupFromVf: Boolean = backendParam.allExuParams.filter(x => wakeUpInExuSources.map(_.name).contains(x.name)).map(_.isVfExeUnit).fold(false)(_ | _) 290730cfbc0SXuan Hu 291730cfbc0SXuan Hu def getFuCfgs: Seq[FuConfig] = exuBlockParams.flatMap(_.fuConfigs).distinct 292730cfbc0SXuan Hu 293f7f73727Ssinsanction def deqFuCfgs: Seq[Seq[FuConfig]] = exuBlockParams.map(_.fuConfigs) 294f7f73727Ssinsanction 295f7f73727Ssinsanction def deqFuInterSect: Seq[FuConfig] = if (numDeq == 2) deqFuCfgs(0).intersect(deqFuCfgs(1)) else Seq() 296f7f73727Ssinsanction 297f7f73727Ssinsanction def deqFuSame: Boolean = (numDeq == 2) && deqFuInterSect.length == deqFuCfgs(0).length && deqFuCfgs(0).length == deqFuCfgs(1).length 298f7f73727Ssinsanction 299f7f73727Ssinsanction def deqFuDiff: Boolean = (numDeq == 2) && deqFuInterSect.length == 0 300f7f73727Ssinsanction 301520f7dacSsinsanction def deqImmTypes: Seq[UInt] = getFuCfgs.flatMap(_.immType).distinct 302520f7dacSsinsanction 303520f7dacSsinsanction // set load imm to 32-bit for fused_lui_load 30431386625Ssinsanction def deqImmTypesMaxLen: Int = if (isLdAddrIQ || isHyAddrIQ) 32 else deqImmTypes.map(SelImm.getImmUnion(_)).maxBy(_.len).len 305520f7dacSsinsanction 306520f7dacSsinsanction def needImm: Boolean = deqImmTypes.nonEmpty 307520f7dacSsinsanction 308730cfbc0SXuan Hu // cfgs(exuIdx)(set of exu's wb) 30939c59369SXuan Hu 31039c59369SXuan Hu /** 31139c59369SXuan Hu * Get [[PregWB]] of this IssueBlock 31239c59369SXuan Hu * @return set of [[PregWB]] of [[ExeUnit]] 31339c59369SXuan Hu */ 31439c59369SXuan Hu def getWbCfgs: Seq[Set[PregWB]] = { 315730cfbc0SXuan Hu exuBlockParams.map(exu => exu.wbPortConfigs.toSet) 316730cfbc0SXuan Hu } 317730cfbc0SXuan Hu 318730cfbc0SXuan Hu def canAccept(fuType: UInt): Bool = { 319730cfbc0SXuan Hu Cat(getFuCfgs.map(_.fuType.U === fuType)).orR 320730cfbc0SXuan Hu } 321730cfbc0SXuan Hu 322dd473fffSXuan Hu def bindBackendParam(param: BackendParams): Unit = { 323dd473fffSXuan Hu backendParam = param 324dd473fffSXuan Hu } 325dd473fffSXuan Hu 326acf41503Ssinsanction def wakeUpSourceExuIdx: Seq[Int] = { 327acf41503Ssinsanction wakeUpInExuSources.map(x => backendParam.getExuIdx(x.name)) 328acf41503Ssinsanction } 329acf41503Ssinsanction 330730cfbc0SXuan Hu def genExuInputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuInput]] = { 331730cfbc0SXuan Hu MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuInputBundle))) 332730cfbc0SXuan Hu } 333730cfbc0SXuan Hu 334*0ed0e482SGuanghui Cheng def genExuInputDecoupledCopySrcBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuInput]] = { 335*0ed0e482SGuanghui Cheng MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuInputCopySrcBundle))) 336*0ed0e482SGuanghui Cheng } 337*0ed0e482SGuanghui Cheng 338730cfbc0SXuan Hu def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuOutput]] = { 339670870b3SXuan Hu MixedVec(this.exuParams.map(x => DecoupledIO(x.genExuOutputBundle))) 340730cfbc0SXuan Hu } 341730cfbc0SXuan Hu 342730cfbc0SXuan Hu def genExuOutputValidBundle(implicit p: Parameters): MixedVec[ValidIO[ExuOutput]] = { 343670870b3SXuan Hu MixedVec(this.exuParams.map(x => ValidIO(x.genExuOutputBundle))) 344730cfbc0SXuan Hu } 345730cfbc0SXuan Hu 3465d2b9cadSXuan Hu def genExuBypassValidBundle(implicit p: Parameters): MixedVec[ValidIO[ExuBypassBundle]] = { 347670870b3SXuan Hu MixedVec(this.exuParams.filterNot(_.fakeUnit).map(x => ValidIO(x.genExuBypassBundle))) 3485d2b9cadSXuan Hu } 3495d2b9cadSXuan Hu 350730cfbc0SXuan Hu def genIssueDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[IssueQueueIssueBundle]] = { 351670870b3SXuan Hu MixedVec(exuBlockParams.filterNot(_.fakeUnit).map(x => DecoupledIO(new IssueQueueIssueBundle(this, x)))) 352730cfbc0SXuan Hu } 353730cfbc0SXuan Hu 35452fc0c9fSxiaofeibao-xjtu def genIssueValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIssueBundle]] = { 35552fc0c9fSxiaofeibao-xjtu MixedVec(exuBlockParams.filterNot(_.fakeUnit).map(x => ValidIO(new IssueQueueIssueBundle(this, x)))) 35652fc0c9fSxiaofeibao-xjtu } 35752fc0c9fSxiaofeibao-xjtu 358ec49b127Ssinsanction def genWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 359c0be7f33SXuan Hu val intBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match { 360f39a61a1SzhanglyGit case IntScheduler() | MemScheduler() => needWakeupFromIntWBPort.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 361c0be7f33SXuan Hu case _ => Seq() 362c0be7f33SXuan Hu } 36360f0c5aeSxiaofeibao val fpBundle = schdType match { 36460f0c5aeSxiaofeibao case FpScheduler() | MemScheduler() => needWakeupFromFpWBPort.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 36560f0c5aeSxiaofeibao case _ => Seq() 36660f0c5aeSxiaofeibao } 367c0be7f33SXuan Hu val vfBundle = schdType match { 368f39a61a1SzhanglyGit case VfScheduler() | MemScheduler() => needWakeupFromVfWBPort.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 369c0be7f33SXuan Hu case _ => Seq() 370c0be7f33SXuan Hu } 3718dd32220Ssinsanction val v0Bundle = schdType match { 3728dd32220Ssinsanction case VfScheduler() | MemScheduler() => needWakeupFromV0WBPort.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 3738dd32220Ssinsanction case _ => Seq() 3748dd32220Ssinsanction } 3758dd32220Ssinsanction val vlBundle = schdType match { 3768dd32220Ssinsanction case VfScheduler() | MemScheduler() => needWakeupFromVlWBPort.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 3778dd32220Ssinsanction case _ => Seq() 3788dd32220Ssinsanction } 3798dd32220Ssinsanction MixedVec(intBundle ++ fpBundle ++ vfBundle ++ v0Bundle ++ vlBundle) 380bf35baadSXuan Hu } 381bf35baadSXuan Hu 382c0be7f33SXuan Hu def genIQWakeUpSourceValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = { 3834c5a0d77Sxiaofeibao-xjtu MixedVec(exuBlockParams.map(x => ValidIO(new IssueQueueIQWakeUpBundle(x.exuIdx, backendParam, x.copyWakeupOut, x.copyNum)))) 384c0be7f33SXuan Hu } 385c0be7f33SXuan Hu 386c0be7f33SXuan Hu def genIQWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = { 387c0be7f33SXuan Hu MixedVec(this.wakeUpInExuSources.map(x => ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam)))) 388c0be7f33SXuan Hu } 389c0be7f33SXuan Hu 390730cfbc0SXuan Hu def genOGRespBundle(implicit p: Parameters) = { 391730cfbc0SXuan Hu implicit val issueBlockParams = this 392730cfbc0SXuan Hu MixedVec(exuBlockParams.map(_ => new OGRespBundle)) 393730cfbc0SXuan Hu } 394730cfbc0SXuan Hu 395c38df446SzhanglyGit def genOG2RespBundle(implicit p: Parameters) = { 396c38df446SzhanglyGit implicit val issueBlockParams = this 397c38df446SzhanglyGit MixedVec(exuBlockParams.map(_ => new Valid(new EntryDeqRespBundle))) 398c38df446SzhanglyGit } 399c38df446SzhanglyGit 400e3da8badSTang Haojin def genWbFuBusyTableWriteBundle(implicit p: Parameters) = { 4018d29ec32Sczw implicit val issueBlockParams = this 402dd970561SzhanglyGit MixedVec(exuBlockParams.map(x => new WbFuBusyTableWriteBundle(x))) 4038d29ec32Sczw } 4048d29ec32Sczw 405e3da8badSTang Haojin def genWbFuBusyTableReadBundle(implicit p: Parameters) = { 4068d29ec32Sczw implicit val issueBlockParams = this 4072e0a7dc5Sfdy MixedVec(exuBlockParams.map{ x => 4082e0a7dc5Sfdy new WbFuBusyTableReadBundle(x) 4092e0a7dc5Sfdy }) 4102e0a7dc5Sfdy } 4112e0a7dc5Sfdy 4122e0a7dc5Sfdy def genWbConflictBundle()(implicit p: Parameters) = { 4132e0a7dc5Sfdy implicit val issueBlockParams = this 4142e0a7dc5Sfdy MixedVec(exuBlockParams.map { x => 4152e0a7dc5Sfdy new WbConflictBundle(x) 4162e0a7dc5Sfdy }) 4178d29ec32Sczw } 4188d29ec32Sczw 419730cfbc0SXuan Hu def getIQName = { 420730cfbc0SXuan Hu "IssueQueue" ++ getFuCfgs.map(_.name).distinct.map(_.capitalize).reduce(_ ++ _) 421730cfbc0SXuan Hu } 4220721d1aaSXuan Hu 4230721d1aaSXuan Hu def getEntryName = { 4240721d1aaSXuan Hu "Entries" ++ getFuCfgs.map(_.name).distinct.map(_.capitalize).reduce(_ ++ _) 4250721d1aaSXuan Hu } 426730cfbc0SXuan Hu} 427