xref: /XiangShan/src/main/scala/xiangshan/backend/exu/ExeUnitParams.scala (revision 730cfbc0bf03569aa07dd82ba3fb41eb7413e13c)
1*730cfbc0SXuan Hupackage xiangshan.backend.exu
2*730cfbc0SXuan Hu
3*730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters
4*730cfbc0SXuan Huimport chisel3._
5*730cfbc0SXuan Huimport chisel3.util._
6*730cfbc0SXuan Huimport xiangshan.backend.Bundles.{ExuInput, ExuOutput}
7*730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig.DataConfig
8*730cfbc0SXuan Huimport xiangshan.backend.datapath.RdConfig._
9*730cfbc0SXuan Huimport xiangshan.backend.datapath.WbConfig.{FpWB, IntWB, WbConfig}
10*730cfbc0SXuan Huimport xiangshan.backend.fu.{FuConfig, FuType}
11*730cfbc0SXuan Huimport xiangshan.backend.issue.{IntScheduler, SchedulerType, VfScheduler}
12*730cfbc0SXuan Hu
13*730cfbc0SXuan Hucase class ExeUnitParams(
14*730cfbc0SXuan Hu  fuConfigs     : Seq[FuConfig],
15*730cfbc0SXuan Hu  wbPortConfigs : Seq[WbConfig],
16*730cfbc0SXuan Hu  rfrPortConfigs: Seq[Seq[RdConfig]],
17*730cfbc0SXuan Hu)(
18*730cfbc0SXuan Hu  implicit
19*730cfbc0SXuan Hu  val schdType: SchedulerType,
20*730cfbc0SXuan Hu) {
21*730cfbc0SXuan Hu  val numIntSrc: Int = fuConfigs.map(_.numIntSrc).max
22*730cfbc0SXuan Hu  val numFpSrc: Int = fuConfigs.map(_.numFpSrc).max
23*730cfbc0SXuan Hu  val numVecSrc: Int = fuConfigs.map(_.numVecSrc).max
24*730cfbc0SXuan Hu  val numVfSrc: Int = fuConfigs.map(_.numVfSrc).max
25*730cfbc0SXuan Hu  val numRegSrc: Int = fuConfigs.map(_.numRegSrc).max
26*730cfbc0SXuan Hu  val numSrc: Int = fuConfigs.map(_.numSrc).max
27*730cfbc0SXuan Hu  val dataBitsMax: Int = fuConfigs.map(_.dataBits).max
28*730cfbc0SXuan Hu  val readIntRf: Boolean = numIntSrc > 0
29*730cfbc0SXuan Hu  val readFpRf: Boolean = numFpSrc > 0
30*730cfbc0SXuan Hu  val readVecRf: Boolean = numVecSrc > 0
31*730cfbc0SXuan Hu  val writeIntRf: Boolean = fuConfigs.map(_.writeIntRf).reduce(_ || _)
32*730cfbc0SXuan Hu  val writeFpRf: Boolean = fuConfigs.map(_.writeFpRf).reduce(_ || _)
33*730cfbc0SXuan Hu  val writeVecRf: Boolean = fuConfigs.map(_.writeVecRf).reduce(_ || _)
34*730cfbc0SXuan Hu  val writeVfRf: Boolean = writeFpRf || writeVecRf
35*730cfbc0SXuan Hu  val writeFflags: Boolean = fuConfigs.map(_.writeFflags).reduce(_ || _)
36*730cfbc0SXuan Hu  val hasNoDataWB: Boolean = fuConfigs.map(_.hasNoDataWB).reduce(_ || _)
37*730cfbc0SXuan Hu  val hasRedirect: Boolean = fuConfigs.map(_.hasRedirect).reduce(_ || _)
38*730cfbc0SXuan Hu  val hasPredecode: Boolean = fuConfigs.map(_.hasPredecode).reduce(_ || _)
39*730cfbc0SXuan Hu  val exceptionOut: Seq[Int] = fuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted
40*730cfbc0SXuan Hu  val hasLoadError: Boolean = fuConfigs.map(_.hasLoadError).reduce(_ || _)
41*730cfbc0SXuan Hu  val flushPipe: Boolean = fuConfigs.map(_.flushPipe).reduce(_ || _)
42*730cfbc0SXuan Hu  val replayInst: Boolean = fuConfigs.map(_.replayInst).reduce(_ || _)
43*730cfbc0SXuan Hu  val trigger: Boolean = fuConfigs.map(_.trigger).reduce(_ || _)
44*730cfbc0SXuan Hu  val needExceptionGen: Boolean = exceptionOut.nonEmpty || flushPipe || replayInst || trigger
45*730cfbc0SXuan Hu  val needPc: Boolean = fuConfigs.map(_.needPc).reduce(_ || _)
46*730cfbc0SXuan Hu  val needSrcFrm: Boolean = fuConfigs.map(_.needSrcFrm).reduce(_ || _)
47*730cfbc0SXuan Hu  val needFPUCtrl: Boolean = fuConfigs.map(_.needFPUCtrl).reduce(_ || _)
48*730cfbc0SXuan Hu  val wbPregIdxWidth = if (wbPortConfigs.nonEmpty) wbPortConfigs.map(_.pregIdxWidth).max else 0
49*730cfbc0SXuan Hu
50*730cfbc0SXuan Hu  def hasCSR: Boolean = fuConfigs.map(_.isCsr).reduce(_ || _)
51*730cfbc0SXuan Hu
52*730cfbc0SXuan Hu  def hasFence: Boolean = fuConfigs.map(_.isFence).reduce(_ || _)
53*730cfbc0SXuan Hu
54*730cfbc0SXuan Hu  def hasBrhFu = fuConfigs.map(_.fuType == FuType.brh).reduce(_ || _)
55*730cfbc0SXuan Hu
56*730cfbc0SXuan Hu  def hasJmpFu = fuConfigs.map(_.fuType == FuType.jmp).reduce(_ || _)
57*730cfbc0SXuan Hu
58*730cfbc0SXuan Hu  def hasLoadFu = fuConfigs.map(_.fuType == FuType.ldu).reduce(_ || _)
59*730cfbc0SXuan Hu
60*730cfbc0SXuan Hu  def hasStoreAddrFu = fuConfigs.map(_.name == "sta").reduce(_ || _)
61*730cfbc0SXuan Hu
62*730cfbc0SXuan Hu  def hasStdFu = fuConfigs.map(_.name == "std").reduce(_ || _)
63*730cfbc0SXuan Hu
64*730cfbc0SXuan Hu  def hasMemAddrFu = hasLoadFu || hasStoreAddrFu
65*730cfbc0SXuan Hu
66*730cfbc0SXuan Hu  def getSrcDataType(srcIdx: Int): Set[DataConfig] = {
67*730cfbc0SXuan Hu    fuConfigs.map(_.getSrcDataType(srcIdx)).reduce(_ ++ _)
68*730cfbc0SXuan Hu  }
69*730cfbc0SXuan Hu
70*730cfbc0SXuan Hu  def immType: Set[UInt] = fuConfigs.map(x => x.immType).reduce(_ ++ _)
71*730cfbc0SXuan Hu
72*730cfbc0SXuan Hu  def getWBSource: SchedulerType = {
73*730cfbc0SXuan Hu    schdType
74*730cfbc0SXuan Hu  }
75*730cfbc0SXuan Hu
76*730cfbc0SXuan Hu  def hasCrossWb: Boolean = {
77*730cfbc0SXuan Hu    schdType match {
78*730cfbc0SXuan Hu      case IntScheduler() => writeFpRf || writeVecRf
79*730cfbc0SXuan Hu      case VfScheduler() => writeIntRf
80*730cfbc0SXuan Hu      case _ => false
81*730cfbc0SXuan Hu    }
82*730cfbc0SXuan Hu  }
83*730cfbc0SXuan Hu
84*730cfbc0SXuan Hu  def canAccept(fuType: UInt): Bool = {
85*730cfbc0SXuan Hu    Cat(fuConfigs.map(_.fuType.U === fuType)).orR
86*730cfbc0SXuan Hu  }
87*730cfbc0SXuan Hu
88*730cfbc0SXuan Hu  def hasUncertainLatency: Boolean = fuConfigs.map(_.latency.latencyVal.isEmpty).reduce(_ || _)
89*730cfbc0SXuan Hu
90*730cfbc0SXuan Hu  def getIntWBPort = {
91*730cfbc0SXuan Hu    wbPortConfigs.collectFirst {
92*730cfbc0SXuan Hu      case x: IntWB => x
93*730cfbc0SXuan Hu    }
94*730cfbc0SXuan Hu  }
95*730cfbc0SXuan Hu
96*730cfbc0SXuan Hu  def getFpWBPort = {
97*730cfbc0SXuan Hu    wbPortConfigs.collectFirst {
98*730cfbc0SXuan Hu      case x: FpWB => x
99*730cfbc0SXuan Hu    }
100*730cfbc0SXuan Hu  }
101*730cfbc0SXuan Hu
102*730cfbc0SXuan Hu  def getRfReadDataCfgSet: Seq[Set[DataConfig]] = {
103*730cfbc0SXuan Hu    val fuSrcsCfgSet: Seq[Seq[Set[DataConfig]]] = fuConfigs.map(_.getRfReadDataCfgSet)
104*730cfbc0SXuan Hu    val alignedFuSrcsCfgSet: Seq[Seq[Set[DataConfig]]] = fuSrcsCfgSet.map(x => x ++ Seq.fill(numRegSrc - x.length)(Set[DataConfig]()))
105*730cfbc0SXuan Hu
106*730cfbc0SXuan Hu    val exuSrcsCfgSet = alignedFuSrcsCfgSet.reduce((x, y) => (x zip y).map { case (cfg1, cfg2) => cfg1 union cfg2 })
107*730cfbc0SXuan Hu
108*730cfbc0SXuan Hu    exuSrcsCfgSet
109*730cfbc0SXuan Hu  }
110*730cfbc0SXuan Hu
111*730cfbc0SXuan Hu  def genExuModule(implicit p: Parameters): ExeUnit = {
112*730cfbc0SXuan Hu    new ExeUnit(this)
113*730cfbc0SXuan Hu  }
114*730cfbc0SXuan Hu
115*730cfbc0SXuan Hu  def genExuInputBundle(implicit p: Parameters): ExuInput = {
116*730cfbc0SXuan Hu    new ExuInput(this)
117*730cfbc0SXuan Hu  }
118*730cfbc0SXuan Hu
119*730cfbc0SXuan Hu  def genExuOutputBundle(implicit p: Parameters): ExuOutput = {
120*730cfbc0SXuan Hu    new ExuOutput(this)
121*730cfbc0SXuan Hu  }
122*730cfbc0SXuan Hu}
123