xref: /XiangShan/src/main/scala/xiangshan/backend/exu/ExeUnitParams.scala (revision 5edcc45f37ad5425c2b3b88ed8d8e01d43652ecd)
1730cfbc0SXuan Hupackage xiangshan.backend.exu
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4730cfbc0SXuan Huimport chisel3._
5730cfbc0SXuan Huimport chisel3.util._
6dd473fffSXuan Huimport xiangshan.backend.BackendParams
739c59369SXuan Huimport xiangshan.backend.Bundles.{ExuBypassBundle, ExuInput, ExuOutput}
8730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig.DataConfig
9730cfbc0SXuan Huimport xiangshan.backend.datapath.RdConfig._
1039c59369SXuan Huimport xiangshan.backend.datapath.WbConfig.{IntWB, PregWB, VfWB}
1139c59369SXuan Huimport xiangshan.backend.datapath.{DataConfig, WakeUpConfig}
12730cfbc0SXuan Huimport xiangshan.backend.fu.{FuConfig, FuType}
134c5a0d77Sxiaofeibao-xjtuimport xiangshan.backend.issue.{IntScheduler, IssueBlockParams, SchedulerType, VfScheduler}
144c5a0d77Sxiaofeibao-xjtuimport scala.collection.mutable
15730cfbc0SXuan Hu
16730cfbc0SXuan Hucase class ExeUnitParams(
1708017d75SXuan Hu  name          : String,
18730cfbc0SXuan Hu  fuConfigs     : Seq[FuConfig],
1939c59369SXuan Hu  wbPortConfigs : Seq[PregWB],
20730cfbc0SXuan Hu  rfrPortConfigs: Seq[Seq[RdConfig]],
214c5a0d77Sxiaofeibao-xjtu  copyWakeupOut: Boolean = false,
220c7ebb58Sxiaofeibao-xjtu  copyDistance: Int = 1,
23670870b3SXuan Hu  fakeUnit      : Boolean = false,
24730cfbc0SXuan Hu)(
25730cfbc0SXuan Hu  implicit
26730cfbc0SXuan Hu  val schdType: SchedulerType,
27730cfbc0SXuan Hu) {
28d387a573SXuan Hu  // calculated configs
29d387a573SXuan Hu  var iqWakeUpSourcePairs: Seq[WakeUpConfig] = Seq()
30d387a573SXuan Hu  var iqWakeUpSinkPairs: Seq[WakeUpConfig] = Seq()
31bf35baadSXuan Hu  // used in bypass to select data of exu output
32bf35baadSXuan Hu  var exuIdx: Int = -1
33dd473fffSXuan Hu  var backendParam: BackendParams = null
34d387a573SXuan Hu
35730cfbc0SXuan Hu  val numIntSrc: Int = fuConfigs.map(_.numIntSrc).max
36730cfbc0SXuan Hu  val numFpSrc: Int = fuConfigs.map(_.numFpSrc).max
37730cfbc0SXuan Hu  val numVecSrc: Int = fuConfigs.map(_.numVecSrc).max
38730cfbc0SXuan Hu  val numVfSrc: Int = fuConfigs.map(_.numVfSrc).max
39730cfbc0SXuan Hu  val numRegSrc: Int = fuConfigs.map(_.numRegSrc).max
40730cfbc0SXuan Hu  val numSrc: Int = fuConfigs.map(_.numSrc).max
41730cfbc0SXuan Hu  val dataBitsMax: Int = fuConfigs.map(_.dataBits).max
42730cfbc0SXuan Hu  val readIntRf: Boolean = numIntSrc > 0
43730cfbc0SXuan Hu  val readFpRf: Boolean = numFpSrc > 0
44730cfbc0SXuan Hu  val readVecRf: Boolean = numVecSrc > 0
45730cfbc0SXuan Hu  val writeIntRf: Boolean = fuConfigs.map(_.writeIntRf).reduce(_ || _)
46730cfbc0SXuan Hu  val writeFpRf: Boolean = fuConfigs.map(_.writeFpRf).reduce(_ || _)
47730cfbc0SXuan Hu  val writeVecRf: Boolean = fuConfigs.map(_.writeVecRf).reduce(_ || _)
48*5edcc45fSHaojin Tang  val needIntWen: Boolean = fuConfigs.map(_.needIntWen).reduce(_ || _)
49*5edcc45fSHaojin Tang  val needFpWen: Boolean = fuConfigs.map(_.needFpWen).reduce(_ || _)
50*5edcc45fSHaojin Tang  val needVecWen: Boolean = fuConfigs.map(_.needVecWen).reduce(_ || _)
51730cfbc0SXuan Hu  val writeVfRf: Boolean = writeFpRf || writeVecRf
52730cfbc0SXuan Hu  val writeFflags: Boolean = fuConfigs.map(_.writeFflags).reduce(_ || _)
53a8db15d8Sfdy  val writeVxsat: Boolean = fuConfigs.map(_.writeVxsat).reduce(_ || _)
54c1e19666Sxiaofeibao-xjtu  val hasNoDataWB: Boolean = fuConfigs.map(_.hasNoDataWB).reduce(_ && _)
55730cfbc0SXuan Hu  val hasRedirect: Boolean = fuConfigs.map(_.hasRedirect).reduce(_ || _)
56730cfbc0SXuan Hu  val hasPredecode: Boolean = fuConfigs.map(_.hasPredecode).reduce(_ || _)
57730cfbc0SXuan Hu  val exceptionOut: Seq[Int] = fuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted
58730cfbc0SXuan Hu  val hasLoadError: Boolean = fuConfigs.map(_.hasLoadError).reduce(_ || _)
59730cfbc0SXuan Hu  val flushPipe: Boolean = fuConfigs.map(_.flushPipe).reduce(_ || _)
60730cfbc0SXuan Hu  val replayInst: Boolean = fuConfigs.map(_.replayInst).reduce(_ || _)
61730cfbc0SXuan Hu  val trigger: Boolean = fuConfigs.map(_.trigger).reduce(_ || _)
62730cfbc0SXuan Hu  val needExceptionGen: Boolean = exceptionOut.nonEmpty || flushPipe || replayInst || trigger
63730cfbc0SXuan Hu  val needPc: Boolean = fuConfigs.map(_.needPc).reduce(_ || _)
649d8d7860SXuan Hu  val needTarget: Boolean = fuConfigs.map(_.needTargetPc).reduce(_ || _)
659d8d7860SXuan Hu  val needPdInfo: Boolean = fuConfigs.map(_.needPdInfo).reduce(_ || _)
66730cfbc0SXuan Hu  val needSrcFrm: Boolean = fuConfigs.map(_.needSrcFrm).reduce(_ || _)
6717985fbbSZiyue Zhang  val needSrcVxrm: Boolean = fuConfigs.map(_.needSrcVxrm).reduce(_ || _)
68730cfbc0SXuan Hu  val needFPUCtrl: Boolean = fuConfigs.map(_.needFPUCtrl).reduce(_ || _)
69b6b11f60SXuan Hu  val needVPUCtrl: Boolean = fuConfigs.map(_.needVecCtrl).reduce(_ || _)
70bcf0356aSXuan Hu  val isHighestWBPriority: Boolean = wbPortConfigs.forall(_.priority == 0)
7139c59369SXuan Hu
724c5a0d77Sxiaofeibao-xjtu  def copyNum: Int = {
734c5a0d77Sxiaofeibao-xjtu    val setIQ = mutable.Set[IssueBlockParams]()
744c5a0d77Sxiaofeibao-xjtu    iqWakeUpSourcePairs.map(_.sink).foreach{ wakeupSink =>
754c5a0d77Sxiaofeibao-xjtu      backendParam.allIssueParams.map{ issueParams =>
764c5a0d77Sxiaofeibao-xjtu        if (issueParams.exuBlockParams.contains(wakeupSink.getExuParam(backendParam.allExuParams))) {
774c5a0d77Sxiaofeibao-xjtu          setIQ.add(issueParams)
784c5a0d77Sxiaofeibao-xjtu        }
794c5a0d77Sxiaofeibao-xjtu      }
804c5a0d77Sxiaofeibao-xjtu    }
814c5a0d77Sxiaofeibao-xjtu    println(s"[Backend] exuIdx ${exuIdx} numWakeupIQ ${setIQ.size}")
8271dbd663Sxiaofeibao-xjtu    1 + setIQ.size / copyDistance
834c5a0d77Sxiaofeibao-xjtu  }
8439c59369SXuan Hu  def rdPregIdxWidth: Int = {
8539c59369SXuan Hu    this.pregRdDataCfgSet.map(dataCfg => backendParam.getPregParams(dataCfg).addrWidth).fold(0)(_ max _)
8639c59369SXuan Hu  }
8739c59369SXuan Hu
8839c59369SXuan Hu  def wbPregIdxWidth: Int = {
8939c59369SXuan Hu    this.pregWbDataCfgSet.map(dataCfg => backendParam.getPregParams(dataCfg).addrWidth).fold(0)(_ max _)
9039c59369SXuan Hu  }
91730cfbc0SXuan Hu
922e0a7dc5Sfdy  val writeIntFuConfigs: Seq[FuConfig] = fuConfigs.filter(x => x.writeIntRf)
932e0a7dc5Sfdy  val writeVfFuConfigs: Seq[FuConfig] = fuConfigs.filter(x => x.writeFpRf || x.writeVecRf)
942e0a7dc5Sfdy
95bf44d649SXuan Hu  /**
96bf44d649SXuan Hu    * Check if this exu has certain latency
97bf44d649SXuan Hu    */
98bf44d649SXuan Hu  def latencyCertain: Boolean = fuConfigs.map(x => x.latency.latencyVal.nonEmpty).reduce(_ && _)
99bf44d649SXuan Hu  def intLatencyCertain: Boolean = writeIntFuConfigs.forall(x => x.latency.latencyVal.nonEmpty)
100bf44d649SXuan Hu  def vfLatencyCertain: Boolean = writeVfFuConfigs.forall(x => x.latency.latencyVal.nonEmpty)
101f9f1abd7SXuan Hu  // only load use it
102f9f1abd7SXuan Hu  def hasUncertainLatencyVal: Boolean = fuConfigs.map(x => x.latency.uncertainLatencyVal.nonEmpty).reduce(_ || _)
1032e0a7dc5Sfdy
104bf44d649SXuan Hu  /**
105bf44d649SXuan Hu    * Get mapping from FuType to Latency value.
10623c67001SHaojin Tang    * If both [[latencyCertain]] and [[hasUncertainLatencyVal]] are false, get empty [[Map]]
107bf44d649SXuan Hu    *
108239413e5SXuan Hu    * @return Map[ [[BigInt]], Latency]
109bf44d649SXuan Hu    */
110239413e5SXuan Hu  def fuLatencyMap: Map[FuType.OHType, Int] = {
111bf44d649SXuan Hu    if (latencyCertain)
112bf44d649SXuan Hu      fuConfigs.map(x => (x.fuType, x.latency.latencyVal.get)).toMap
11323c67001SHaojin Tang    else if (hasUncertainLatencyVal)
114f9f1abd7SXuan Hu      fuConfigs.map(x => (x.fuType, x.latency.uncertainLatencyVal)).toMap.filter(_._2.nonEmpty).map(x => (x._1, x._2.get))
115bf44d649SXuan Hu    else
116bf44d649SXuan Hu      Map()
117bf44d649SXuan Hu  }
1186fa1007bSxiaofeibao-xjtu  def wakeUpFuLatencyMap: Map[FuType.OHType, Int] = {
1196fa1007bSxiaofeibao-xjtu    if (latencyCertain)
1206fa1007bSxiaofeibao-xjtu      fuConfigs.filterNot(_.hasNoDataWB).map(x => (x.fuType, x.latency.latencyVal.get)).toMap
1216fa1007bSxiaofeibao-xjtu    else if (hasUncertainLatencyVal)
1226fa1007bSxiaofeibao-xjtu      fuConfigs.filterNot(_.hasNoDataWB).map(x => (x.fuType, x.latency.uncertainLatencyVal.get)).toMap
1236fa1007bSxiaofeibao-xjtu    else
1246fa1007bSxiaofeibao-xjtu      Map()
1256fa1007bSxiaofeibao-xjtu  }
1262e0a7dc5Sfdy
127bf44d649SXuan Hu  /**
128bf44d649SXuan Hu    * Get set of latency of function units.
12923c67001SHaojin Tang    * If both [[latencyCertain]] and [[hasUncertainLatencyVal]] are false, get empty [[Set]]
130bf44d649SXuan Hu    *
131bf44d649SXuan Hu    * @return Set[Latency]
132bf44d649SXuan Hu    */
133bf44d649SXuan Hu  def fuLatancySet: Set[Int] = fuLatencyMap.values.toSet
1342e0a7dc5Sfdy
1356fa1007bSxiaofeibao-xjtu  def wakeUpFuLatancySet: Set[Int] = wakeUpFuLatencyMap.values.toSet
1366fa1007bSxiaofeibao-xjtu
137bf44d649SXuan Hu  def latencyValMax: Int = fuLatancySet.fold(0)(_ max _)
138bf44d649SXuan Hu
139239413e5SXuan Hu  def intFuLatencyMap: Map[FuType.OHType, Int] = {
140bf44d649SXuan Hu    if (intLatencyCertain)
141bf44d649SXuan Hu      writeIntFuConfigs.map(x => (x.fuType, x.latency.latencyVal.get)).toMap
142bf44d649SXuan Hu    else
143bf44d649SXuan Hu      Map()
144bf44d649SXuan Hu  }
145bf44d649SXuan Hu
146bf44d649SXuan Hu  def intLatencyValMax: Int = intFuLatencyMap.values.fold(0)(_ max _)
147bf44d649SXuan Hu
148239413e5SXuan Hu  def vfFuLatencyMap: Map[FuType.OHType, Int] = {
149bf44d649SXuan Hu    if (vfLatencyCertain)
150bf44d649SXuan Hu      writeVfFuConfigs.map(x => (x.fuType, x.latency.latencyVal.get)).toMap
151bf44d649SXuan Hu    else
152bf44d649SXuan Hu      Map()
153bf44d649SXuan Hu  }
154bf44d649SXuan Hu
155bf44d649SXuan Hu  def vfLatencyValMax: Int = vfFuLatencyMap.values.fold(0)(_ max _)
156bf44d649SXuan Hu
157bf44d649SXuan Hu  /**
158bf44d649SXuan Hu    * Check if this exu has fixed latency
159bf44d649SXuan Hu    */
160bf44d649SXuan Hu  def isFixedLatency: Boolean = {
161bf44d649SXuan Hu    if (latencyCertain)
162bf44d649SXuan Hu      return fuConfigs.map(x => x.latency.latencyVal.get == fuConfigs.head.latency.latencyVal.get).reduce(_ && _)
163bf44d649SXuan Hu    false
164bf44d649SXuan Hu  }
165ea0f92d8Sczw
166730cfbc0SXuan Hu  def hasCSR: Boolean = fuConfigs.map(_.isCsr).reduce(_ || _)
167730cfbc0SXuan Hu
168730cfbc0SXuan Hu  def hasFence: Boolean = fuConfigs.map(_.isFence).reduce(_ || _)
169730cfbc0SXuan Hu
170730cfbc0SXuan Hu  def hasBrhFu = fuConfigs.map(_.fuType == FuType.brh).reduce(_ || _)
171730cfbc0SXuan Hu
172730cfbc0SXuan Hu  def hasJmpFu = fuConfigs.map(_.fuType == FuType.jmp).reduce(_ || _)
173730cfbc0SXuan Hu
174670870b3SXuan Hu  def hasLoadFu = fuConfigs.map(_.name == "ldu").reduce(_ || _)
175730cfbc0SXuan Hu
1764ee69032SzhanglyGit  def hasVLoadFu = fuConfigs.map(_.fuType == FuType.vldu).reduce(_ || _)
1774ee69032SzhanglyGit
17820a5248fSzhanglinjuan  def hasVStoreFu = fuConfigs.map(_.fuType == FuType.vstu).reduce(_ || _)
17920a5248fSzhanglinjuan
180730cfbc0SXuan Hu  def hasStoreAddrFu = fuConfigs.map(_.name == "sta").reduce(_ || _)
181730cfbc0SXuan Hu
182730cfbc0SXuan Hu  def hasStdFu = fuConfigs.map(_.name == "std").reduce(_ || _)
183730cfbc0SXuan Hu
18420a5248fSzhanglinjuan  def hasMemAddrFu = hasLoadFu || hasStoreAddrFu || hasVLoadFu || hasHyldaFu || hasHystaFu || hasVLoadFu || hasVStoreFu
185730cfbc0SXuan Hu
186670870b3SXuan Hu  def hasHyldaFu = fuConfigs.map(_.name == "hylda").reduce(_ || _)
187670870b3SXuan Hu
188670870b3SXuan Hu  def hasHystaFu = fuConfigs.map(_.name == "hysta").reduce(_ || _)
189b133b458SXuan Hu
190272ec6b1SHaojin Tang  def hasLoadExu = hasLoadFu || hasHyldaFu
191272ec6b1SHaojin Tang
192272ec6b1SHaojin Tang  def hasStoreAddrExu = hasStoreAddrFu || hasHystaFu
193272ec6b1SHaojin Tang
194da778e6fSXuan Hu  def hasVecFu = fuConfigs.map(x => FuConfig.VecArithFuConfigs.contains(x)).reduce(_ || _)
195da778e6fSXuan Hu
196730cfbc0SXuan Hu  def getSrcDataType(srcIdx: Int): Set[DataConfig] = {
197730cfbc0SXuan Hu    fuConfigs.map(_.getSrcDataType(srcIdx)).reduce(_ ++ _)
198730cfbc0SXuan Hu  }
199730cfbc0SXuan Hu
200730cfbc0SXuan Hu  def immType: Set[UInt] = fuConfigs.map(x => x.immType).reduce(_ ++ _)
201730cfbc0SXuan Hu
202730cfbc0SXuan Hu  def getWBSource: SchedulerType = {
203730cfbc0SXuan Hu    schdType
204730cfbc0SXuan Hu  }
205730cfbc0SXuan Hu
206730cfbc0SXuan Hu  def hasCrossWb: Boolean = {
207730cfbc0SXuan Hu    schdType match {
208730cfbc0SXuan Hu      case IntScheduler() => writeFpRf || writeVecRf
209730cfbc0SXuan Hu      case VfScheduler() => writeIntRf
210730cfbc0SXuan Hu      case _ => false
211730cfbc0SXuan Hu    }
212730cfbc0SXuan Hu  }
213730cfbc0SXuan Hu
214730cfbc0SXuan Hu  def canAccept(fuType: UInt): Bool = {
215730cfbc0SXuan Hu    Cat(fuConfigs.map(_.fuType.U === fuType)).orR
216730cfbc0SXuan Hu  }
217730cfbc0SXuan Hu
218730cfbc0SXuan Hu  def hasUncertainLatency: Boolean = fuConfigs.map(_.latency.latencyVal.isEmpty).reduce(_ || _)
219730cfbc0SXuan Hu
220dd473fffSXuan Hu  def bindBackendParam(param: BackendParams): Unit = {
221dd473fffSXuan Hu    backendParam = param
222dd473fffSXuan Hu  }
223dd473fffSXuan Hu
224d387a573SXuan Hu  def updateIQWakeUpConfigs(cfgs: Seq[WakeUpConfig]) = {
225bf35baadSXuan Hu    this.iqWakeUpSourcePairs = cfgs.filter(_.source.name == this.name)
226bf35baadSXuan Hu    this.iqWakeUpSinkPairs = cfgs.filter(_.sink.name == this.name)
227b133b458SXuan Hu    if (this.isIQWakeUpSource) {
228670870b3SXuan Hu      require(!this.hasUncertainLatency || hasLoadFu || hasHyldaFu, s"${this.name} is a not-LDU IQ wake up source , but has UncertainLatency")
229bf35baadSXuan Hu    }
230b133b458SXuan Hu  }
231bf35baadSXuan Hu
232bf35baadSXuan Hu  def updateExuIdx(idx: Int): Unit = {
233bf35baadSXuan Hu    this.exuIdx = idx
234d387a573SXuan Hu  }
235d387a573SXuan Hu
236d387a573SXuan Hu  def isIQWakeUpSource = this.iqWakeUpSourcePairs.nonEmpty
237d387a573SXuan Hu
238d387a573SXuan Hu  def isIQWakeUpSink = this.iqWakeUpSinkPairs.nonEmpty
239d387a573SXuan Hu
240730cfbc0SXuan Hu  def getIntWBPort = {
241730cfbc0SXuan Hu    wbPortConfigs.collectFirst {
242730cfbc0SXuan Hu      case x: IntWB => x
243730cfbc0SXuan Hu    }
244730cfbc0SXuan Hu  }
245730cfbc0SXuan Hu
2460162f462Sczw  def getVfWBPort = {
247730cfbc0SXuan Hu    wbPortConfigs.collectFirst {
2480162f462Sczw      case x: VfWB => x
249730cfbc0SXuan Hu    }
250730cfbc0SXuan Hu  }
251730cfbc0SXuan Hu
25239c59369SXuan Hu  /**
25339c59369SXuan Hu    * Get the [[DataConfig]] that this exu need to read
25439c59369SXuan Hu    */
25539c59369SXuan Hu  def pregRdDataCfgSet: Set[DataConfig] = {
25639c59369SXuan Hu    this.rfrPortConfigs.flatten.map(_.getDataConfig).toSet
25739c59369SXuan Hu  }
25839c59369SXuan Hu
25939c59369SXuan Hu  /**
26039c59369SXuan Hu    * Get the [[DataConfig]] that this exu need to write
26139c59369SXuan Hu    */
26239c59369SXuan Hu  def pregWbDataCfgSet: Set[DataConfig] = {
26339c59369SXuan Hu    this.wbPortConfigs.map(_.dataCfg).toSet
26439c59369SXuan Hu  }
26539c59369SXuan Hu
266730cfbc0SXuan Hu  def getRfReadDataCfgSet: Seq[Set[DataConfig]] = {
267730cfbc0SXuan Hu    val fuSrcsCfgSet: Seq[Seq[Set[DataConfig]]] = fuConfigs.map(_.getRfReadDataCfgSet)
268730cfbc0SXuan Hu    val alignedFuSrcsCfgSet: Seq[Seq[Set[DataConfig]]] = fuSrcsCfgSet.map(x => x ++ Seq.fill(numRegSrc - x.length)(Set[DataConfig]()))
269730cfbc0SXuan Hu
270730cfbc0SXuan Hu    val exuSrcsCfgSet = alignedFuSrcsCfgSet.reduce((x, y) => (x zip y).map { case (cfg1, cfg2) => cfg1 union cfg2 })
271730cfbc0SXuan Hu
272730cfbc0SXuan Hu    exuSrcsCfgSet
273730cfbc0SXuan Hu  }
274730cfbc0SXuan Hu
27539c59369SXuan Hu  /**
27639c59369SXuan Hu    * Get the [[DataConfig]] mapped indices of source data of exu
27739c59369SXuan Hu    *
27839c59369SXuan Hu    * @example
27939c59369SXuan Hu    * {{{
28039c59369SXuan Hu    *   fuCfg.srcData = Seq(VecData(), VecData(), VecData(), MaskSrcData(), VConfigData())
28139c59369SXuan Hu    *   getRfReadSrcIdx(VecData()) = Seq(0, 1, 2)
28239c59369SXuan Hu    *   getRfReadSrcIdx(MaskSrcData()) = Seq(3)
28339c59369SXuan Hu    *   getRfReadSrcIdx(VConfigData()) = Seq(4)
28439c59369SXuan Hu    * }}}
28539c59369SXuan Hu    * @return Map[DataConfig -> Seq[indices]]
28639c59369SXuan Hu    */
28739c59369SXuan Hu  def getRfReadSrcIdx: Map[DataConfig, Seq[Int]] = {
28839c59369SXuan Hu    val dataCfgs = DataConfig.RegSrcDataSet
28939c59369SXuan Hu    val rfRdDataCfgSet = this.getRfReadDataCfgSet
29039c59369SXuan Hu    dataCfgs.toSeq.map { cfg =>
29139c59369SXuan Hu      (
29239c59369SXuan Hu        cfg,
29339c59369SXuan Hu        rfRdDataCfgSet.zipWithIndex.map { case (set, srcIdx) =>
29439c59369SXuan Hu          if (set.contains(cfg))
29539c59369SXuan Hu            Option(srcIdx)
29639c59369SXuan Hu          else
29739c59369SXuan Hu            None
29839c59369SXuan Hu        }.filter(_.nonEmpty).map(_.get)
29939c59369SXuan Hu      )
30039c59369SXuan Hu    }.toMap
30139c59369SXuan Hu  }
30239c59369SXuan Hu
303730cfbc0SXuan Hu  def genExuModule(implicit p: Parameters): ExeUnit = {
304730cfbc0SXuan Hu    new ExeUnit(this)
305730cfbc0SXuan Hu  }
306730cfbc0SXuan Hu
307730cfbc0SXuan Hu  def genExuInputBundle(implicit p: Parameters): ExuInput = {
308730cfbc0SXuan Hu    new ExuInput(this)
309730cfbc0SXuan Hu  }
310730cfbc0SXuan Hu
311730cfbc0SXuan Hu  def genExuOutputBundle(implicit p: Parameters): ExuOutput = {
312730cfbc0SXuan Hu    new ExuOutput(this)
313730cfbc0SXuan Hu  }
3145d2b9cadSXuan Hu
3155d2b9cadSXuan Hu  def genExuBypassBundle(implicit p: Parameters): ExuBypassBundle = {
3165d2b9cadSXuan Hu    new ExuBypassBundle(this)
3175d2b9cadSXuan Hu  }
318730cfbc0SXuan Hu}
319