1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 3730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters 4730cfbc0SXuan Huimport chisel3.util._ 5bf35baadSXuan Huimport utils.SeqUtils 6*dd473fffSXuan Huimport xiangshan.backend.BackendParams 7bf35baadSXuan Huimport xiangshan.backend.Bundles.{ExuInput, ExuOutput, IssueQueueWakeUpBundle} 8bf35baadSXuan Huimport xiangshan.backend.datapath.WakeUpSource 9730cfbc0SXuan Huimport xiangshan.backend.datapath.WbConfig.WbConfig 10730cfbc0SXuan Hu 11730cfbc0SXuan Hucase class SchdBlockParams( 12730cfbc0SXuan Hu issueBlockParams: Seq[IssueBlockParams], 13730cfbc0SXuan Hu numPregs : Int, 14730cfbc0SXuan Hu numRfReadWrite : Option[(Int, Int)], 15730cfbc0SXuan Hu numDeqOutside : Int, 16730cfbc0SXuan Hu schdType : SchedulerType, 17730cfbc0SXuan Hu rfDataWidth : Int, 18730cfbc0SXuan Hu numUopIn : Int, 19730cfbc0SXuan Hu) { 20*dd473fffSXuan Hu var backendParam: BackendParams = null 21*dd473fffSXuan Hu 22730cfbc0SXuan Hu def isMemSchd: Boolean = schdType == MemScheduler() 23730cfbc0SXuan Hu 24730cfbc0SXuan Hu def isIntSchd: Boolean = schdType == IntScheduler() 25730cfbc0SXuan Hu 26730cfbc0SXuan Hu def isVfSchd: Boolean = schdType == VfScheduler() 27730cfbc0SXuan Hu 28730cfbc0SXuan Hu def JmpCnt: Int = issueBlockParams.map(_.JmpCnt).sum 29730cfbc0SXuan Hu 30730cfbc0SXuan Hu def BrhCnt: Int = issueBlockParams.map(_.BrhCnt).sum 31730cfbc0SXuan Hu 32730cfbc0SXuan Hu def I2fCnt: Int = issueBlockParams.map(_.I2fCnt).sum 33730cfbc0SXuan Hu 34730cfbc0SXuan Hu def CsrCnt: Int = issueBlockParams.map(_.CsrCnt).sum 35730cfbc0SXuan Hu 36730cfbc0SXuan Hu def AluCnt: Int = issueBlockParams.map(_.AluCnt).sum 37730cfbc0SXuan Hu 38730cfbc0SXuan Hu def MulCnt: Int = issueBlockParams.map(_.MulCnt).sum 39730cfbc0SXuan Hu 40730cfbc0SXuan Hu def DivCnt: Int = issueBlockParams.map(_.DivCnt).sum 41730cfbc0SXuan Hu 42730cfbc0SXuan Hu def FenceCnt: Int = issueBlockParams.map(_.FenceCnt).sum 43730cfbc0SXuan Hu 44730cfbc0SXuan Hu def BkuCnt: Int = issueBlockParams.map(_.BkuCnt).sum 45730cfbc0SXuan Hu 46730cfbc0SXuan Hu def VsetCnt: Int = issueBlockParams.map(_.VsetCnt).sum 47730cfbc0SXuan Hu 48730cfbc0SXuan Hu def FmacCnt: Int = issueBlockParams.map(_.FmacCnt).sum 49730cfbc0SXuan Hu 50730cfbc0SXuan Hu def FmiscCnt: Int = issueBlockParams.map(_.FmiscCnt).sum 51730cfbc0SXuan Hu 52730cfbc0SXuan Hu def FDivSqrtCnt: Int = issueBlockParams.map(_.fDivSqrtCnt).sum 53730cfbc0SXuan Hu 54730cfbc0SXuan Hu def LduCnt: Int = issueBlockParams.map(_.LduCnt).sum 55730cfbc0SXuan Hu 56730cfbc0SXuan Hu def StaCnt: Int = issueBlockParams.map(_.StaCnt).sum 57730cfbc0SXuan Hu 58730cfbc0SXuan Hu def StdCnt: Int = issueBlockParams.map(_.StdCnt).sum 59730cfbc0SXuan Hu 60730cfbc0SXuan Hu def MouCnt: Int = issueBlockParams.map(_.MouCnt).sum 61730cfbc0SXuan Hu 62730cfbc0SXuan Hu def VipuCnt: Int = issueBlockParams.map(_.VipuCnt).sum 63730cfbc0SXuan Hu 64730cfbc0SXuan Hu def VfpuCnt: Int = issueBlockParams.map(_.VfpuCnt).sum 65730cfbc0SXuan Hu 66730cfbc0SXuan Hu def VlduCnt: Int = issueBlockParams.map(_.VlduCnt).sum 67730cfbc0SXuan Hu 68730cfbc0SXuan Hu def VstuCnt: Int = issueBlockParams.map(_.VstuCnt).sum 69730cfbc0SXuan Hu 70730cfbc0SXuan Hu def numExu: Int = issueBlockParams.map(_.exuBlockParams.count(!_.hasStdFu)).sum 71730cfbc0SXuan Hu 72730cfbc0SXuan Hu def hasCSR = CsrCnt > 0 73730cfbc0SXuan Hu 74730cfbc0SXuan Hu def hasFence = FenceCnt > 0 75730cfbc0SXuan Hu 76730cfbc0SXuan Hu def numWriteIntRf: Int = issueBlockParams.map(_.numWriteIntRf).sum 77730cfbc0SXuan Hu 78730cfbc0SXuan Hu def numWriteFpRf: Int = issueBlockParams.map(_.numWriteFpRf).sum 79730cfbc0SXuan Hu 80730cfbc0SXuan Hu def numWriteVecRf: Int = issueBlockParams.map(_.numWriteVecRf).sum 81730cfbc0SXuan Hu 82730cfbc0SXuan Hu def numWriteVfRf: Int = issueBlockParams.map(_.numWriteVfRf).sum 83730cfbc0SXuan Hu 84730cfbc0SXuan Hu def numNoDataWB: Int = issueBlockParams.map(_.numNoDataWB).sum 85730cfbc0SXuan Hu 86730cfbc0SXuan Hu def numPcReadPort = { 87730cfbc0SXuan Hu val bjIssueQueues = issueBlockParams.filter(x => (x.JmpCnt + x.BrhCnt + x.FenceCnt) > 0) 88730cfbc0SXuan Hu if (bjIssueQueues.map(x => x.numEnq).sum > 0) numUopIn else 0 89730cfbc0SXuan Hu } 90730cfbc0SXuan Hu 91730cfbc0SXuan Hu def needSrcFrm: Boolean = issueBlockParams.map(_.needSrcFrm).reduce(_ || _) 92730cfbc0SXuan Hu 93730cfbc0SXuan Hu def numRedirect: Int = issueBlockParams.map(_.numRedirect).sum 94730cfbc0SXuan Hu 95730cfbc0SXuan Hu def pregIdxWidth: Int = log2Up(numPregs) 96730cfbc0SXuan Hu 97730cfbc0SXuan Hu def numWakeupFromWB: Int = schdType match { 98730cfbc0SXuan Hu case IntScheduler() | VfScheduler() => 8 99730cfbc0SXuan Hu case MemScheduler() => 16 // Todo 100730cfbc0SXuan Hu case _ => 0 101730cfbc0SXuan Hu } 102730cfbc0SXuan Hu 103730cfbc0SXuan Hu def numIntRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numIntSrc).sum).sum 104730cfbc0SXuan Hu 105730cfbc0SXuan Hu def numVfRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(x => x.numFpSrc + x.numVecSrc).sum).sum 106730cfbc0SXuan Hu 107730cfbc0SXuan Hu // Todo: 14R8W 108730cfbc0SXuan Hu def numIntRfRead: Int = numIntRfReadByExu 109730cfbc0SXuan Hu 110*dd473fffSXuan Hu def bindBackendParam(param: BackendParams): Unit = { 111*dd473fffSXuan Hu backendParam = param 112*dd473fffSXuan Hu } 113*dd473fffSXuan Hu 114730cfbc0SXuan Hu def genExuInputBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = { 115730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledBundle)) 116730cfbc0SXuan Hu } 117730cfbc0SXuan Hu 118730cfbc0SXuan Hu def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = { 119730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuOutputDecoupledBundle)) 120730cfbc0SXuan Hu } 121730cfbc0SXuan Hu 122730cfbc0SXuan Hu def genExuOutputValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuOutput]]] = { 123730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuOutputValidBundle)) 124730cfbc0SXuan Hu } 125730cfbc0SXuan Hu 126bf35baadSXuan Hu def wakeUpInExuSources: Seq[WakeUpSource] = { 127bf35baadSXuan Hu SeqUtils.distinctBy( 128bf35baadSXuan Hu issueBlockParams 129bf35baadSXuan Hu .flatMap(_.wakeUpInExuSources) 130bf35baadSXuan Hu )(_.name) 131bf35baadSXuan Hu } 132bf35baadSXuan Hu 133bf35baadSXuan Hu def wakeUpOutExuSources: Seq[WakeUpSource] = { 134bf35baadSXuan Hu SeqUtils.distinctBy( 135bf35baadSXuan Hu issueBlockParams 136bf35baadSXuan Hu .flatMap(_.wakeUpOutExuSources) 137bf35baadSXuan Hu )(_.name) 138bf35baadSXuan Hu } 139bf35baadSXuan Hu 140bf35baadSXuan Hu def genWakeUpInValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWakeUpBundle]] = { 141*dd473fffSXuan Hu MixedVec(this.wakeUpInExuSources.map(x => ValidIO(new IssueQueueWakeUpBundle(x.name, backendParam)))) 142bf35baadSXuan Hu } 143bf35baadSXuan Hu 144bf35baadSXuan Hu def genWakeUpOutValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWakeUpBundle]] = { 145*dd473fffSXuan Hu MixedVec(this.wakeUpOutExuSources.map(x => ValidIO(new IssueQueueWakeUpBundle(x.name, backendParam)))) 146bf35baadSXuan Hu } 147bf35baadSXuan Hu 148730cfbc0SXuan Hu // cfgs(issueIdx)(exuIdx)(set of exu's wb) 149730cfbc0SXuan Hu def getWbCfgs: Seq[Seq[Set[WbConfig]]] = { 150730cfbc0SXuan Hu this.issueBlockParams.map(_.getWbCfgs) 151730cfbc0SXuan Hu } 152730cfbc0SXuan Hu} 153