xref: /XiangShan/src/main/scala/xiangshan/backend/issue/SchdBlockParams.scala (revision 730cfbc0bf03569aa07dd82ba3fb41eb7413e13c)
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