xref: /XiangShan/src/main/scala/xiangshan/backend/issue/SchdBlockParams.scala (revision c0be7f3326dfca5bea51a5a98f3c07e847728c49)
1730cfbc0SXuan Hupackage xiangshan.backend.issue
2730cfbc0SXuan Hu
3730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters
4730cfbc0SXuan Huimport chisel3.util._
5bf35baadSXuan Huimport utils.SeqUtils
6dd473fffSXuan Huimport xiangshan.backend.BackendParams
7*c0be7f33SXuan Huimport xiangshan.backend.Bundles.{ExuBypassBundle, ExuInput, ExuOutput, IssueQueueCancelBundle, IssueQueueIQWakeUpBundle, IssueQueueWBWakeUpBundle}
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) {
20dd473fffSXuan Hu  var backendParam: BackendParams = null
21dd473fffSXuan 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
70*c0be7f33SXuan Hu  def numExu: Int = issueBlockParams.map(_.exuBlockParams.size).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
110dd473fffSXuan Hu  def bindBackendParam(param: BackendParams): Unit = {
111dd473fffSXuan Hu    backendParam = param
112dd473fffSXuan Hu  }
113dd473fffSXuan 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
1265d2b9cadSXuan Hu  def genExuBypassValidBundle(implicit p: Parameters): MixedVec[MixedVec[ValidIO[ExuBypassBundle]]] = {
1275d2b9cadSXuan Hu    MixedVec(this.issueBlockParams.map(_.genExuBypassValidBundle))
1285d2b9cadSXuan Hu  }
1295d2b9cadSXuan Hu
130bf35baadSXuan Hu  def wakeUpInExuSources: Seq[WakeUpSource] = {
131bf35baadSXuan Hu    SeqUtils.distinctBy(
132bf35baadSXuan Hu      issueBlockParams
133bf35baadSXuan Hu        .flatMap(_.wakeUpInExuSources)
134bf35baadSXuan Hu    )(_.name)
135bf35baadSXuan Hu  }
136bf35baadSXuan Hu
137bf35baadSXuan Hu  def wakeUpOutExuSources: Seq[WakeUpSource] = {
138bf35baadSXuan Hu    SeqUtils.distinctBy(
139bf35baadSXuan Hu      issueBlockParams
140bf35baadSXuan Hu        .flatMap(_.wakeUpOutExuSources)
141bf35baadSXuan Hu    )(_.name)
142bf35baadSXuan Hu  }
143bf35baadSXuan Hu
144*c0be7f33SXuan Hu  def genIQWakeUpInValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = {
145*c0be7f33SXuan Hu    MixedVec(this.wakeUpInExuSources.map(x => ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam))))
146bf35baadSXuan Hu  }
147bf35baadSXuan Hu
148*c0be7f33SXuan Hu  def genIQWakeUpOutValidBundle(implicit p: Parameters): MixedVec[ValidIO[IssueQueueIQWakeUpBundle]] = {
149*c0be7f33SXuan Hu    MixedVec(this.wakeUpOutExuSources.map(x => ValidIO(new IssueQueueIQWakeUpBundle(backendParam.getExuIdx(x.name), backendParam))))
150*c0be7f33SXuan Hu  }
151*c0be7f33SXuan Hu
152*c0be7f33SXuan Hu  def genCancelBundle(cancelStages: Seq[String]): MixedVec[IssueQueueCancelBundle] = {
153*c0be7f33SXuan Hu    MixedVec(backendParam.allExuParams.map(x => new IssueQueueCancelBundle(x.exuIdx, cancelStages)))
154*c0be7f33SXuan Hu  }
155*c0be7f33SXuan Hu
156*c0be7f33SXuan Hu  def genWBWakeUpSinkValidBundle: MixedVec[ValidIO[IssueQueueWBWakeUpBundle]] = {
157*c0be7f33SXuan Hu    val intBundle: Seq[ValidIO[IssueQueueWBWakeUpBundle]] = schdType match {
158*c0be7f33SXuan Hu      case IntScheduler() | MemScheduler() => backendParam.getIntWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
159*c0be7f33SXuan Hu      case _ => Seq()
160*c0be7f33SXuan Hu    }
161*c0be7f33SXuan Hu    val vfBundle = schdType match {
162*c0be7f33SXuan Hu      case VfScheduler() | MemScheduler() => backendParam.getVfWBExeGroup.map(x => ValidIO(new IssueQueueWBWakeUpBundle(x._2.map(_.exuIdx), backendParam))).toSeq
163*c0be7f33SXuan Hu      case _ => Seq()
164*c0be7f33SXuan Hu    }
165*c0be7f33SXuan Hu    MixedVec(intBundle ++ vfBundle)
166bf35baadSXuan Hu  }
167bf35baadSXuan Hu
168730cfbc0SXuan Hu  // cfgs(issueIdx)(exuIdx)(set of exu's wb)
169730cfbc0SXuan Hu  def getWbCfgs: Seq[Seq[Set[WbConfig]]] = {
170730cfbc0SXuan Hu    this.issueBlockParams.map(_.getWbCfgs)
171730cfbc0SXuan Hu  }
172730cfbc0SXuan Hu}
173