xref: /XiangShan/src/main/scala/xiangshan/backend/issue/SchdBlockParams.scala (revision 914bbc865acb565ce0fae9e50a787f2ab3c57b3a)
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) {
18dd473fffSXuan Hu  var backendParam: BackendParams = null
19dd473fffSXuan Hu
20730cfbc0SXuan Hu  def isMemSchd: Boolean = schdType == MemScheduler()
21730cfbc0SXuan Hu
22730cfbc0SXuan Hu  def isIntSchd: Boolean = schdType == IntScheduler()
23730cfbc0SXuan Hu
2482674533Sxiaofeibao  def isFpSchd: Boolean = schdType == FpScheduler()
2582674533Sxiaofeibao
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 FDivSqrtCnt: Int = issueBlockParams.map(_.fDivSqrtCnt).sum
51730cfbc0SXuan Hu
52730cfbc0SXuan Hu  def LduCnt: Int = issueBlockParams.map(_.LduCnt).sum
53730cfbc0SXuan Hu
54730cfbc0SXuan Hu  def StaCnt: Int = issueBlockParams.map(_.StaCnt).sum
55730cfbc0SXuan Hu
56730cfbc0SXuan Hu  def StdCnt: Int = issueBlockParams.map(_.StdCnt).sum
57730cfbc0SXuan Hu
58730cfbc0SXuan Hu  def MouCnt: Int = issueBlockParams.map(_.MouCnt).sum
59730cfbc0SXuan Hu
60b133b458SXuan Hu  def HyuCnt: Int = issueBlockParams.map(_.HyuCnt).sum
61b133b458SXuan Hu
62596af5d2SHaojin Tang  def LdExuCnt: Int = issueBlockParams.map(_.LdExuCnt).sum
63596af5d2SHaojin Tang
64730cfbc0SXuan Hu  def VipuCnt: Int = issueBlockParams.map(_.VipuCnt).sum
65730cfbc0SXuan Hu
66730cfbc0SXuan Hu  def VfpuCnt: Int = issueBlockParams.map(_.VfpuCnt).sum
67730cfbc0SXuan Hu
68730cfbc0SXuan Hu  def VlduCnt: Int = issueBlockParams.map(_.VlduCnt).sum
69730cfbc0SXuan Hu
70730cfbc0SXuan Hu  def VstuCnt: Int = issueBlockParams.map(_.VstuCnt).sum
71730cfbc0SXuan Hu
72670870b3SXuan Hu  def numExu: Int = issueBlockParams.map(_.exuBlockParams.count(!_.fakeUnit)).sum
73730cfbc0SXuan Hu
74730cfbc0SXuan Hu  def hasCSR = CsrCnt > 0
75730cfbc0SXuan Hu
76730cfbc0SXuan Hu  def hasFence = FenceCnt > 0
77730cfbc0SXuan Hu
78730cfbc0SXuan Hu  def numWriteIntRf: Int = issueBlockParams.map(_.numWriteIntRf).sum
79730cfbc0SXuan Hu
80730cfbc0SXuan Hu  def numWriteFpRf: Int = issueBlockParams.map(_.numWriteFpRf).sum
81730cfbc0SXuan Hu
82730cfbc0SXuan Hu  def numWriteVecRf: Int = issueBlockParams.map(_.numWriteVecRf).sum
83730cfbc0SXuan Hu
84730cfbc0SXuan Hu  def numWriteVfRf: Int = issueBlockParams.map(_.numWriteVfRf).sum
85730cfbc0SXuan Hu
86730cfbc0SXuan Hu  def numNoDataWB: Int = issueBlockParams.map(_.numNoDataWB).sum
87730cfbc0SXuan Hu
8842b6cdf9Ssinsanction  def needOg2Resp: Boolean = isVfSchd || isMemSchd && issueBlockParams.map(_.needOg2Resp).reduce(_ || _)
8942b6cdf9Ssinsanction
90730cfbc0SXuan Hu  def needSrcFrm: Boolean = issueBlockParams.map(_.needSrcFrm).reduce(_ || _)
91730cfbc0SXuan Hu
9217985fbbSZiyue Zhang  def needSrcVxrm: Boolean = issueBlockParams.map(_.needSrcVxrm).reduce(_ || _)
9317985fbbSZiyue Zhang
94b6279fc6SZiyue Zhang  def writeVConfig: Boolean = issueBlockParams.map(_.writeVConfig).reduce(_ || _)
95b6279fc6SZiyue Zhang
967e4f0b19SZiyue-Zhang  def writeVType: Boolean = issueBlockParams.map(_.writeVType).reduce(_ || _)
977e4f0b19SZiyue-Zhang
98730cfbc0SXuan Hu  def numRedirect: Int = issueBlockParams.map(_.numRedirect).sum
99730cfbc0SXuan Hu
100730cfbc0SXuan Hu  def pregIdxWidth: Int = log2Up(numPregs)
101730cfbc0SXuan Hu
102730cfbc0SXuan Hu  def numWakeupFromWB: Int = schdType match {
103730cfbc0SXuan Hu    case IntScheduler() | VfScheduler() => 8
104730cfbc0SXuan Hu    case MemScheduler() => 16 // Todo
105730cfbc0SXuan Hu    case _ => 0
106730cfbc0SXuan Hu  }
107730cfbc0SXuan Hu
108730cfbc0SXuan Hu  def numIntRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numIntSrc).sum).sum
109730cfbc0SXuan Hu
11060f0c5aeSxiaofeibao  def numFpRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numFpSrc).sum).sum
11160f0c5aeSxiaofeibao
112de8bd1d0Ssinsanction  def numVfRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numVecSrc).sum).sum
113de8bd1d0Ssinsanction
114de8bd1d0Ssinsanction  def numV0RfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numV0Src).sum).sum
115de8bd1d0Ssinsanction
116de8bd1d0Ssinsanction  def numVlRfReadByExu: Int = issueBlockParams.map(_.exuBlockParams.map(_.numVlSrc).sum).sum
117730cfbc0SXuan Hu
118dd473fffSXuan Hu  def bindBackendParam(param: BackendParams): Unit = {
119dd473fffSXuan Hu    backendParam = param
120dd473fffSXuan Hu  }
121dd473fffSXuan Hu
122f8b278aaSsinsanction  def numWriteRegCache: Int = issueBlockParams.map(_.numWriteRegCache).sum
123f8b278aaSsinsanction
124f8b278aaSsinsanction  def needWriteRegCache: Boolean = numWriteRegCache > 0
125f8b278aaSsinsanction
126730cfbc0SXuan Hu  def genExuInputBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = {
127730cfbc0SXuan Hu    MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledBundle))
128730cfbc0SXuan Hu  }
129730cfbc0SXuan Hu
130*0ed0e482SGuanghui Cheng  def genExuInputCopySrcBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuInput]]] = {
131*0ed0e482SGuanghui Cheng    MixedVec(this.issueBlockParams.map(_.genExuInputDecoupledCopySrcBundle))
132*0ed0e482SGuanghui Cheng  }
133*0ed0e482SGuanghui Cheng
134730cfbc0SXuan Hu  def genExuOutputDecoupledBundle(implicit p: Parameters): MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = {
135730cfbc0SXuan Hu    MixedVec(this.issueBlockParams.map(_.genExuOutputDecoupledBundle))
136730cfbc0SXuan Hu  }
137730cfbc0SXuan Hu
138730cfbc0SXuan Hu  def genExuOutputValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuOutput]]] = {
139730cfbc0SXuan Hu    MixedVec(this.issueBlockParams.map(_.genExuOutputValidBundle))
140730cfbc0SXuan Hu  }
141730cfbc0SXuan Hu
1425d2b9cadSXuan Hu  def genExuBypassValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuBypassBundle]]] = {
1435d2b9cadSXuan Hu    MixedVec(this.issueBlockParams.map(_.genExuBypassValidBundle))
1445d2b9cadSXuan Hu  }
1455d2b9cadSXuan Hu
146bf35baadSXuan Hu  def wakeUpInExuSources: Seq[WakeUpSource] = {
147bf35baadSXuan Hu    issueBlockParams
148bf35baadSXuan Hu      .flatMap(_.wakeUpInExuSources)
149edb1dfafSHaojin Tang      .distinctBy(_.name)
150bf35baadSXuan Hu  }
151bf35baadSXuan Hu
152bf35baadSXuan Hu  def wakeUpOutExuSources: Seq[WakeUpSource] = {
153bf35baadSXuan Hu    issueBlockParams
154bf35baadSXuan Hu      .flatMap(_.wakeUpOutExuSources)
155edb1dfafSHaojin Tang      .distinctBy(_.name)
156bf35baadSXuan Hu  }
157bf35baadSXuan Hu
158c0be7f33SXuan Hu  def genIQWakeUpInValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = {
1590c7ebb58Sxiaofeibao-xjtu    MixedVec(this.wakeUpInExuSources.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    )
166bf35baadSXuan Hu  }
167bf35baadSXuan Hu
168c0be7f33SXuan Hu  def genIQWakeUpOutValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = {
1690c7ebb58Sxiaofeibao-xjtu    MixedVec(this.wakeUpOutExuSources.map(x => {
1700c7ebb58Sxiaofeibao-xjtu      val param = x.getExuParam(backendParam.allExuParams)
1714c5a0d77Sxiaofeibao-xjtu      val isCopyPdest = param.copyWakeupOut
1724c5a0d77Sxiaofeibao-xjtu      val copyNum = param.copyNum
1730c7ebb58Sxiaofeibao-xjtu      ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam, isCopyPdest, copyNum))
1740c7ebb58Sxiaofeibao-xjtu      })
1750c7ebb58Sxiaofeibao-xjtu    )
176c0be7f33SXuan Hu  }
177c0be7f33SXuan Hu
178ec49b127Ssinsanction  def genWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
179c0be7f33SXuan Hu    val intBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match {
180c0be7f33SXuan Hu      case IntScheduler() | MemScheduler() => backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
181c0be7f33SXuan Hu      case _ => Seq()
182c0be7f33SXuan Hu    }
18360f0c5aeSxiaofeibao    val fpBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match {
18460f0c5aeSxiaofeibao      case FpScheduler() | MemScheduler() => backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
18560f0c5aeSxiaofeibao      case _ => Seq()
18660f0c5aeSxiaofeibao    }
187c0be7f33SXuan Hu    val vfBundle = schdType match {
188c0be7f33SXuan Hu      case VfScheduler() | MemScheduler() => backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
189c0be7f33SXuan Hu      case _ => Seq()
190c0be7f33SXuan Hu    }
191de8bd1d0Ssinsanction    val v0Bundle = schdType match {
192de8bd1d0Ssinsanction      case VfScheduler() | MemScheduler() => backendParam.getV0WBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
193de8bd1d0Ssinsanction      case _ => Seq()
194de8bd1d0Ssinsanction    }
195de8bd1d0Ssinsanction    val vlBundle = schdType match {
196de8bd1d0Ssinsanction      case VfScheduler() | MemScheduler() => backendParam.getVlWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
197de8bd1d0Ssinsanction      case _ => Seq()
198de8bd1d0Ssinsanction    }
199de8bd1d0Ssinsanction    MixedVec(intBundle ++ fpBundle ++ vfBundle ++ v0Bundle ++ vlBundle)
200bf35baadSXuan Hu  }
201bf35baadSXuan Hu
202ec49b127Ssinsanction  def genIntWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
203f39a61a1SzhanglyGit    MixedVec(backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
204f39a61a1SzhanglyGit  }
205f39a61a1SzhanglyGit
20660f0c5aeSxiaofeibao  def genFpWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
20760f0c5aeSxiaofeibao    MixedVec(backendParam.getFpWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
20860f0c5aeSxiaofeibao  }
20960f0c5aeSxiaofeibao
210ec49b127Ssinsanction  def genVfWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
211f39a61a1SzhanglyGit    MixedVec(backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
212f39a61a1SzhanglyGit  }
213f39a61a1SzhanglyGit
214de8bd1d0Ssinsanction  def genV0WBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
215de8bd1d0Ssinsanction    MixedVec(backendParam.getV0WBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
216de8bd1d0Ssinsanction  }
217de8bd1d0Ssinsanction
218de8bd1d0Ssinsanction  def genVlWBWakeUpSinkValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
219de8bd1d0Ssinsanction    MixedVec(backendParam.getVlWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq)
220de8bd1d0Ssinsanction  }
221de8bd1d0Ssinsanction
222730cfbc0SXuan Hu  // cfgs(issueIdx)(exuIdx)(set of exu's wb)
22339c59369SXuan Hu  def getWbCfgs: Seq[Seq[Set[PregWB]]] = {
224730cfbc0SXuan Hu    this.issueBlockParams.map(_.getWbCfgs)
225730cfbc0SXuan Hu  }
226730cfbc0SXuan Hu}
227