1730cfbc0SXuan Hupackage xiangshan.backend.issue 2730cfbc0SXuan Hu 383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters 4730cfbc0SXuan Huimport chisel3.util._ 5bf35baadSXuan Huimport utils.SeqUtils 6dd473fffSXuan Huimport xiangshan.backend.BackendParams 710fe9778SXuan Huimport xiangshan.backend.Bundles._ 8bf35baadSXuan Huimport xiangshan.backend.datapath.WakeUpSource 939c59369SXuan Huimport xiangshan.backend.datapath.WbConfig.PregWB 10730cfbc0SXuan Hu 11730cfbc0SXuan Hucase class SchdBlockParams( 12730cfbc0SXuan Hu issueBlockParams: Seq[IssueBlockParams], 13730cfbc0SXuan Hu numPregs : Int, 14730cfbc0SXuan Hu numDeqOutside : Int, 15730cfbc0SXuan Hu schdType : SchedulerType, 16730cfbc0SXuan Hu rfDataWidth : Int, 17730cfbc0SXuan Hu numUopIn : Int, 18730cfbc0SXuan Hu) { 19dd473fffSXuan Hu var backendParam: BackendParams = null 20dd473fffSXuan Hu 21730cfbc0SXuan Hu def isMemSchd: Boolean = schdType == MemScheduler() 22730cfbc0SXuan Hu 23730cfbc0SXuan Hu def isIntSchd: Boolean = schdType == IntScheduler() 24730cfbc0SXuan Hu 25730cfbc0SXuan Hu def isVfSchd: Boolean = schdType == VfScheduler() 26730cfbc0SXuan Hu 27730cfbc0SXuan Hu def JmpCnt: Int = issueBlockParams.map(_.JmpCnt).sum 28730cfbc0SXuan Hu 29730cfbc0SXuan Hu def BrhCnt: Int = issueBlockParams.map(_.BrhCnt).sum 30730cfbc0SXuan Hu 31730cfbc0SXuan Hu def I2fCnt: Int = issueBlockParams.map(_.I2fCnt).sum 32730cfbc0SXuan Hu 33730cfbc0SXuan Hu def CsrCnt: Int = issueBlockParams.map(_.CsrCnt).sum 34730cfbc0SXuan Hu 35730cfbc0SXuan Hu def AluCnt: Int = issueBlockParams.map(_.AluCnt).sum 36730cfbc0SXuan Hu 37730cfbc0SXuan Hu def MulCnt: Int = issueBlockParams.map(_.MulCnt).sum 38730cfbc0SXuan Hu 39730cfbc0SXuan Hu def DivCnt: Int = issueBlockParams.map(_.DivCnt).sum 40730cfbc0SXuan Hu 41730cfbc0SXuan Hu def FenceCnt: Int = issueBlockParams.map(_.FenceCnt).sum 42730cfbc0SXuan Hu 43730cfbc0SXuan Hu def BkuCnt: Int = issueBlockParams.map(_.BkuCnt).sum 44730cfbc0SXuan Hu 45730cfbc0SXuan Hu def VsetCnt: Int = issueBlockParams.map(_.VsetCnt).sum 46730cfbc0SXuan Hu 47730cfbc0SXuan Hu def FmacCnt: Int = issueBlockParams.map(_.FmacCnt).sum 48730cfbc0SXuan Hu 49730cfbc0SXuan Hu def FmiscCnt: Int = issueBlockParams.map(_.FmiscCnt).sum 50730cfbc0SXuan Hu 51730cfbc0SXuan Hu def FDivSqrtCnt: Int = issueBlockParams.map(_.fDivSqrtCnt).sum 52730cfbc0SXuan Hu 53730cfbc0SXuan Hu def LduCnt: Int = issueBlockParams.map(_.LduCnt).sum 54730cfbc0SXuan Hu 55730cfbc0SXuan Hu def StaCnt: Int = issueBlockParams.map(_.StaCnt).sum 56730cfbc0SXuan Hu 57730cfbc0SXuan Hu def StdCnt: Int = issueBlockParams.map(_.StdCnt).sum 58730cfbc0SXuan Hu 59730cfbc0SXuan Hu def MouCnt: Int = issueBlockParams.map(_.MouCnt).sum 60730cfbc0SXuan Hu 61b133b458SXuan Hu def HyuCnt: Int = issueBlockParams.map(_.HyuCnt).sum 62b133b458SXuan Hu 63596af5d2SHaojin Tang def LdExuCnt: Int = issueBlockParams.map(_.LdExuCnt).sum 64596af5d2SHaojin Tang 65730cfbc0SXuan Hu def VipuCnt: Int = issueBlockParams.map(_.VipuCnt).sum 66730cfbc0SXuan Hu 67730cfbc0SXuan Hu def VfpuCnt: Int = issueBlockParams.map(_.VfpuCnt).sum 68730cfbc0SXuan Hu 69730cfbc0SXuan Hu def VlduCnt: Int = issueBlockParams.map(_.VlduCnt).sum 70730cfbc0SXuan Hu 71730cfbc0SXuan Hu def VstuCnt: Int = issueBlockParams.map(_.VstuCnt).sum 72730cfbc0SXuan Hu 73670870b3SXuan Hu def numExu: Int = issueBlockParams.map(_.exuBlockParams.count(!_.fakeUnit)).sum 74730cfbc0SXuan Hu 75730cfbc0SXuan Hu def hasCSR = CsrCnt > 0 76730cfbc0SXuan Hu 77730cfbc0SXuan Hu def hasFence = FenceCnt > 0 78730cfbc0SXuan Hu 79730cfbc0SXuan Hu def numWriteIntRf: Int = issueBlockParams.map(_.numWriteIntRf).sum 80730cfbc0SXuan Hu 81730cfbc0SXuan Hu def numWriteFpRf: Int = issueBlockParams.map(_.numWriteFpRf).sum 82730cfbc0SXuan Hu 83730cfbc0SXuan Hu def numWriteVecRf: Int = issueBlockParams.map(_.numWriteVecRf).sum 84730cfbc0SXuan Hu 85730cfbc0SXuan Hu def numWriteVfRf: Int = issueBlockParams.map(_.numWriteVfRf).sum 86730cfbc0SXuan Hu 87730cfbc0SXuan Hu def numNoDataWB: Int = issueBlockParams.map(_.numNoDataWB).sum 88730cfbc0SXuan Hu 89730cfbc0SXuan Hu def numPcReadPort = { 90730cfbc0SXuan Hu val bjIssueQueues = issueBlockParams.filter(x => (x.JmpCnt + x.BrhCnt + x.FenceCnt) > 0) 91730cfbc0SXuan Hu if (bjIssueQueues.map(x => x.numEnq).sum > 0) numUopIn else 0 92730cfbc0SXuan Hu } 93730cfbc0SXuan Hu 94730cfbc0SXuan Hu def needSrcFrm: Boolean = issueBlockParams.map(_.needSrcFrm).reduce(_ || _) 95730cfbc0SXuan Hu 9617985fbbSZiyue Zhang def needSrcVxrm: Boolean = issueBlockParams.map(_.needSrcVxrm).reduce(_ || _) 9717985fbbSZiyue Zhang 987e4f0b19SZiyue-Zhang def writeVType: Boolean = issueBlockParams.map(_.writeVType).reduce(_ || _) 997e4f0b19SZiyue-Zhang 100730cfbc0SXuan Hu def numRedirect: Int = issueBlockParams.map(_.numRedirect).sum 101730cfbc0SXuan Hu 102730cfbc0SXuan Hu def pregIdxWidth: Int = log2Up(numPregs) 103730cfbc0SXuan Hu 104730cfbc0SXuan Hu def numWakeupFromWB: Int = schdType match { 105730cfbc0SXuan Hu case IntScheduler() | VfScheduler() => 8 106730cfbc0SXuan Hu case MemScheduler() => 16 // Todo 107730cfbc0SXuan Hu case _ => 0 108730cfbc0SXuan Hu } 109730cfbc0SXuan Hu 110730cfbc0SXuan Hu def numIntRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numIntSrc).sum).sum 111730cfbc0SXuan Hu 112730cfbc0SXuan Hu def numVfRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(x => x.numFpSrc + x.numVecSrc).sum).sum 113730cfbc0SXuan Hu 114dd473fffSXuan Hu def bindBackendParam(param: BackendParams): Unit = { 115dd473fffSXuan Hu backendParam = param 116dd473fffSXuan Hu } 117dd473fffSXuan Hu 118730cfbc0SXuan Hu def genExuInputBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = { 119730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledBundle)) 120730cfbc0SXuan Hu } 121730cfbc0SXuan Hu 122730cfbc0SXuan Hu def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = { 123730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuOutputDecoupledBundle)) 124730cfbc0SXuan Hu } 125730cfbc0SXuan Hu 126730cfbc0SXuan Hu def genExuOutputValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuOutput]]] = { 127730cfbc0SXuan Hu MixedVec(this.issueBlockParams.map(_.genExuOutputValidBundle)) 128730cfbc0SXuan Hu } 129730cfbc0SXuan Hu 1305d2b9cadSXuan Hu def genExuBypassValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuBypassBundle]]] = { 1315d2b9cadSXuan Hu MixedVec(this.issueBlockParams.map(_.genExuBypassValidBundle)) 1325d2b9cadSXuan Hu } 1335d2b9cadSXuan Hu 134bf35baadSXuan Hu def wakeUpInExuSources: Seq[WakeUpSource] = { 135bf35baadSXuan Hu SeqUtils.distinctBy( 136bf35baadSXuan Hu issueBlockParams 137bf35baadSXuan Hu .flatMap(_.wakeUpInExuSources) 138bf35baadSXuan Hu )(_.name) 139bf35baadSXuan Hu } 140bf35baadSXuan Hu 141bf35baadSXuan Hu def wakeUpOutExuSources: Seq[WakeUpSource] = { 142bf35baadSXuan Hu SeqUtils.distinctBy( 143bf35baadSXuan Hu issueBlockParams 144bf35baadSXuan Hu .flatMap(_.wakeUpOutExuSources) 145bf35baadSXuan Hu )(_.name) 146bf35baadSXuan Hu } 147bf35baadSXuan Hu 148c0be7f33SXuan Hu def genIQWakeUpInValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = { 1490c7ebb58Sxiaofeibao-xjtu MixedVec(this.wakeUpInExuSources.map(x => { 1500c7ebb58Sxiaofeibao-xjtu val param = x.getExuParam(backendParam.allExuParams) 1514c5a0d77Sxiaofeibao-xjtu val isCopyPdest = param.copyWakeupOut 1524c5a0d77Sxiaofeibao-xjtu val copyNum = param.copyNum 1530c7ebb58Sxiaofeibao-xjtu ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam, isCopyPdest, copyNum)) 1540c7ebb58Sxiaofeibao-xjtu }) 1550c7ebb58Sxiaofeibao-xjtu ) 156bf35baadSXuan Hu } 157bf35baadSXuan Hu 158c0be7f33SXuan Hu def genIQWakeUpOutValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = { 1590c7ebb58Sxiaofeibao-xjtu MixedVec(this.wakeUpOutExuSources.map(x => { 1600c7ebb58Sxiaofeibao-xjtu val param = x.getExuParam(backendParam.allExuParams) 1614c5a0d77Sxiaofeibao-xjtu val isCopyPdest = param.copyWakeupOut 1624c5a0d77Sxiaofeibao-xjtu val copyNum = param.copyNum 1630c7ebb58Sxiaofeibao-xjtu ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam, isCopyPdest, copyNum)) 1640c7ebb58Sxiaofeibao-xjtu }) 1650c7ebb58Sxiaofeibao-xjtu ) 166c0be7f33SXuan Hu } 167c0be7f33SXuan Hu 168*ec49b127Ssinsanction def genWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 169c0be7f33SXuan Hu val intBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match { 170c0be7f33SXuan Hu case IntScheduler() | MemScheduler() => backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 171c0be7f33SXuan Hu case _ => Seq() 172c0be7f33SXuan Hu } 173c0be7f33SXuan Hu val vfBundle = schdType match { 174c0be7f33SXuan Hu case VfScheduler() | MemScheduler() => backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq 175c0be7f33SXuan Hu case _ => Seq() 176c0be7f33SXuan Hu } 177c0be7f33SXuan Hu MixedVec(intBundle ++ vfBundle) 178bf35baadSXuan Hu } 179bf35baadSXuan Hu 180*ec49b127Ssinsanction def genIntWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 181f39a61a1SzhanglyGit MixedVec(backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq) 182f39a61a1SzhanglyGit } 183f39a61a1SzhanglyGit 184*ec49b127Ssinsanction def genVfWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = { 185f39a61a1SzhanglyGit MixedVec(backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq) 186f39a61a1SzhanglyGit } 187f39a61a1SzhanglyGit 188730cfbc0SXuan Hu // cfgs(issueIdx)(exuIdx)(set of exu's wb) 18939c59369SXuan Hu def getWbCfgs: Seq[Seq[Set[PregWB]]] = { 190730cfbc0SXuan Hu this.issueBlockParams.map(_.getWbCfgs) 191730cfbc0SXuan Hu } 192730cfbc0SXuan Hu} 193