1*730cfbc0SXuan Hupackage xiangshan.backend.issue 2*730cfbc0SXuan Hu 3*730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters 4*730cfbc0SXuan Huimport chisel3.util._ 5*730cfbc0SXuan Huimport chisel3._ 6*730cfbc0SXuan Huimport xiangshan.backend.Bundles.{ExuInput, ExuOutput, IssueQueueIssueBundle, OGRespBundle} 7*730cfbc0SXuan Huimport xiangshan.backend.datapath.WbConfig.WbConfig 8*730cfbc0SXuan Huimport xiangshan.backend.exu.ExeUnitParams 9*730cfbc0SXuan Huimport xiangshan.backend.fu.{FuConfig, FuType} 10*730cfbc0SXuan Hu 11*730cfbc0SXuan Hucase class IssueBlockParams( 12*730cfbc0SXuan Hu // top down 13*730cfbc0SXuan Hu exuBlockParams : Seq[ExeUnitParams], 14*730cfbc0SXuan Hu numEntries : Int, 15*730cfbc0SXuan Hu pregBits : Int, 16*730cfbc0SXuan Hu numWakeupFromWB : Int, 17*730cfbc0SXuan Hu numDeqOutside : Int = 0, 18*730cfbc0SXuan Hu numWakeupFromOthers: Int = 0, 19*730cfbc0SXuan Hu XLEN : Int = 64, 20*730cfbc0SXuan Hu VLEN : Int = 128, 21*730cfbc0SXuan Hu vaddrBits : Int = 39, 22*730cfbc0SXuan Hu // calculate in scheduler 23*730cfbc0SXuan Hu var numEnq : Int = 0, 24*730cfbc0SXuan Hu var numWakeupFromIQ: Int = 0, 25*730cfbc0SXuan Hu)( 26*730cfbc0SXuan Hu implicit 27*730cfbc0SXuan Hu // top down 28*730cfbc0SXuan Hu val schdType: SchedulerType, 29*730cfbc0SXuan Hu) { 30*730cfbc0SXuan Hu def inMemSchd: Boolean = schdType == MemScheduler() 31*730cfbc0SXuan Hu 32*730cfbc0SXuan Hu def inIntSchd: Boolean = schdType == IntScheduler() 33*730cfbc0SXuan Hu 34*730cfbc0SXuan Hu def inVfSchd: Boolean = schdType == VfScheduler() 35*730cfbc0SXuan Hu 36*730cfbc0SXuan Hu def isMemAddrIQ: Boolean = inMemSchd && StdCnt == 0 37*730cfbc0SXuan Hu 38*730cfbc0SXuan Hu def isLdAddrIQ: Boolean = inMemSchd && LduCnt > 0 39*730cfbc0SXuan Hu 40*730cfbc0SXuan Hu def isStAddrIQ: Boolean = inMemSchd && StaCnt > 0 41*730cfbc0SXuan Hu 42*730cfbc0SXuan Hu def numExu: Int = exuBlockParams.length 43*730cfbc0SXuan Hu 44*730cfbc0SXuan Hu def numIntSrc: Int = exuBlockParams.map(_.numIntSrc).max 45*730cfbc0SXuan Hu 46*730cfbc0SXuan Hu def numFpSrc: Int = exuBlockParams.map(_.numFpSrc).max 47*730cfbc0SXuan Hu 48*730cfbc0SXuan Hu def numVecSrc: Int = exuBlockParams.map(_.numVecSrc).max 49*730cfbc0SXuan Hu 50*730cfbc0SXuan Hu def numVfSrc: Int = exuBlockParams.map(_.numVfSrc).max 51*730cfbc0SXuan Hu 52*730cfbc0SXuan Hu def numRegSrc: Int = exuBlockParams.map(_.numRegSrc).max 53*730cfbc0SXuan Hu 54*730cfbc0SXuan Hu def numSrc: Int = exuBlockParams.map(_.numSrc).max 55*730cfbc0SXuan Hu 56*730cfbc0SXuan Hu def readIntRf: Boolean = numIntSrc > 0 57*730cfbc0SXuan Hu 58*730cfbc0SXuan Hu def readFpRf: Boolean = numFpSrc > 0 59*730cfbc0SXuan Hu 60*730cfbc0SXuan Hu def readVecRf: Boolean = numVecSrc > 0 61*730cfbc0SXuan Hu 62*730cfbc0SXuan Hu def readVfRf: Boolean = numVfSrc > 0 63*730cfbc0SXuan Hu 64*730cfbc0SXuan Hu def writeIntRf: Boolean = exuBlockParams.map(_.writeIntRf).reduce(_ || _) 65*730cfbc0SXuan Hu 66*730cfbc0SXuan Hu def writeFpRf: Boolean = exuBlockParams.map(_.writeFpRf).reduce(_ || _) 67*730cfbc0SXuan Hu 68*730cfbc0SXuan Hu def writeVecRf: Boolean = exuBlockParams.map(_.writeVecRf).reduce(_ || _) 69*730cfbc0SXuan Hu 70*730cfbc0SXuan Hu def exceptionOut: Seq[Int] = exuBlockParams.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted 71*730cfbc0SXuan Hu 72*730cfbc0SXuan Hu def hasLoadError: Boolean = exuBlockParams.map(_.hasLoadError).reduce(_ || _) 73*730cfbc0SXuan Hu 74*730cfbc0SXuan Hu def flushPipe: Boolean = exuBlockParams.map(_.flushPipe).reduce(_ || _) 75*730cfbc0SXuan Hu 76*730cfbc0SXuan Hu def replayInst: Boolean = exuBlockParams.map(_.replayInst).reduce(_ || _) 77*730cfbc0SXuan Hu 78*730cfbc0SXuan Hu def trigger: Boolean = exuBlockParams.map(_.trigger).reduce(_ || _) 79*730cfbc0SXuan Hu 80*730cfbc0SXuan Hu def needExceptionGen: Boolean = exceptionOut.nonEmpty || flushPipe || replayInst || trigger 81*730cfbc0SXuan Hu 82*730cfbc0SXuan Hu def needPc: Boolean = JmpCnt + BrhCnt + FenceCnt > 0 83*730cfbc0SXuan Hu 84*730cfbc0SXuan Hu def needSrcFrm: Boolean = exuBlockParams.map(_.needSrcFrm).reduce(_ || _) 85*730cfbc0SXuan Hu 86*730cfbc0SXuan Hu def numPcReadPort: Int = (if (needPc) 1 else 0) * numEnq 87*730cfbc0SXuan Hu 88*730cfbc0SXuan Hu def numWriteIntRf: Int = exuBlockParams.count(_.writeIntRf) 89*730cfbc0SXuan Hu 90*730cfbc0SXuan Hu def numWriteFpRf: Int = exuBlockParams.count(_.writeFpRf) 91*730cfbc0SXuan Hu 92*730cfbc0SXuan Hu def numWriteVecRf: Int = exuBlockParams.count(_.writeVecRf) 93*730cfbc0SXuan Hu 94*730cfbc0SXuan Hu def numWriteVfRf: Int = exuBlockParams.count(_.writeVfRf) 95*730cfbc0SXuan Hu 96*730cfbc0SXuan Hu def numNoDataWB: Int = exuBlockParams.count(_.hasNoDataWB) 97*730cfbc0SXuan Hu 98*730cfbc0SXuan Hu def numRegSrcMax: Int = numIntSrc max numFpSrc max numVecSrc 99*730cfbc0SXuan Hu 100*730cfbc0SXuan Hu def dataBitsMax: Int = if (numVecSrc > 0) VLEN else XLEN 101*730cfbc0SXuan Hu 102*730cfbc0SXuan Hu def numDeq: Int = numDeqOutside + exuBlockParams.length 103*730cfbc0SXuan Hu 104*730cfbc0SXuan Hu def JmpCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.jmp)).sum 105*730cfbc0SXuan Hu 106*730cfbc0SXuan Hu def BrhCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.brh)).sum 107*730cfbc0SXuan Hu 108*730cfbc0SXuan Hu def I2fCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.i2f)).sum 109*730cfbc0SXuan Hu 110*730cfbc0SXuan Hu def CsrCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.csr)).sum 111*730cfbc0SXuan Hu 112*730cfbc0SXuan Hu def AluCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.alu)).sum 113*730cfbc0SXuan Hu 114*730cfbc0SXuan Hu def MulCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mul)).sum 115*730cfbc0SXuan Hu 116*730cfbc0SXuan Hu def DivCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.div)).sum 117*730cfbc0SXuan Hu 118*730cfbc0SXuan Hu def FenceCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fence)).sum 119*730cfbc0SXuan Hu 120*730cfbc0SXuan Hu def BkuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.bku)).sum 121*730cfbc0SXuan Hu 122*730cfbc0SXuan Hu def VsetCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vset)).sum 123*730cfbc0SXuan Hu 124*730cfbc0SXuan Hu def FmacCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmac)).sum 125*730cfbc0SXuan Hu 126*730cfbc0SXuan Hu def FmiscCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fmisc)).sum 127*730cfbc0SXuan Hu 128*730cfbc0SXuan Hu def fDivSqrtCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.fDivSqrt)).sum 129*730cfbc0SXuan Hu 130*730cfbc0SXuan Hu def LduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "ldu")).sum 131*730cfbc0SXuan Hu 132*730cfbc0SXuan Hu def StaCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "sta")).sum 133*730cfbc0SXuan Hu 134*730cfbc0SXuan Hu def MouCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.mou)).sum 135*730cfbc0SXuan Hu 136*730cfbc0SXuan Hu def StdCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.name == "std")).sum 137*730cfbc0SXuan Hu 138*730cfbc0SXuan Hu def VipuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vipu)).sum 139*730cfbc0SXuan Hu 140*730cfbc0SXuan Hu def VfpuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vfpu)).sum 141*730cfbc0SXuan Hu 142*730cfbc0SXuan Hu def VlduCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vldu)).sum 143*730cfbc0SXuan Hu 144*730cfbc0SXuan Hu def VstuCnt: Int = exuBlockParams.map(_.fuConfigs.count(_.fuType == FuType.vstu)).sum 145*730cfbc0SXuan Hu 146*730cfbc0SXuan Hu def numRedirect: Int = exuBlockParams.count(_.hasRedirect) 147*730cfbc0SXuan Hu 148*730cfbc0SXuan Hu def numAllWakeUp = numWakeupFromWB + numWakeupFromIQ + numWakeupFromOthers 149*730cfbc0SXuan Hu 150*730cfbc0SXuan Hu def getFuCfgs: Seq[FuConfig] = exuBlockParams.flatMap(_.fuConfigs).distinct 151*730cfbc0SXuan Hu 152*730cfbc0SXuan Hu // cfgs(exuIdx)(set of exu's wb) 153*730cfbc0SXuan Hu def getWbCfgs: Seq[Set[WbConfig]] = { 154*730cfbc0SXuan Hu exuBlockParams.map(exu => exu.wbPortConfigs.toSet) 155*730cfbc0SXuan Hu } 156*730cfbc0SXuan Hu 157*730cfbc0SXuan Hu def canAccept(fuType: UInt): Bool = { 158*730cfbc0SXuan Hu Cat(getFuCfgs.map(_.fuType.U === fuType)).orR 159*730cfbc0SXuan Hu } 160*730cfbc0SXuan Hu 161*730cfbc0SXuan Hu def genExuInputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuInput]] = { 162*730cfbc0SXuan Hu MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuInputBundle))) 163*730cfbc0SXuan Hu } 164*730cfbc0SXuan Hu 165*730cfbc0SXuan Hu def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[ExuOutput]] = { 166*730cfbc0SXuan Hu MixedVec(this.exuBlockParams.map(x => DecoupledIO(x.genExuOutputBundle))) 167*730cfbc0SXuan Hu } 168*730cfbc0SXuan Hu 169*730cfbc0SXuan Hu def genExuOutputValidBundle(implicit p: Parameters): MixedVec[ValidIO[ExuOutput]] = { 170*730cfbc0SXuan Hu MixedVec(this.exuBlockParams.map(x => ValidIO(x.genExuOutputBundle))) 171*730cfbc0SXuan Hu } 172*730cfbc0SXuan Hu 173*730cfbc0SXuan Hu def genIssueDecoupledBundle(implicit p: Parameters): MixedVec[DecoupledIO[IssueQueueIssueBundle]] = { 174*730cfbc0SXuan Hu MixedVec(exuBlockParams.map(x => DecoupledIO(new IssueQueueIssueBundle(this, x, pregBits, vaddrBits)))) 175*730cfbc0SXuan Hu } 176*730cfbc0SXuan Hu 177*730cfbc0SXuan Hu def genOGRespBundle(implicit p: Parameters) = { 178*730cfbc0SXuan Hu implicit val issueBlockParams = this 179*730cfbc0SXuan Hu MixedVec(exuBlockParams.map(_ => new OGRespBundle)) 180*730cfbc0SXuan Hu } 181*730cfbc0SXuan Hu 182*730cfbc0SXuan Hu def getIQName = { 183*730cfbc0SXuan Hu "IssueQueue" ++ getFuCfgs.map(_.name).distinct.map(_.capitalize).reduce(_ ++ _) 184*730cfbc0SXuan Hu } 185*730cfbc0SXuan Hu} 186