1*730cfbc0SXuan Hupackage xiangshan.backend.issue 2*730cfbc0SXuan Hu 3*730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters 4*730cfbc0SXuan Huimport chisel3.util._ 5*730cfbc0SXuan Huimport xiangshan.backend.Bundles.{ExuInput, ExuOutput} 6*730cfbc0SXuan Huimport xiangshan.backend.datapath.WbConfig.WbConfig 7*730cfbc0SXuan Hu 8*730cfbc0SXuan Hucase class SchdBlockParams( 9*730cfbc0SXuan Hu issueBlockParams: Seq[IssueBlockParams], 10*730cfbc0SXuan Hu numPregs : Int, 11*730cfbc0SXuan Hu numRfReadWrite : Option[(Int, Int)], 12*730cfbc0SXuan Hu numDeqOutside : Int, 13*730cfbc0SXuan Hu schdType : SchedulerType, 14*730cfbc0SXuan Hu rfDataWidth : Int, 15*730cfbc0SXuan Hu numUopIn : Int, 16*730cfbc0SXuan Hu) { 17*730cfbc0SXuan Hu def isMemSchd: Boolean = schdType == MemScheduler() 18*730cfbc0SXuan Hu 19*730cfbc0SXuan Hu def isIntSchd: Boolean = schdType == IntScheduler() 20*730cfbc0SXuan Hu 21*730cfbc0SXuan Hu def isVfSchd: Boolean = schdType == VfScheduler() 22*730cfbc0SXuan Hu 23*730cfbc0SXuan Hu def JmpCnt: Int = issueBlockParams.map(_.JmpCnt).sum 24*730cfbc0SXuan Hu 25*730cfbc0SXuan Hu def BrhCnt: Int = issueBlockParams.map(_.BrhCnt).sum 26*730cfbc0SXuan Hu 27*730cfbc0SXuan Hu def I2fCnt: Int = issueBlockParams.map(_.I2fCnt).sum 28*730cfbc0SXuan Hu 29*730cfbc0SXuan Hu def CsrCnt: Int = issueBlockParams.map(_.CsrCnt).sum 30*730cfbc0SXuan Hu 31*730cfbc0SXuan Hu def AluCnt: Int = issueBlockParams.map(_.AluCnt).sum 32*730cfbc0SXuan Hu 33*730cfbc0SXuan Hu def MulCnt: Int = issueBlockParams.map(_.MulCnt).sum 34*730cfbc0SXuan Hu 35*730cfbc0SXuan Hu def DivCnt: Int = issueBlockParams.map(_.DivCnt).sum 36*730cfbc0SXuan Hu 37*730cfbc0SXuan Hu def FenceCnt: Int = issueBlockParams.map(_.FenceCnt).sum 38*730cfbc0SXuan Hu 39*730cfbc0SXuan Hu def BkuCnt: Int = issueBlockParams.map(_.BkuCnt).sum 40*730cfbc0SXuan Hu 41*730cfbc0SXuan Hu def VsetCnt: Int = issueBlockParams.map(_.VsetCnt).sum 42*730cfbc0SXuan Hu 43*730cfbc0SXuan Hu def FmacCnt: Int = issueBlockParams.map(_.FmacCnt).sum 44*730cfbc0SXuan Hu 45*730cfbc0SXuan Hu def FmiscCnt: Int = issueBlockParams.map(_.FmiscCnt).sum 46*730cfbc0SXuan Hu 47*730cfbc0SXuan Hu def FDivSqrtCnt: Int = issueBlockParams.map(_.fDivSqrtCnt).sum 48*730cfbc0SXuan Hu 49*730cfbc0SXuan Hu def LduCnt: Int = issueBlockParams.map(_.LduCnt).sum 50*730cfbc0SXuan Hu 51*730cfbc0SXuan Hu def StaCnt: Int = issueBlockParams.map(_.StaCnt).sum 52*730cfbc0SXuan Hu 53*730cfbc0SXuan Hu def StdCnt: Int = issueBlockParams.map(_.StdCnt).sum 54*730cfbc0SXuan Hu 55*730cfbc0SXuan Hu def MouCnt: Int = issueBlockParams.map(_.MouCnt).sum 56*730cfbc0SXuan Hu 57*730cfbc0SXuan Hu def VipuCnt: Int = issueBlockParams.map(_.VipuCnt).sum 58*730cfbc0SXuan Hu 59*730cfbc0SXuan Hu def VfpuCnt: Int = issueBlockParams.map(_.VfpuCnt).sum 60*730cfbc0SXuan Hu 61*730cfbc0SXuan Hu def VlduCnt: Int = issueBlockParams.map(_.VlduCnt).sum 62*730cfbc0SXuan Hu 63*730cfbc0SXuan Hu def VstuCnt: Int = issueBlockParams.map(_.VstuCnt).sum 64*730cfbc0SXuan Hu 65*730cfbc0SXuan Hu def numExu: Int = issueBlockParams.map(_.exuBlockParams.count(!_.hasStdFu)).sum 66*730cfbc0SXuan Hu 67*730cfbc0SXuan Hu def hasCSR = CsrCnt > 0 68*730cfbc0SXuan Hu 69*730cfbc0SXuan Hu def hasFence = FenceCnt > 0 70*730cfbc0SXuan Hu 71*730cfbc0SXuan Hu def numWriteIntRf: Int = issueBlockParams.map(_.numWriteIntRf).sum 72*730cfbc0SXuan Hu 73*730cfbc0SXuan Hu def numWriteFpRf: Int = issueBlockParams.map(_.numWriteFpRf).sum 74*730cfbc0SXuan Hu 75*730cfbc0SXuan Hu def numWriteVecRf: Int = issueBlockParams.map(_.numWriteVecRf).sum 76*730cfbc0SXuan Hu 77*730cfbc0SXuan Hu def numWriteVfRf: Int = issueBlockParams.map(_.numWriteVfRf).sum 78*730cfbc0SXuan Hu 79*730cfbc0SXuan Hu def numNoDataWB: Int = issueBlockParams.map(_.numNoDataWB).sum 80*730cfbc0SXuan Hu 81*730cfbc0SXuan Hu def numPcReadPort = { 82*730cfbc0SXuan Hu val bjIssueQueues = issueBlockParams.filter(x => (x.JmpCnt + x.BrhCnt + x.FenceCnt) > 0) 83*730cfbc0SXuan Hu if (bjIssueQueues.map(x => x.numEnq).sum > 0) numUopIn else 0 84*730cfbc0SXuan Hu } 85*730cfbc0SXuan Hu 86*730cfbc0SXuan Hu def needSrcFrm: Boolean = issueBlockParams.map(_.needSrcFrm).reduce(_ || _) 87*730cfbc0SXuan Hu 88*730cfbc0SXuan Hu def numRedirect: Int = issueBlockParams.map(_.numRedirect).sum 89*730cfbc0SXuan Hu 90*730cfbc0SXuan Hu def pregIdxWidth: Int = log2Up(numPregs) 91*730cfbc0SXuan Hu 92*730cfbc0SXuan Hu def numWakeupFromWB: Int = schdType match { 93*730cfbc0SXuan Hu case IntScheduler() | VfScheduler() => 8 94*730cfbc0SXuan Hu case MemScheduler() => 16 // Todo 95*730cfbc0SXuan Hu case _ => 0 96*730cfbc0SXuan Hu } 97*730cfbc0SXuan Hu 98*730cfbc0SXuan Hu def numIntRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numIntSrc).sum).sum 99*730cfbc0SXuan Hu 100*730cfbc0SXuan Hu def numVfRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(x => x.numFpSrc + x.numVecSrc).sum).sum 101*730cfbc0SXuan Hu 102*730cfbc0SXuan Hu // Todo: 14R8W 103*730cfbc0SXuan Hu def numIntRfRead: Int = numIntRfReadByExu 104*730cfbc0SXuan Hu 105*730cfbc0SXuan Hu def genExuInputBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = { 106*730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledBundle)) 107*730cfbc0SXuan Hu } 108*730cfbc0SXuan Hu 109*730cfbc0SXuan Hu def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = { 110*730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuOutputDecoupledBundle)) 111*730cfbc0SXuan Hu } 112*730cfbc0SXuan Hu 113*730cfbc0SXuan Hu def genExuOutputValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuOutput]]] = { 114*730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuOutputValidBundle)) 115*730cfbc0SXuan Hu } 116*730cfbc0SXuan Hu 117*730cfbc0SXuan Hu // cfgs(issueIdx)(exuIdx)(set of exu's wb) 118*730cfbc0SXuan Hu def getWbCfgs: Seq[Seq[Set[WbConfig]]] = { 119*730cfbc0SXuan Hu this.issueBlockParams.map(_.getWbCfgs) 120*730cfbc0SXuan Hu } 121*730cfbc0SXuan Hu} 122