xref: /XiangShan/src/main/scala/xiangshan/backend/BackendParams.scala (revision 730cfbc0bf03569aa07dd82ba3fb41eb7413e13c)
1*730cfbc0SXuan Hu/***************************************************************************************
2*730cfbc0SXuan Hu  * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3*730cfbc0SXuan Hu  * Copyright (c) 2020-2021 Peng Cheng Laboratory
4*730cfbc0SXuan Hu  *
5*730cfbc0SXuan Hu  * XiangShan is licensed under Mulan PSL v2.
6*730cfbc0SXuan Hu  * You can use this software according to the terms and conditions of the Mulan PSL v2.
7*730cfbc0SXuan Hu  * You may obtain a copy of Mulan PSL v2 at:
8*730cfbc0SXuan Hu  *          http://license.coscl.org.cn/MulanPSL2
9*730cfbc0SXuan Hu  *
10*730cfbc0SXuan Hu  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11*730cfbc0SXuan Hu  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12*730cfbc0SXuan Hu  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13*730cfbc0SXuan Hu  *
14*730cfbc0SXuan Hu  * See the Mulan PSL v2 for more details.
15*730cfbc0SXuan Hu  ***************************************************************************************/
16*730cfbc0SXuan Hu
17*730cfbc0SXuan Hupackage xiangshan.backend
18*730cfbc0SXuan Hu
19*730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters
20*730cfbc0SXuan Huimport chisel3._
21*730cfbc0SXuan Huimport chisel3.util._
22*730cfbc0SXuan Huimport xiangshan.backend.Bundles._
23*730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig._
24*730cfbc0SXuan Huimport xiangshan.backend.datapath.WbArbiterParams
25*730cfbc0SXuan Huimport xiangshan.backend.datapath.WbConfig._
26*730cfbc0SXuan Huimport xiangshan.backend.exu.ExeUnitParams
27*730cfbc0SXuan Huimport xiangshan.backend.fu.{FuConfig, FuType}
28*730cfbc0SXuan Huimport xiangshan.backend.issue._
29*730cfbc0SXuan Huimport xiangshan.backend.regfile._
30*730cfbc0SXuan Hu
31*730cfbc0SXuan Hucase class BackendParams(
32*730cfbc0SXuan Hu  schdParams : Map[SchedulerType, SchdBlockParams],
33*730cfbc0SXuan Hu  pregParams : Seq[PregParams],
34*730cfbc0SXuan Hu) {
35*730cfbc0SXuan Hu  def intSchdParams = schdParams.get(IntScheduler())
36*730cfbc0SXuan Hu  def vfSchdParams = schdParams.get(VfScheduler())
37*730cfbc0SXuan Hu  def memSchdParams = schdParams.get(MemScheduler())
38*730cfbc0SXuan Hu  def allSchdParams: Seq[SchdBlockParams] =
39*730cfbc0SXuan Hu    (Seq(intSchdParams) :+ vfSchdParams :+ memSchdParams)
40*730cfbc0SXuan Hu    .filter(_.nonEmpty)
41*730cfbc0SXuan Hu    .map(_.get)
42*730cfbc0SXuan Hu  def allIssueParams: Seq[IssueBlockParams] =
43*730cfbc0SXuan Hu    allSchdParams.map(_.issueBlockParams).flatten
44*730cfbc0SXuan Hu  def allExuParams: Seq[ExeUnitParams] =
45*730cfbc0SXuan Hu    allIssueParams.map(_.exuBlockParams).flatten
46*730cfbc0SXuan Hu
47*730cfbc0SXuan Hu  def intPregParams: IntPregParams = pregParams.collectFirst { case x: IntPregParams => x }.get
48*730cfbc0SXuan Hu  def vfPregParams: VfPregParams = pregParams.collectFirst { case x: VfPregParams => x }.get
49*730cfbc0SXuan Hu
50*730cfbc0SXuan Hu  def AluCnt = allSchdParams.map(_.AluCnt).sum
51*730cfbc0SXuan Hu  def StaCnt = allSchdParams.map(_.StaCnt).sum
52*730cfbc0SXuan Hu  def StdCnt = allSchdParams.map(_.StdCnt).sum
53*730cfbc0SXuan Hu  def LduCnt = allSchdParams.map(_.LduCnt).sum
54*730cfbc0SXuan Hu  def LsExuCnt = StaCnt + LduCnt
55*730cfbc0SXuan Hu  def JmpCnt = allSchdParams.map(_.JmpCnt).sum
56*730cfbc0SXuan Hu  def BrhCnt = allSchdParams.map(_.BrhCnt).sum
57*730cfbc0SXuan Hu  def IqCnt = allSchdParams.map(_.issueBlockParams.length).sum
58*730cfbc0SXuan Hu
59*730cfbc0SXuan Hu  def numPcReadPort = allSchdParams.map(_.numPcReadPort).sum
60*730cfbc0SXuan Hu
61*730cfbc0SXuan Hu  def numIntWb = intPregParams.numWrite
62*730cfbc0SXuan Hu  def numVfWb = vfPregParams.numWrite
63*730cfbc0SXuan Hu  def numNoDataWB = allSchdParams.map(_.numNoDataWB).sum
64*730cfbc0SXuan Hu  def numExu = allSchdParams.map(_.numExu).sum
65*730cfbc0SXuan Hu  def numRfRead  = 14
66*730cfbc0SXuan Hu  def numRfWrite = 8
67*730cfbc0SXuan Hu
68*730cfbc0SXuan Hu  def numException = allExuParams.count(_.exceptionOut.nonEmpty)
69*730cfbc0SXuan Hu
70*730cfbc0SXuan Hu  def numRedirect = allSchdParams.map(_.numRedirect).sum
71*730cfbc0SXuan Hu
72*730cfbc0SXuan Hu  def genIntWriteBackBundle(implicit p: Parameters) = {
73*730cfbc0SXuan Hu    // Todo: limit write port
74*730cfbc0SXuan Hu    Seq.tabulate(numIntWb)(x => new RfWritePortWithConfig(IntData(), intPregParams.addrWidth))
75*730cfbc0SXuan Hu  }
76*730cfbc0SXuan Hu
77*730cfbc0SXuan Hu  def genVfWriteBackBundle(implicit p: Parameters) = {
78*730cfbc0SXuan Hu    // Todo: limit write port
79*730cfbc0SXuan Hu    Seq.tabulate(numVfWb)(x => new RfWritePortWithConfig(VecData(), intPregParams.addrWidth))
80*730cfbc0SXuan Hu  }
81*730cfbc0SXuan Hu
82*730cfbc0SXuan Hu  def genWriteBackBundles(implicit p: Parameters): Seq[RfWritePortWithConfig] = {
83*730cfbc0SXuan Hu    genIntWriteBackBundle ++ genVfWriteBackBundle
84*730cfbc0SXuan Hu  }
85*730cfbc0SXuan Hu
86*730cfbc0SXuan Hu  def genWrite2CtrlBundles(implicit p: Parameters): MixedVec[ValidIO[ExuOutput]] = {
87*730cfbc0SXuan Hu    MixedVec(allSchdParams.map(_.genExuOutputValidBundle.flatten).reduce(_ ++ _))
88*730cfbc0SXuan Hu  }
89*730cfbc0SXuan Hu
90*730cfbc0SXuan Hu  def getIntWbArbiterParams: WbArbiterParams = {
91*730cfbc0SXuan Hu    val intWbCfgs: Seq[WbConfig] = allSchdParams.flatMap(_.getWbCfgs.flatten.flatten.filter(_.writeInt))
92*730cfbc0SXuan Hu    datapath.WbArbiterParams(intWbCfgs, intPregParams)
93*730cfbc0SXuan Hu  }
94*730cfbc0SXuan Hu
95*730cfbc0SXuan Hu  def getVfWbArbiterParams: WbArbiterParams = {
96*730cfbc0SXuan Hu    val vfWbCfgs = allSchdParams.flatMap(_.getWbCfgs.flatten.flatten.filter(x => x.writeVec || x.writeFp))
97*730cfbc0SXuan Hu    datapath.WbArbiterParams(vfWbCfgs, vfPregParams)
98*730cfbc0SXuan Hu  }
99*730cfbc0SXuan Hu}
100*730cfbc0SXuan Hu
101*730cfbc0SXuan Hu
102*730cfbc0SXuan Hu
103*730cfbc0SXuan Hu
104