1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 3730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters 4730cfbc0SXuan Huimport chisel3.util._ 5730cfbc0SXuan Huimport chisel3._ 6bf35baadSXuan Huimport xiangshan.backend.Bundles.{ExuInput, ExuOutput, IssueQueueIssueBundle, IssueQueueWakeUpBundle, OGRespBundle, WbConflictBundle, WbFuBusyTableReadBundle, WbFuBusyTableWriteBundle} 7bf35baadSXuan Huimport xiangshan.backend.datapath.{WakeUpConfig, WakeUpSource} 8730cfbc0SXuan Huimport xiangshan.backend.datapath.WbConfig.WbConfig 9730cfbc0SXuan Huimport xiangshan.backend.exu.ExeUnitParams 10730cfbc0SXuan Huimport xiangshan.backend.fu.{FuConfig, FuType} 11bf35baadSXuan Huimport utils.SeqUtils 12*dd473fffSXuan Huimport xiangshan.backend.BackendParams 13730cfbc0SXuan Hu 14730cfbc0SXuan Hucase class IssueBlockParams( 15730cfbc0SXuan Hu // top down 16730cfbc0SXuan Hu exuBlockParams : Seq[ExeUnitParams], 17730cfbc0SXuan Hu numEntries : Int, 18730cfbc0SXuan Hu pregBits : Int, 19730cfbc0SXuan Hu numWakeupFromWB : Int, 20bf35baadSXuan Hu numEnq : Int, 21730cfbc0SXuan Hu numDeqOutside : Int = 0, 22730cfbc0SXuan Hu numWakeupFromOthers: Int = 0, 23730cfbc0SXuan Hu XLEN : Int = 64, 24730cfbc0SXuan Hu VLEN : Int = 128, 25730cfbc0SXuan Hu vaddrBits : Int = 39, 26730cfbc0SXuan Hu // calculate in scheduler 279b258a00Sxgkiri var idxInSchBlk : Int = 0, 28730cfbc0SXuan Hu)( 29730cfbc0SXuan Hu implicit 30730cfbc0SXuan Hu val schdType: SchedulerType, 31730cfbc0SXuan Hu) { 32*dd473fffSXuan Hu var backendParam: BackendParams = null 33*dd473fffSXuan Hu 349b258a00Sxgkiri def updateIdx(idx: Int): Unit = { 359b258a00Sxgkiri this.idxInSchBlk = idx 369b258a00Sxgkiri } 379b258a00Sxgkiri 38730cfbc0SXuan Hu def inMemSchd: Boolean = schdType == MemScheduler() 39730cfbc0SXuan Hu 40730cfbc0SXuan Hu def inIntSchd: Boolean = schdType == IntScheduler() 41730cfbc0SXuan Hu 42730cfbc0SXuan Hu def inVfSchd: Boolean = schdType == VfScheduler() 43730cfbc0SXuan Hu 44730cfbc0SXuan Hu def isMemAddrIQ: Boolean = inMemSchd && StdCnt == 0 45730cfbc0SXuan Hu 46730cfbc0SXuan Hu def isLdAddrIQ: Boolean = inMemSchd && LduCnt > 0 47730cfbc0SXuan Hu 48730cfbc0SXuan Hu def isStAddrIQ: Boolean = inMemSchd && StaCnt > 0 49730cfbc0SXuan Hu 50730cfbc0SXuan Hu def numExu: Int = exuBlockParams.length 51730cfbc0SXuan Hu 52730cfbc0SXuan Hu def numIntSrc: Int = exuBlockParams.map(_.numIntSrc).max 53730cfbc0SXuan Hu 54730cfbc0SXuan Hu def numFpSrc: Int = exuBlockParams.map(_.numFpSrc).max 55730cfbc0SXuan Hu 56730cfbc0SXuan Hu def numVecSrc: Int = exuBlockParams.map(_.numVecSrc).max 57730cfbc0SXuan Hu 58730cfbc0SXuan Hu def numVfSrc: Int = exuBlockParams.map(_.numVfSrc).max 59730cfbc0SXuan Hu 60730cfbc0SXuan Hu def numRegSrc: Int = exuBlockParams.map(_.numRegSrc).max 61730cfbc0SXuan Hu 62730cfbc0SXuan Hu def numSrc: Int = exuBlockParams.map(_.numSrc).max 63730cfbc0SXuan Hu 64730cfbc0SXuan Hu def readIntRf: Boolean = numIntSrc > 0 65730cfbc0SXuan Hu 66730cfbc0SXuan Hu def readFpRf: Boolean = numFpSrc > 0 67730cfbc0SXuan Hu 68730cfbc0SXuan Hu def readVecRf: Boolean = numVecSrc > 0 69730cfbc0SXuan Hu 70730cfbc0SXuan Hu def readVfRf: Boolean = numVfSrc > 0 71730cfbc0SXuan Hu 72730cfbc0SXuan Hu def writeIntRf: Boolean = exuBlockParams.map(_.writeIntRf).reduce(_ || _) 73730cfbc0SXuan Hu 74730cfbc0SXuan Hu def writeFpRf: Boolean = exuBlockParams.map(_.writeFpRf).reduce(_ || _) 75730cfbc0SXuan Hu 76730cfbc0SXuan Hu def writeVecRf: Boolean = exuBlockParams.map(_.writeVecRf).reduce(_ || _) 77730cfbc0SXuan Hu 78730cfbc0SXuan Hu def exceptionOut: Seq[Int] = exuBlockParams.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted 79730cfbc0SXuan Hu 80730cfbc0SXuan Hu def hasLoadError: Boolean = exuBlockParams.map(_.hasLoadError).reduce(_ || _) 81730cfbc0SXuan Hu 82730cfbc0SXuan Hu def flushPipe: Boolean = exuBlockParams.map(_.flushPipe).reduce(_ || _) 83730cfbc0SXuan Hu 84730cfbc0SXuan Hu def replayInst: Boolean = exuBlockParams.map(_.replayInst).reduce(_ || _) 85730cfbc0SXuan Hu 86730cfbc0SXuan Hu def trigger: Boolean = exuBlockParams.map(_.trigger).reduce(_ || _) 87730cfbc0SXuan Hu 88730cfbc0SXuan Hu def needExceptionGen: Boolean = exceptionOut.nonEmpty || flushPipe || replayInst || trigger 89730cfbc0SXuan Hu 90730cfbc0SXuan Hu def needPc: Boolean = JmpCnt + BrhCnt + FenceCnt > 0 91730cfbc0SXuan Hu 92730cfbc0SXuan Hu def needSrcFrm: Boolean = exuBlockParams.map(_.needSrcFrm).reduce(_ || _) 93730cfbc0SXuan Hu 94730cfbc0SXuan Hu def numPcReadPort: Int = (if (needPc) 1 else 0) * numEnq 95730cfbc0SXuan Hu 96730cfbc0SXuan Hu def numWriteIntRf: Int = exuBlockParams.count(_.writeIntRf) 97730cfbc0SXuan Hu 98730cfbc0SXuan Hu def numWriteFpRf: Int = exuBlockParams.count(_.writeFpRf) 99730cfbc0SXuan Hu 100730cfbc0SXuan Hu def numWriteVecRf: Int = exuBlockParams.count(_.writeVecRf) 101730cfbc0SXuan Hu 102730cfbc0SXuan Hu def numWriteVfRf: Int = exuBlockParams.count(_.writeVfRf) 103730cfbc0SXuan Hu 104730cfbc0SXuan Hu def numNoDataWB: Int = exuBlockParams.count(_.hasNoDataWB) 105730cfbc0SXuan Hu 106730cfbc0SXuan Hu def dataBitsMax: Int = if (numVecSrc > 0) VLEN else XLEN 107730cfbc0SXuan Hu 108730cfbc0SXuan Hu def numDeq: Int = numDeqOutside + exuBlockParams.length 109730cfbc0SXuan Hu 110730cfbc0SXuan Hu def JmpCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.jmp)).sum 111730cfbc0SXuan Hu 112730cfbc0SXuan Hu def BrhCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.brh)).sum 113730cfbc0SXuan Hu 114730cfbc0SXuan Hu def I2fCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.i2f)).sum 115730cfbc0SXuan Hu 116730cfbc0SXuan Hu def CsrCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.csr)).sum 117730cfbc0SXuan Hu 118730cfbc0SXuan Hu def AluCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.alu)).sum 119730cfbc0SXuan Hu 120730cfbc0SXuan Hu def MulCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mul)).sum 121730cfbc0SXuan Hu 122730cfbc0SXuan Hu def DivCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.div)).sum 123730cfbc0SXuan Hu 124730cfbc0SXuan Hu def FenceCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fence)).sum 125730cfbc0SXuan Hu 126730cfbc0SXuan Hu def BkuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.bku)).sum 127730cfbc0SXuan Hu 128d91483a6Sfdy def VsetCnt: Int = exuBlockParams.map(_.fuConfigs.count(x => x.fuType == FuType.vsetiwi || x.fuType == FuType.vsetiwf || x.fuType == FuType.vsetfwf)).sum 129730cfbc0SXuan Hu 130730cfbc0SXuan Hu def FmacCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmac)).sum 131730cfbc0SXuan Hu 132730cfbc0SXuan Hu def FmiscCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmisc)).sum 133730cfbc0SXuan Hu 134730cfbc0SXuan Hu def fDivSqrtCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fDivSqrt)).sum 135730cfbc0SXuan Hu 136730cfbc0SXuan Hu def LduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "ldu")).sum 137730cfbc0SXuan Hu 138730cfbc0SXuan Hu def StaCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "sta")).sum 139730cfbc0SXuan Hu 140730cfbc0SXuan Hu def MouCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mou)).sum 141730cfbc0SXuan Hu 142730cfbc0SXuan Hu def StdCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "std")).sum 143730cfbc0SXuan Hu 144730cfbc0SXuan Hu def VipuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vipu)).sum 145730cfbc0SXuan Hu 146730cfbc0SXuan Hu def VfpuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vfpu)).sum 147730cfbc0SXuan Hu 148730cfbc0SXuan Hu def VlduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vldu)).sum 149730cfbc0SXuan Hu 150730cfbc0SXuan Hu def VstuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vstu)).sum 151730cfbc0SXuan Hu 152730cfbc0SXuan Hu def numRedirect: Int = exuBlockParams.count(_.hasRedirect) 153730cfbc0SXuan Hu 154bf35baadSXuan Hu def iqWakeUpSourcePairs: Seq[WakeUpConfig] = exuBlockParams.flatMap(_.iqWakeUpSourcePairs) 155bf35baadSXuan Hu 156bf35baadSXuan Hu /** Get exu source wake up 157bf35baadSXuan Hu * @todo replace with 158bf35baadSXuan Hu * exuBlockParams 159bf35baadSXuan Hu * .flatMap(_.iqWakeUpSinkPairs) 160bf35baadSXuan Hu * .map(_.source) 161bf35baadSXuan Hu * .distinctBy(_.name) 162bf35baadSXuan Hu * when xiangshan is updated to 2.13.11 163bf35baadSXuan Hu */ 164bf35baadSXuan Hu def wakeUpInExuSources: Seq[WakeUpSource] = { 165bf35baadSXuan Hu SeqUtils.distinctBy( 166bf35baadSXuan Hu exuBlockParams 167bf35baadSXuan Hu .flatMap(_.iqWakeUpSinkPairs) 168bf35baadSXuan Hu .map(_.source) 169bf35baadSXuan Hu )(_.name) 170bf35baadSXuan Hu } 171bf35baadSXuan Hu 172bf35baadSXuan Hu def wakeUpOutExuSources: Seq[WakeUpSource] = { 173bf35baadSXuan Hu SeqUtils.distinctBy( 174bf35baadSXuan Hu exuBlockParams 175bf35baadSXuan Hu .flatMap(_.iqWakeUpSourcePairs) 176bf35baadSXuan Hu .map(_.source) 177bf35baadSXuan Hu )(_.name) 178bf35baadSXuan Hu } 179bf35baadSXuan Hu 180bf35baadSXuan Hu def wakeUpToExuSinks = exuBlockParams 181bf35baadSXuan Hu .flatMap(_.iqWakeUpSourcePairs) 182bf35baadSXuan Hu .map(_.sink).distinct 183bf35baadSXuan Hu 184bf35baadSXuan Hu def numWakeupFromIQ: Int = wakeUpInExuSources.size 185bf35baadSXuan Hu 186bf35baadSXuan Hu def numAllWakeUp: Int = numWakeupFromWB + numWakeupFromIQ + numWakeupFromOthers 187730cfbc0SXuan Hu 188730cfbc0SXuan Hu def getFuCfgs: Seq[FuConfig] = exuBlockParams.flatMap(_.fuConfigs).distinct 189730cfbc0SXuan Hu 190730cfbc0SXuan Hu // cfgs(exuIdx)(set of exu's wb) 191730cfbc0SXuan Hu def getWbCfgs: Seq[Set[WbConfig]] = { 192730cfbc0SXuan Hu exuBlockParams.map(exu => exu.wbPortConfigs.toSet) 193730cfbc0SXuan Hu } 194730cfbc0SXuan Hu 195730cfbc0SXuan Hu def canAccept(fuType: UInt): Bool = { 196730cfbc0SXuan Hu Cat(getFuCfgs.map(_.fuType.U === fuType)).orR 197730cfbc0SXuan Hu } 198730cfbc0SXuan Hu 199*dd473fffSXuan Hu def bindBackendParam(param: BackendParams): Unit = { 200*dd473fffSXuan Hu backendParam = param 201*dd473fffSXuan Hu } 202*dd473fffSXuan Hu 203730cfbc0SXuan Hu def genExuInputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuInput]] = { 204730cfbc0SXuan Hu MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuInputBundle))) 205730cfbc0SXuan Hu } 206730cfbc0SXuan Hu 207730cfbc0SXuan Hu def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuOutput]] = { 208730cfbc0SXuan Hu MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuOutputBundle))) 209730cfbc0SXuan Hu } 210730cfbc0SXuan Hu 211730cfbc0SXuan Hu def genExuOutputValidBundle(implicit p: Parameters): MixedVec[ValidIO[ExuOutput]] = { 212730cfbc0SXuan Hu MixedVec(this.exuBlockParams.map(x => ValidIO(x.genExuOutputBundle))) 213730cfbc0SXuan Hu } 214730cfbc0SXuan Hu 215730cfbc0SXuan Hu def genIssueDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[IssueQueueIssueBundle]] = { 216730cfbc0SXuan Hu MixedVec(exuBlockParams.map(x => DecoupledIO(new IssueQueueIssueBundle(this, x, pregBits, vaddrBits)))) 217730cfbc0SXuan Hu } 218730cfbc0SXuan Hu 219bf35baadSXuan Hu def genWakeUpSourceValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWakeUpBundle]] = { 220*dd473fffSXuan Hu MixedVec(exuBlockParams.map(x => ValidIO(new IssueQueueWakeUpBundle(x.name, backendParam)))) 221bf35baadSXuan Hu } 222bf35baadSXuan Hu 223bf35baadSXuan Hu def genWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWakeUpBundle]] = { 224*dd473fffSXuan Hu MixedVec(this.wakeUpInExuSources.map(x => ValidIO(new IssueQueueWakeUpBundle(x.name, backendParam)))) 225bf35baadSXuan Hu } 226bf35baadSXuan Hu 227730cfbc0SXuan Hu def genOGRespBundle(implicit p: Parameters) = { 228730cfbc0SXuan Hu implicit val issueBlockParams = this 229730cfbc0SXuan Hu MixedVec(exuBlockParams.map(_ => new OGRespBundle)) 230730cfbc0SXuan Hu } 231730cfbc0SXuan Hu 232dd970561SzhanglyGit def genWbFuBusyTableWriteBundle()(implicit p: Parameters) = { 2338d29ec32Sczw implicit val issueBlockParams = this 234dd970561SzhanglyGit MixedVec(exuBlockParams.map(x => new WbFuBusyTableWriteBundle(x))) 2358d29ec32Sczw } 2368d29ec32Sczw 2372e0a7dc5Sfdy def genWbFuBusyTableReadBundle()(implicit p: Parameters) = { 2388d29ec32Sczw implicit val issueBlockParams = this 2392e0a7dc5Sfdy MixedVec(exuBlockParams.map{ x => 2402e0a7dc5Sfdy new WbFuBusyTableReadBundle(x) 2412e0a7dc5Sfdy }) 2422e0a7dc5Sfdy } 2432e0a7dc5Sfdy 2442e0a7dc5Sfdy def genWbConflictBundle()(implicit p: Parameters) = { 2452e0a7dc5Sfdy implicit val issueBlockParams = this 2462e0a7dc5Sfdy MixedVec(exuBlockParams.map { x => 2472e0a7dc5Sfdy new WbConflictBundle(x) 2482e0a7dc5Sfdy }) 2498d29ec32Sczw } 2508d29ec32Sczw 251730cfbc0SXuan Hu def getIQName = { 252730cfbc0SXuan Hu "IssueQueue" ++ getFuCfgs.map(_.name).distinct.map(_.capitalize).reduce(_ ++ _) 253730cfbc0SXuan Hu } 254730cfbc0SXuan Hu} 255