xref: /XiangShan/src/main/scala/xiangshan/backend/fu/FuConfig.scala (revision c590fb326b3540db0e5d81d49ff03b6158012466)
1730cfbc0SXuan Hupackage xiangshan.backend.fu
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4730cfbc0SXuan Huimport chisel3._
5239413e5SXuan Huimport utils.EnumUtils.OHEnumeration
6730cfbc0SXuan Huimport xiangshan.ExceptionNO._
7730cfbc0SXuan Huimport xiangshan.SelImm
8007f6122SXuan Huimport xiangshan.backend.fu.fpu.{IntToFP, IntFPToVec}
960f0c5aeSxiaofeibaoimport xiangshan.backend.fu.wrapper._
10730cfbc0SXuan Huimport xiangshan.backend.Bundles.ExuInput
11730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig._
12*c590fb32Scz4eimport xiangshan.mem.Std
13730cfbc0SXuan Hu
1474aafe69SXuan Hu/**
1574aafe69SXuan Hu  *
1674aafe69SXuan Hu  * @param name [[String]] name of fuConfig
1774aafe69SXuan Hu  * @param fuType [[Int]] type of func, select from [[xiangshan.backend.fu.FuType]]
1874aafe69SXuan Hu  * @param fuGen how to create $fu
1974aafe69SXuan Hu  * @param srcData type of src data used by this $fu
2078115a00SXuan Hu  * @param piped if the $fu is pipelined
2174aafe69SXuan Hu  * @param maybeBlock the $fu need ready signal to block internal pipeline
2274aafe69SXuan Hu  * @param writeIntRf the $fu write int regfiles
2374aafe69SXuan Hu  * @param writeFpRf the $fu write float regfiles
2474aafe69SXuan Hu  * @param writeVecRf the $fu write vector regfiles
25b8db7211Sxiaofeibao  * @param writeV0Rf the $fu write v0 regfiles
26b8db7211Sxiaofeibao  * @param writeVlRf the $fu write vl regfiles
2774aafe69SXuan Hu  * @param writeFflags the $fu write fflags csr
2874aafe69SXuan Hu  * @param writeVxsat the $fu write vxsat csr
292d12882cSxiaofeibao  * @param destDataBits the width of output data in the $fu
302d12882cSxiaofeibao  * @param srcDataBits the width of input data in the $fu, the default value is destDataBits
3174aafe69SXuan Hu  * @param latency the latency of instuction executed in the $fu
3274aafe69SXuan Hu  * @param hasInputBuffer if the $fu has input buffer
3374aafe69SXuan Hu  * @param exceptionOut the $fu can produce these exception
3474aafe69SXuan Hu  * @param hasLoadError if the $fu has load error out
3574aafe69SXuan Hu  * @param flushPipe if the instuction executed in the $fu need flush out
3674aafe69SXuan Hu  * @param replayInst if the instuction executed in the $fu can replay in some condition
3774aafe69SXuan Hu  * @param trigger if the $fu need trigger out
3874aafe69SXuan Hu  * @param needSrcFrm if the $fu need float rounding mode signal
3917985fbbSZiyue Zhang  * @param needSrcVxrm if the $fu need vector fixed-point rounding mode signal
4074aafe69SXuan Hu  * @param immType the immediate type of this $fu
4174aafe69SXuan Hu  * @param vconfigWakeUp
4274aafe69SXuan Hu  * @param maskWakeUp
4374aafe69SXuan Hu  *
4474aafe69SXuan Hu  * @define fu function unit
4574aafe69SXuan Hu  */
46730cfbc0SXuan Hucase class FuConfig (
47730cfbc0SXuan Hu  name          : String,
48239413e5SXuan Hu  fuType        : FuType.OHType,
49730cfbc0SXuan Hu  fuGen         : (Parameters, FuConfig) => FuncUnit,
50730cfbc0SXuan Hu  srcData       : Seq[Seq[DataConfig]],
5178115a00SXuan Hu  piped         : Boolean,
5274aafe69SXuan Hu  maybeBlock    : Boolean = false,
53438d9a22SXuan Hu  writeIntRf    : Boolean = false,
54438d9a22SXuan Hu  writeFpRf     : Boolean = false,
55730cfbc0SXuan Hu  writeVecRf    : Boolean = false,
562aa3a761Ssinsanction  writeV0Rf     : Boolean = false,
572aa3a761Ssinsanction  writeVlRf     : Boolean = false,
585edcc45fSHaojin Tang  writeFakeIntRf: Boolean = false,
59730cfbc0SXuan Hu  writeFflags   : Boolean = false,
60a8db15d8Sfdy  writeVxsat    : Boolean = false,
612d12882cSxiaofeibao  destDataBits  : Int = 64,
622d12882cSxiaofeibao  srcDataBits   : Option[Int] = None,
630ed0e482SGuanghui Cheng  srcNeedCopy   : Boolean = false,
649e200047Slewislzh  latency       : HasFuLatency = CertainLatency(0),// two field (base latency, extra latency(option))
65730cfbc0SXuan Hu  hasInputBuffer: (Boolean, Int, Boolean) = (false, 0, false),
66730cfbc0SXuan Hu  exceptionOut  : Seq[Int] = Seq(),
67730cfbc0SXuan Hu  hasLoadError  : Boolean = false,
68730cfbc0SXuan Hu  flushPipe     : Boolean = false,
69730cfbc0SXuan Hu  replayInst    : Boolean = false,
70730cfbc0SXuan Hu  trigger       : Boolean = false,
71730cfbc0SXuan Hu  needSrcFrm    : Boolean = false,
7217985fbbSZiyue Zhang  needSrcVxrm   : Boolean = false,
737e4f0b19SZiyue-Zhang  writeVType    : Boolean = false,
74730cfbc0SXuan Hu  immType       : Set[UInt] = Set(),
7574aafe69SXuan Hu  // vector
7674aafe69SXuan Hu  vconfigWakeUp : Boolean = false,
7774aafe69SXuan Hu  maskWakeUp    : Boolean = false,
78730cfbc0SXuan Hu) {
795edcc45fSHaojin Tang  def needIntWen: Boolean = writeIntRf || writeFakeIntRf
805edcc45fSHaojin Tang  def needFpWen:  Boolean = writeFpRf
815edcc45fSHaojin Tang  def needVecWen: Boolean = writeVecRf
82de8bd1d0Ssinsanction  def needV0Wen:  Boolean = writeV0Rf
83de8bd1d0Ssinsanction  def needVlWen:  Boolean = writeVlRf
8474aafe69SXuan Hu  var vconfigIdx = -1
8574aafe69SXuan Hu  var maskSrcIdx = -1
8674aafe69SXuan Hu  if (vconfigWakeUp) {
87e4e52e7dSsinsanction    vconfigIdx = getSpecialSrcIdx(VlData(), "when vconfigWakeUp is true, srcData must always contains VlData()")
8874aafe69SXuan Hu  }
8974aafe69SXuan Hu  if (maskWakeUp) {
90e4e52e7dSsinsanction    maskSrcIdx = getSpecialSrcIdx(V0Data(), "when maskWakeUp is true, srcData must always contains V0Data()")
9174aafe69SXuan Hu  }
9274aafe69SXuan Hu
9374aafe69SXuan Hu  require(!piped || piped && latency.latencyVal.isDefined, "The latency value must be set when piped is enable")
9474aafe69SXuan Hu  require(!vconfigWakeUp || vconfigWakeUp && vconfigIdx >= 0, "The index of vl src must be set when vlWakeUp is enable")
9574aafe69SXuan Hu  require(!maskWakeUp || maskWakeUp && maskSrcIdx >= 0, "The index of mask src must be set when vlWakeUp is enable")
9674aafe69SXuan Hu
97670870b3SXuan Hu  def numIntSrc : Int = srcData.map(_.count(x => IntRegSrcDataSet.contains(x))).fold(0)(_ max _)
98670870b3SXuan Hu  def numFpSrc  : Int = srcData.map(_.count(x => FpRegSrcDataSet.contains(x))).fold(0)(_ max _)
99670870b3SXuan Hu  def numVecSrc : Int = srcData.map(_.count(x => VecRegSrcDataSet.contains(x))).fold(0)(_ max _)
100fbe46a0aSxiaofeibao  def numVfSrc  : Int = srcData.map(_.count(x => VecRegSrcDataSet.contains(x))).fold(0)(_ max _)
101de8bd1d0Ssinsanction  def numV0Src  : Int = srcData.map(_.count(x => V0RegSrcDataSet.contains(x))).fold(0)(_ max _)
102de8bd1d0Ssinsanction  def numVlSrc  : Int = srcData.map(_.count(x => VlRegSrcDataSet.contains(x))).fold(0)(_ max _)
103670870b3SXuan Hu  def numRegSrc : Int = srcData.map(_.count(x => RegSrcDataSet.contains(x))).fold(0)(_ max _)
104670870b3SXuan Hu  def numSrc    : Int = srcData.map(_.length).fold(0)(_ max _)
105730cfbc0SXuan Hu
106730cfbc0SXuan Hu  def readFp: Boolean = numFpSrc > 0
107730cfbc0SXuan Hu
108730cfbc0SXuan Hu  def fuSel(uop: ExuInput): Bool = {
109730cfbc0SXuan Hu    // Don't add more shit here!!!
110730cfbc0SXuan Hu    // Todo: add new FuType to distinguish f2i, f2f
111730cfbc0SXuan Hu    uop.fuType === this.fuType.U
112730cfbc0SXuan Hu  }
113730cfbc0SXuan Hu
114730cfbc0SXuan Hu  /**
115730cfbc0SXuan Hu    * params(i): data type set of the ith src port
116730cfbc0SXuan Hu    * @return
117730cfbc0SXuan Hu    */
118730cfbc0SXuan Hu  def getRfReadDataCfgSet: Seq[Set[DataConfig]] = {
119670870b3SXuan Hu    val numSrcMax = srcData.map(_.length).fold(0)(_ max _)
120730cfbc0SXuan Hu    // make srcData is uniform sized to avoid exception when transpose
121730cfbc0SXuan Hu    val alignedSrcData: Seq[Seq[DataConfig]] = srcData.map(x => x ++ Seq.fill(numSrcMax - x.length)(null))
122730cfbc0SXuan Hu    alignedSrcData.transpose.map(_.toSet.intersect(RegSrcDataSet))
123730cfbc0SXuan Hu  }
124730cfbc0SXuan Hu
125730cfbc0SXuan Hu  def getSrcDataType(srcIdx: Int): Set[DataConfig] = {
126730cfbc0SXuan Hu    srcData
127730cfbc0SXuan Hu      .map((x: Seq[DataConfig]) => if(x.isDefinedAt(srcIdx)) Some(x(srcIdx)) else None)
128730cfbc0SXuan Hu      .filter(_.nonEmpty)
129730cfbc0SXuan Hu      .map(_.get)
130730cfbc0SXuan Hu      .toSet
131730cfbc0SXuan Hu  }
132730cfbc0SXuan Hu
133730cfbc0SXuan Hu  def hasNoDataWB: Boolean = {
134b8db7211Sxiaofeibao    !(writeIntRf || writeFpRf || writeVecRf || writeV0Rf || writeVlRf)
135730cfbc0SXuan Hu  }
136730cfbc0SXuan Hu
137730cfbc0SXuan Hu  def getSrcMaxWidthVec = {
138730cfbc0SXuan Hu    getRfReadDataCfgSet.map(_.map(_.dataWidth).max)
139730cfbc0SXuan Hu  }
140730cfbc0SXuan Hu
141730cfbc0SXuan Hu  def genSrcDataVec: Seq[UInt] = {
142730cfbc0SXuan Hu    getSrcMaxWidthVec.map(w => UInt(w.W))
143730cfbc0SXuan Hu  }
144730cfbc0SXuan Hu
145dcdd1406SXuan Hu  // csr's redirect also uses redirect bundle
146dcdd1406SXuan Hu  def hasRedirect: Boolean = Seq(FuType.jmp, FuType.brh, FuType.csr).contains(fuType)
147730cfbc0SXuan Hu
1489d8d7860SXuan Hu  def hasPredecode: Boolean = Seq(FuType.jmp, FuType.brh, FuType.csr, FuType.ldu).contains(fuType)
1499d8d7860SXuan Hu
150c37914a4Sxiaofeibao  def needTargetPc: Boolean = Seq(FuType.jmp, FuType.brh).contains(fuType)
1519d8d7860SXuan Hu
1529d8d7860SXuan Hu  // predict info
1539d8d7860SXuan Hu  def needPdInfo: Boolean = Seq(FuType.jmp, FuType.brh, FuType.csr).contains(fuType)
154730cfbc0SXuan Hu
155c37914a4Sxiaofeibao  def needPc: Boolean = Seq(FuType.jmp, FuType.brh, FuType.ldu).contains(fuType)
156730cfbc0SXuan Hu
157730cfbc0SXuan Hu  def needFPUCtrl: Boolean = {
158730cfbc0SXuan Hu    import FuType._
15960f0c5aeSxiaofeibao    Seq(fmac, fDivSqrt, i2f).contains(fuType)
160730cfbc0SXuan Hu  }
161730cfbc0SXuan Hu
1626a35d972SXuan Hu  def needVecCtrl: Boolean = {
1636a35d972SXuan Hu    import FuType._
16439be24bcSxiaofeibao    Seq(vipu, vialuF, vimac, vidiv, vfpu, vppu, vfalu, vfma, vfdiv, vfcvt, vldu, vstu).contains(fuType)
1656a35d972SXuan Hu  }
1666a35d972SXuan Hu
16785a8d7caSZehao Liu  def needCriticalErrors: Boolean = Seq(FuType.csr).contains(fuType)
16885a8d7caSZehao Liu
169730cfbc0SXuan Hu  def isMul: Boolean = fuType == FuType.mul
170730cfbc0SXuan Hu
171730cfbc0SXuan Hu  def isDiv: Boolean = fuType == FuType.div
172730cfbc0SXuan Hu
173730cfbc0SXuan Hu  def isCsr: Boolean = fuType == FuType.csr
174730cfbc0SXuan Hu
175c1b28b66STang Haojin  def isBrh: Boolean = fuType == FuType.brh
176c1b28b66STang Haojin
177c1b28b66STang Haojin  def isJmp: Boolean = fuType == FuType.jmp
178c1b28b66STang Haojin
179730cfbc0SXuan Hu  def isFence: Boolean = fuType == FuType.fence
18074aafe69SXuan Hu
18199bd2aafSHaojin Tang  def isVecArith: Boolean = fuType == FuType.vialuF || fuType == FuType.vimac ||
18299bd2aafSHaojin Tang                            fuType == FuType.vppu || fuType == FuType.vipu ||
18399bd2aafSHaojin Tang                            fuType == FuType.vfalu || fuType == FuType.vfma ||
1840bca6cb3SZiyue Zhang                            fuType == FuType.vfdiv || fuType == FuType.vfcvt ||
1850bca6cb3SZiyue Zhang                            fuType == FuType.vidiv
18699bd2aafSHaojin Tang
18742b6cdf9Ssinsanction  def isVecMem: Boolean = fuType == FuType.vldu || fuType == FuType.vstu ||
18842b6cdf9Ssinsanction                          fuType == FuType.vsegldu || fuType == FuType.vsegstu
18942b6cdf9Ssinsanction
19042b6cdf9Ssinsanction  def needOg2: Boolean = isVecArith || fuType == FuType.vsetfwf || isVecMem
191c38df446SzhanglyGit
19299bd2aafSHaojin Tang  def isSta: Boolean = name.contains("sta")
19399bd2aafSHaojin Tang
194472967baSxiaofeibao  def isStd: Boolean = name.contains("std")
195472967baSxiaofeibao
1967ffbf5fdSZhaoyang You  def ckAlwaysEn: Boolean = isCsr || isFence
19729275910SsinceforYy
19874aafe69SXuan Hu  /**
19907b5cc60Sxiaofeibao    * Get index of special src data, like [[VlData]], [[V0Data]]
20007b5cc60Sxiaofeibao   *
20174aafe69SXuan Hu    * @param data [[DataConfig]]
20274aafe69SXuan Hu    * @param tips tips if get failed
20374aafe69SXuan Hu    * @return the index of special src data
20474aafe69SXuan Hu    */
20574aafe69SXuan Hu  protected def getSpecialSrcIdx(data: DataConfig, tips: String): Int = {
20674aafe69SXuan Hu    val srcIdxVec = srcData.map(x => x.indexOf(data))
20774aafe69SXuan Hu    val idx0 = srcIdxVec.head
20874aafe69SXuan Hu    for (idx <- srcIdxVec) {
20974aafe69SXuan Hu      require(idx >= 0 && idx == idx0, tips + ", and at the same index.")
21074aafe69SXuan Hu    }
21174aafe69SXuan Hu    idx0
21274aafe69SXuan Hu  }
213b6b11f60SXuan Hu
214b6b11f60SXuan Hu  override def toString: String = {
215b6b11f60SXuan Hu    var str = s"${this.name}: "
216b6b11f60SXuan Hu    if (vconfigWakeUp) str += s"vconfigIdx($vconfigIdx), "
217b6b11f60SXuan Hu    if (maskWakeUp) str += s"maskSrcIdx($maskSrcIdx), "
218b6b11f60SXuan Hu    str += s"latency($latency)"
219670870b3SXuan Hu    str += s"src($srcData)"
220b6b11f60SXuan Hu    str
221b6b11f60SXuan Hu  }
222730cfbc0SXuan Hu}
223730cfbc0SXuan Hu
224730cfbc0SXuan Huobject FuConfig {
225730cfbc0SXuan Hu  val JmpCfg: FuConfig = FuConfig (
226730cfbc0SXuan Hu    name = "jmp",
227730cfbc0SXuan Hu    fuType = FuType.jmp,
228730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new JumpUnit(cfg)(p)).suggestName("jmp"),
229730cfbc0SXuan Hu    srcData = Seq(
230730cfbc0SXuan Hu      Seq(IntData()), // jal
231730cfbc0SXuan Hu    ),
23278115a00SXuan Hu    piped = true,
233730cfbc0SXuan Hu    writeIntRf = true,
234730cfbc0SXuan Hu    immType = Set(SelImm.IMM_I, SelImm.IMM_UJ, SelImm.IMM_U),
235730cfbc0SXuan Hu  )
236730cfbc0SXuan Hu
237730cfbc0SXuan Hu  val BrhCfg: FuConfig = FuConfig (
238730cfbc0SXuan Hu    name = "brh",
239730cfbc0SXuan Hu    fuType = FuType.brh,
240730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new BranchUnit(cfg)(p).suggestName("brh")),
241730cfbc0SXuan Hu    srcData = Seq(
242730cfbc0SXuan Hu      Seq(IntData(), IntData()),
243730cfbc0SXuan Hu    ),
24478115a00SXuan Hu    piped = true,
245730cfbc0SXuan Hu    immType = Set(SelImm.IMM_SB),
246730cfbc0SXuan Hu  )
247730cfbc0SXuan Hu
248730cfbc0SXuan Hu  val I2fCfg: FuConfig = FuConfig (
249730cfbc0SXuan Hu    name = "i2f",
250730cfbc0SXuan Hu    FuType.i2f,
251730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new IntToFP(cfg)(p).suggestName("i2f")),
252730cfbc0SXuan Hu    srcData = Seq(
253730cfbc0SXuan Hu      Seq(IntData()),
254730cfbc0SXuan Hu    ),
25578115a00SXuan Hu    piped = true,
256730cfbc0SXuan Hu    writeFpRf = true,
257730cfbc0SXuan Hu    writeFflags = true,
258730cfbc0SXuan Hu    latency = CertainLatency(2),
259730cfbc0SXuan Hu    needSrcFrm = true,
260730cfbc0SXuan Hu  )
261730cfbc0SXuan Hu
262fc85f18fSZiyue Zhang  val I2vCfg: FuConfig = FuConfig (
263fc85f18fSZiyue Zhang    name = "i2v",
264fc85f18fSZiyue Zhang    FuType.i2v,
265395c8649SZiyue-Zhang    fuGen = (p: Parameters, cfg: FuConfig) => Module(new IntFPToVec(cfg)(p).suggestName("i2v")),
266fc85f18fSZiyue Zhang    srcData = Seq(
267fc85f18fSZiyue Zhang      Seq(IntData(), IntData()),
268fc85f18fSZiyue Zhang    ),
269fc85f18fSZiyue Zhang    piped = true,
270964d9a87SZiyue Zhang    writeFpRf = true,
271fc85f18fSZiyue Zhang    writeVecRf = true,
272b8db7211Sxiaofeibao    writeV0Rf = true,
273d6059658SZiyue Zhang    latency = CertainLatency(0),
2742d12882cSxiaofeibao    destDataBits = 128,
2752d12882cSxiaofeibao    srcDataBits = Some(64),
276c2ce03f7SZiyue Zhang    immType = Set(SelImm.IMM_OPIVIU, SelImm.IMM_OPIVIS, SelImm.IMM_VRORVI),
277fc85f18fSZiyue Zhang  )
278fc85f18fSZiyue Zhang
279395c8649SZiyue-Zhang  val F2vCfg: FuConfig = FuConfig (
280395c8649SZiyue-Zhang    name = "f2v",
281395c8649SZiyue-Zhang    FuType.f2v,
282395c8649SZiyue-Zhang    fuGen = (p: Parameters, cfg: FuConfig) => Module(new IntFPToVec(cfg)(p).suggestName("f2v")),
283395c8649SZiyue-Zhang    srcData = Seq(
284395c8649SZiyue-Zhang      Seq(FpData(), FpData()),
285395c8649SZiyue-Zhang      Seq(FpData()),
286395c8649SZiyue-Zhang    ),
287395c8649SZiyue-Zhang    piped = true,
28820b2b626SsinceforYy    writeFpRf = true,
289395c8649SZiyue-Zhang    writeVecRf = true,
290b8db7211Sxiaofeibao    writeV0Rf = true,
291395c8649SZiyue-Zhang    latency = CertainLatency(0),
2922d12882cSxiaofeibao    destDataBits = 128,
2932d12882cSxiaofeibao    srcDataBits = Some(64),
294395c8649SZiyue-Zhang  )
295395c8649SZiyue-Zhang
296730cfbc0SXuan Hu  val CsrCfg: FuConfig = FuConfig (
297730cfbc0SXuan Hu    name = "csr",
298730cfbc0SXuan Hu    fuType = FuType.csr,
299730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new CSR(cfg)(p).suggestName("csr")),
300730cfbc0SXuan Hu    srcData = Seq(
301730cfbc0SXuan Hu      Seq(IntData()),
302730cfbc0SXuan Hu    ),
3032b6ba927SsinceforYy    piped = false,
304730cfbc0SXuan Hu    writeIntRf = true,
3052b6ba927SsinceforYy    latency = UncertainLatency(),
3061af31f11SXiaokun-Pei    exceptionOut = Seq(illegalInstr, virtualInstr, breakPoint, ecallU, ecallS, ecallVS, ecallM),
30778115a00SXuan Hu    flushPipe = true,
308730cfbc0SXuan Hu  )
309730cfbc0SXuan Hu
310730cfbc0SXuan Hu  val AluCfg: FuConfig = FuConfig (
311730cfbc0SXuan Hu    name = "alu",
312730cfbc0SXuan Hu    fuType = FuType.alu,
313730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new Alu(cfg)(p).suggestName("Alu")),
314730cfbc0SXuan Hu    srcData = Seq(
315730cfbc0SXuan Hu      Seq(IntData(), IntData()),
316730cfbc0SXuan Hu    ),
31778115a00SXuan Hu    piped = true,
318730cfbc0SXuan Hu    writeIntRf = true,
319fe528fd6Ssinsanction    immType = Set(SelImm.IMM_I, SelImm.IMM_U, SelImm.IMM_LUI32),
320730cfbc0SXuan Hu  )
321730cfbc0SXuan Hu
322730cfbc0SXuan Hu  val MulCfg: FuConfig = FuConfig (
323730cfbc0SXuan Hu    name = "mul",
324730cfbc0SXuan Hu    fuType = FuType.mul,
325730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new MulUnit(cfg)(p).suggestName("Mul")),
326730cfbc0SXuan Hu    srcData = Seq(
327730cfbc0SXuan Hu      Seq(IntData(), IntData()),
328730cfbc0SXuan Hu    ),
32978115a00SXuan Hu    piped = true,
330730cfbc0SXuan Hu    writeIntRf = true,
331730cfbc0SXuan Hu    latency = CertainLatency(2),
332730cfbc0SXuan Hu  )
333730cfbc0SXuan Hu
334730cfbc0SXuan Hu  val DivCfg: FuConfig = FuConfig (
335730cfbc0SXuan Hu    name = "div",
336730cfbc0SXuan Hu    fuType = FuType.div,
337730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new DivUnit(cfg)(p).suggestName("Div")),
338730cfbc0SXuan Hu    srcData = Seq(
339730cfbc0SXuan Hu      Seq(IntData(), IntData()),
340730cfbc0SXuan Hu    ),
34178115a00SXuan Hu    piped = false,
342730cfbc0SXuan Hu    writeIntRf = true,
343730cfbc0SXuan Hu    latency = UncertainLatency(),
344730cfbc0SXuan Hu    hasInputBuffer = (true, 4, true)
345730cfbc0SXuan Hu  )
346730cfbc0SXuan Hu
347730cfbc0SXuan Hu  val FenceCfg: FuConfig = FuConfig (
348730cfbc0SXuan Hu    name = "fence",
349730cfbc0SXuan Hu    FuType.fence,
350730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new Fence(cfg)(p).suggestName("Fence")),
351730cfbc0SXuan Hu    srcData = Seq(
352730cfbc0SXuan Hu      Seq(IntData(), IntData()),
353730cfbc0SXuan Hu    ),
3542b6ba927SsinceforYy    piped = false,
3552b6ba927SsinceforYy    latency = UncertainLatency(),
3561af31f11SXiaokun-Pei    exceptionOut = Seq(illegalInstr, virtualInstr),
357730cfbc0SXuan Hu    flushPipe = true
358730cfbc0SXuan Hu  )
359730cfbc0SXuan Hu
360730cfbc0SXuan Hu  // Todo: split it to simple bitmap exu and complex bku
361730cfbc0SXuan Hu  val BkuCfg: FuConfig = FuConfig (
362730cfbc0SXuan Hu    name = "bku",
363730cfbc0SXuan Hu    fuType = FuType.bku,
364730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new Bku(cfg)(p).suggestName("Bku")),
365730cfbc0SXuan Hu    srcData = Seq(
366730cfbc0SXuan Hu      Seq(IntData(), IntData()),
367730cfbc0SXuan Hu    ),
36878115a00SXuan Hu    piped = true,
369730cfbc0SXuan Hu    writeIntRf = true,
370c4af9849SzhanglyGit    latency = CertainLatency(2),
371730cfbc0SXuan Hu  )
372730cfbc0SXuan Hu
373a8db15d8Sfdy  val VSetRvfWvfCfg: FuConfig = FuConfig(
374a8db15d8Sfdy    name = "vsetrvfwvf",
375b1712600SZiyue Zhang    fuType = FuType.vsetfwf,
376a8db15d8Sfdy    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VSetRvfWvf(cfg)(p).suggestName("VSetRvfWvf")),
377d91483a6Sfdy    srcData = Seq(
378b37ee2eeSZiyue-Zhang      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()),  // vs1, vs2, vd_old, v0, vtype&vl
379d91483a6Sfdy    ),
38078115a00SXuan Hu    piped = true,
381b8db7211Sxiaofeibao    writeVlRf = true,
3827e4f0b19SZiyue-Zhang    writeVType = true,
38387c5d21dSZiyue Zhang    writeIntRf = true,
384d91483a6Sfdy    latency = CertainLatency(0),
385d91483a6Sfdy    immType = Set(SelImm.IMM_VSETVLI, SelImm.IMM_VSETIVLI),
386d91483a6Sfdy  )
387d91483a6Sfdy
388a8db15d8Sfdy  val VSetRiWvfCfg: FuConfig = FuConfig(
389a8db15d8Sfdy    name = "vsetriwvf",
390d91483a6Sfdy    fuType = FuType.vsetiwf,
391a8db15d8Sfdy    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VSetRiWvf(cfg)(p).suggestName("VSetRiWvf")),
392d91483a6Sfdy    srcData = Seq(
393d91483a6Sfdy      Seq(IntData(), IntData()),
394d91483a6Sfdy    ),
39578115a00SXuan Hu    piped = true,
396b8db7211Sxiaofeibao    writeVlRf = true,
3977e4f0b19SZiyue-Zhang    writeVType = true,
398d91483a6Sfdy    latency = CertainLatency(0),
399d91483a6Sfdy    immType = Set(SelImm.IMM_VSETVLI, SelImm.IMM_VSETIVLI),
400d91483a6Sfdy  )
401d91483a6Sfdy
402a8db15d8Sfdy  val VSetRiWiCfg: FuConfig = FuConfig(
403a8db15d8Sfdy    name = "vsetriwi",
404d91483a6Sfdy    fuType = FuType.vsetiwi,
405a8db15d8Sfdy    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VSetRiWi(cfg)(p).suggestName("VSetRiWi")),
406730cfbc0SXuan Hu    srcData = Seq(
407730cfbc0SXuan Hu      Seq(IntData(), IntData()),
408730cfbc0SXuan Hu    ),
40978115a00SXuan Hu    piped = true,
410730cfbc0SXuan Hu    writeIntRf = true,
411d91483a6Sfdy    latency = CertainLatency(0),
412d91483a6Sfdy    immType = Set(SelImm.IMM_VSETVLI, SelImm.IMM_VSETIVLI),
413730cfbc0SXuan Hu  )
414730cfbc0SXuan Hu
415730cfbc0SXuan Hu  val LduCfg: FuConfig = FuConfig (
416730cfbc0SXuan Hu    name = "ldu",
417730cfbc0SXuan Hu    fuType = FuType.ldu,
418730cfbc0SXuan Hu    fuGen = null, // Todo
419730cfbc0SXuan Hu    srcData = Seq(
420730cfbc0SXuan Hu      Seq(IntData()),
421730cfbc0SXuan Hu    ),
42278115a00SXuan Hu    piped = false, // Todo: check it
423730cfbc0SXuan Hu    writeIntRf = true,
424730cfbc0SXuan Hu    writeFpRf = true,
42523c67001SHaojin Tang    latency = UncertainLatency(3),
42672dab974Scz4e    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault, loadGuestPageFault, breakPoint, hardwareError),
427730cfbc0SXuan Hu    flushPipe = true,
428730cfbc0SXuan Hu    replayInst = true,
429730cfbc0SXuan Hu    hasLoadError = true,
430f7af4c74Schengguanghui    trigger = true,
431730cfbc0SXuan Hu    immType = Set(SelImm.IMM_I),
432730cfbc0SXuan Hu  )
433730cfbc0SXuan Hu
434730cfbc0SXuan Hu  val StaCfg: FuConfig = FuConfig (
435730cfbc0SXuan Hu    name = "sta",
436730cfbc0SXuan Hu    fuType = FuType.stu,
437730cfbc0SXuan Hu    fuGen = null, // Todo
438730cfbc0SXuan Hu    srcData = Seq(
439730cfbc0SXuan Hu      Seq(IntData()),
440730cfbc0SXuan Hu    ),
44178115a00SXuan Hu    piped = false,
442730cfbc0SXuan Hu    latency = UncertainLatency(),
44304b415dbSchengguanghui    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, storeGuestPageFault, breakPoint),
44441d8d239Shappy-lx    flushPipe = true,
445f7af4c74Schengguanghui    trigger = true,
446730cfbc0SXuan Hu    immType = Set(SelImm.IMM_S),
447730cfbc0SXuan Hu  )
448730cfbc0SXuan Hu
449730cfbc0SXuan Hu  val StdCfg: FuConfig = FuConfig (
450730cfbc0SXuan Hu    name = "std",
451730cfbc0SXuan Hu    fuType = FuType.stu,
452730cfbc0SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new Std(cfg)(p).suggestName("Std")),
453730cfbc0SXuan Hu    srcData = Seq(
454730cfbc0SXuan Hu      Seq(IntData()),
455730cfbc0SXuan Hu      Seq(FpData()),
456730cfbc0SXuan Hu    ),
45778115a00SXuan Hu    piped = true,
45899bd2aafSHaojin Tang    latency = CertainLatency(0)
459730cfbc0SXuan Hu  )
460730cfbc0SXuan Hu
461670870b3SXuan Hu  val HyldaCfg = FuConfig (
462670870b3SXuan Hu    name = "hylda",
463670870b3SXuan Hu    fuType = FuType.ldu,
464670870b3SXuan Hu    fuGen = null, // Todo
465670870b3SXuan Hu    srcData = Seq(
466670870b3SXuan Hu      Seq(IntData()),
467670870b3SXuan Hu    ),
468670870b3SXuan Hu    piped = false, // Todo: check it
469670870b3SXuan Hu    writeIntRf = true,
470670870b3SXuan Hu    writeFpRf = true,
471670870b3SXuan Hu    latency = UncertainLatency(3),
47213a87dc5SXiaokun-Pei    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault, loadGuestPageFault),
473670870b3SXuan Hu    flushPipe = true,
474670870b3SXuan Hu    replayInst = true,
475670870b3SXuan Hu    hasLoadError = true,
476670870b3SXuan Hu    immType = Set(SelImm.IMM_I),
477670870b3SXuan Hu  )
478670870b3SXuan Hu
479670870b3SXuan Hu  val HystaCfg = FuConfig (
480670870b3SXuan Hu    name = "hysta",
481670870b3SXuan Hu    fuType = FuType.stu,
482670870b3SXuan Hu    fuGen = null, // Todo
483670870b3SXuan Hu    srcData = Seq(
484670870b3SXuan Hu      Seq(IntData()),
485670870b3SXuan Hu    ),
486670870b3SXuan Hu    piped = false,
487670870b3SXuan Hu    latency = UncertainLatency(),
48813a87dc5SXiaokun-Pei    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, storeGuestPageFault),
489670870b3SXuan Hu    immType = Set(SelImm.IMM_S),
490670870b3SXuan Hu  )
491670870b3SXuan Hu
492670870b3SXuan Hu  val FakeHystaCfg = FuConfig (
493670870b3SXuan Hu    name = "hysta",
494670870b3SXuan Hu    fuType = FuType.stu,
495670870b3SXuan Hu    fuGen = null, // Todo
496670870b3SXuan Hu    srcData = Seq(),
497670870b3SXuan Hu    piped = false,
498670870b3SXuan Hu    latency = UncertainLatency(),
49913a87dc5SXiaokun-Pei    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, storeGuestPageFault),
500670870b3SXuan Hu    immType = Set(),
501670870b3SXuan Hu  )
502670870b3SXuan Hu
503730cfbc0SXuan Hu  val MouCfg: FuConfig = FuConfig (
504730cfbc0SXuan Hu    name = "mou",
505730cfbc0SXuan Hu    fuType = FuType.mou,
506730cfbc0SXuan Hu    fuGen = null, // Todo
507730cfbc0SXuan Hu    srcData = Seq(
508730cfbc0SXuan Hu      Seq(IntData()),
509730cfbc0SXuan Hu    ),
51078115a00SXuan Hu    piped = false, // Todo: check it
5115edcc45fSHaojin Tang    writeFakeIntRf = true,
512730cfbc0SXuan Hu    latency = UncertainLatency(),
513f7af4c74Schengguanghui    exceptionOut = (LduCfg.exceptionOut ++ StaCfg.exceptionOut ++ StdCfg.exceptionOut).distinct,
514f7af4c74Schengguanghui    trigger = true,
515730cfbc0SXuan Hu  )
516730cfbc0SXuan Hu
517730cfbc0SXuan Hu  val MoudCfg: FuConfig = FuConfig (
518730cfbc0SXuan Hu    name = "moud",
519730cfbc0SXuan Hu    fuType = FuType.mou,
520730cfbc0SXuan Hu    fuGen = null, // Todo
521730cfbc0SXuan Hu    srcData = Seq(
522730cfbc0SXuan Hu      Seq(IntData()),
523730cfbc0SXuan Hu    ),
52478115a00SXuan Hu    piped = true,
52578115a00SXuan Hu    latency = CertainLatency(0),
526730cfbc0SXuan Hu  )
527730cfbc0SXuan Hu
52874aafe69SXuan Hu  val VialuCfg = FuConfig (
529b6b11f60SXuan Hu    name = "vialuFix",
5306a35d972SXuan Hu    fuType = FuType.vialuF,
531b6b11f60SXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VIAluFix(cfg)(p).suggestName("VialuFix")),
5326a35d972SXuan Hu    srcData = Seq(
53307b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()),  // vs1, vs2, vd_old, v0, vtype&vl
5346a35d972SXuan Hu    ),
53578115a00SXuan Hu    piped = true,
5366a35d972SXuan Hu    writeVecRf = true,
537b8db7211Sxiaofeibao    writeV0Rf = true,
5382ee1e93dSXuan Hu    writeVxsat = true,
53917985fbbSZiyue Zhang    needSrcVxrm = true,
5406a35d972SXuan Hu    latency = CertainLatency(1),
541b6b11f60SXuan Hu    vconfigWakeUp = true,
542b6b11f60SXuan Hu    maskWakeUp = true,
5432d12882cSxiaofeibao    destDataBits = 128,
5449a46f19dSsinsanction    exceptionOut = Seq(illegalInstr),
5456a35d972SXuan Hu  )
5466a35d972SXuan Hu
5472ee1e93dSXuan Hu  val VimacCfg = FuConfig (
5482ee1e93dSXuan Hu    name = "vimac",
5492ee1e93dSXuan Hu    fuType = FuType.vimac,
5502ee1e93dSXuan Hu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VIMacU(cfg)(p).suggestName("Vimac")),
5512ee1e93dSXuan Hu    srcData = Seq(
55207b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl
5532ee1e93dSXuan Hu    ),
5542ee1e93dSXuan Hu    piped = true,
5552ee1e93dSXuan Hu    writeVecRf = true,
556b8db7211Sxiaofeibao    writeV0Rf = true,
5572ee1e93dSXuan Hu    writeVxsat = true,
55817985fbbSZiyue Zhang    needSrcVxrm = true,
5592ee1e93dSXuan Hu    latency = CertainLatency(2),
5602ee1e93dSXuan Hu    vconfigWakeUp = true,
5612ee1e93dSXuan Hu    maskWakeUp = true,
5622d12882cSxiaofeibao    destDataBits = 128,
5639a46f19dSsinsanction    exceptionOut = Seq(illegalInstr),
5642ee1e93dSXuan Hu  )
5652ee1e93dSXuan Hu
5660bca6cb3SZiyue Zhang  val VidivCfg = FuConfig (
5670bca6cb3SZiyue Zhang    name = "vidiv",
5680bca6cb3SZiyue Zhang    fuType = FuType.vidiv,
5690bca6cb3SZiyue Zhang    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VIDiv(cfg)(p).suggestName("Vidiv")),
5700bca6cb3SZiyue Zhang    srcData = Seq(
57107b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl
5720bca6cb3SZiyue Zhang    ),
5730bca6cb3SZiyue Zhang    piped = false,
5740bca6cb3SZiyue Zhang    writeVecRf = true,
575b8db7211Sxiaofeibao    writeV0Rf = true,
5760bca6cb3SZiyue Zhang    latency = UncertainLatency(),
5770bca6cb3SZiyue Zhang    vconfigWakeUp = true,
5780bca6cb3SZiyue Zhang    maskWakeUp = true,
5792d12882cSxiaofeibao    destDataBits = 128,
5800bca6cb3SZiyue Zhang    exceptionOut = Seq(illegalInstr),
5810bca6cb3SZiyue Zhang  )
5820bca6cb3SZiyue Zhang
583ad22c988SZiyue Zhang  val VppuCfg = FuConfig (
584ad22c988SZiyue Zhang    name = "vppu",
585ad22c988SZiyue Zhang    fuType = FuType.vppu,
586ad22c988SZiyue Zhang    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VPPU(cfg)(p).suggestName("Vppu")),
587ad22c988SZiyue Zhang    srcData = Seq(
58807b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()),  // vs1, vs2, vd_old, v0, vtype&vl
589ad22c988SZiyue Zhang    ),
590ad22c988SZiyue Zhang    piped = true,
591ad22c988SZiyue Zhang    writeVecRf = true,
592b8db7211Sxiaofeibao    writeV0Rf = true,
593b5474268SsinceforYy    latency = CertainLatency(2),
594ad22c988SZiyue Zhang    vconfigWakeUp = true,
595ad22c988SZiyue Zhang    maskWakeUp = true,
5962d12882cSxiaofeibao    destDataBits = 128,
5979a46f19dSsinsanction    exceptionOut = Seq(illegalInstr),
598ad22c988SZiyue Zhang  )
599ad22c988SZiyue Zhang
600730cfbc0SXuan Hu  val VipuCfg: FuConfig = FuConfig (
601730cfbc0SXuan Hu    name = "vipu",
602730cfbc0SXuan Hu    fuType = FuType.vipu,
603a74b2cdaSZiyue Zhang    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VIPU(cfg)(p).suggestName("Vipu")),
604730cfbc0SXuan Hu    srcData = Seq(
60507b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()),  // vs1, vs2, vd_old, v0
606730cfbc0SXuan Hu    ),
607a74b2cdaSZiyue Zhang    piped = true,
608cd2c45feSZiyue Zhang    writeIntRf = true,
609730cfbc0SXuan Hu    writeVecRf = true,
610b8db7211Sxiaofeibao    writeV0Rf = true,
61102029386Slewislzh    latency = CertainLatency(2),
612a74b2cdaSZiyue Zhang    vconfigWakeUp = true,
613a74b2cdaSZiyue Zhang    maskWakeUp = true,
6142d12882cSxiaofeibao    destDataBits = 128,
6159a46f19dSsinsanction    exceptionOut = Seq(illegalInstr),
616730cfbc0SXuan Hu  )
617730cfbc0SXuan Hu
618efdf5c1cSxiaofeibao-xjtu  val VfaluCfg = FuConfig (
619efdf5c1cSxiaofeibao-xjtu    name = "vfalu",
620efdf5c1cSxiaofeibao-xjtu    fuType = FuType.vfalu,
621efdf5c1cSxiaofeibao-xjtu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VFAlu(cfg)(p).suggestName("Vfalu")),
622efdf5c1cSxiaofeibao-xjtu    srcData = Seq(
62307b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl
624efdf5c1cSxiaofeibao-xjtu    ),
625efdf5c1cSxiaofeibao-xjtu    piped = true,
626efdf5c1cSxiaofeibao-xjtu    writeVecRf = true,
627b8db7211Sxiaofeibao    writeV0Rf = true,
62842a750a8Ssinsanction    writeFpRf = true,
629efdf5c1cSxiaofeibao-xjtu    writeFflags = true,
630efdf5c1cSxiaofeibao-xjtu    latency = CertainLatency(1),
631efdf5c1cSxiaofeibao-xjtu    vconfigWakeUp = true,
632efdf5c1cSxiaofeibao-xjtu    maskWakeUp = true,
6332d12882cSxiaofeibao    destDataBits = 128,
6349a46f19dSsinsanction    exceptionOut = Seq(illegalInstr),
63534f9ccd0SZiyue Zhang    needSrcFrm = true,
636efdf5c1cSxiaofeibao-xjtu  )
637efdf5c1cSxiaofeibao-xjtu
638efdf5c1cSxiaofeibao-xjtu  val VfmaCfg = FuConfig (
639efdf5c1cSxiaofeibao-xjtu    name = "vfma",
640efdf5c1cSxiaofeibao-xjtu    fuType = FuType.vfma,
641efdf5c1cSxiaofeibao-xjtu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VFMA(cfg)(p).suggestName("Vfma")),
642efdf5c1cSxiaofeibao-xjtu    srcData = Seq(
64307b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl
644efdf5c1cSxiaofeibao-xjtu    ),
645efdf5c1cSxiaofeibao-xjtu    piped = true,
646efdf5c1cSxiaofeibao-xjtu    writeVecRf = true,
647b8db7211Sxiaofeibao    writeV0Rf = true,
648efdf5c1cSxiaofeibao-xjtu    writeFflags = true,
649efdf5c1cSxiaofeibao-xjtu    latency = CertainLatency(3),
650efdf5c1cSxiaofeibao-xjtu    vconfigWakeUp = true,
651efdf5c1cSxiaofeibao-xjtu    maskWakeUp = true,
6522d12882cSxiaofeibao    destDataBits = 128,
6539a46f19dSsinsanction    exceptionOut = Seq(illegalInstr),
65434f9ccd0SZiyue Zhang    needSrcFrm = true,
655efdf5c1cSxiaofeibao-xjtu  )
656efdf5c1cSxiaofeibao-xjtu
657efdf5c1cSxiaofeibao-xjtu  val VfdivCfg = FuConfig(
658efdf5c1cSxiaofeibao-xjtu    name = "vfdiv",
659efdf5c1cSxiaofeibao-xjtu    fuType = FuType.vfdiv,
66075841254Sxiaofeibao-xjtu    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VFDivSqrt(cfg)(p).suggestName("Vfdiv")),
661efdf5c1cSxiaofeibao-xjtu    srcData = Seq(
66207b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl
663efdf5c1cSxiaofeibao-xjtu    ),
664efdf5c1cSxiaofeibao-xjtu    piped = false,
665efdf5c1cSxiaofeibao-xjtu    writeVecRf = true,
666b8db7211Sxiaofeibao    writeV0Rf = true,
667efdf5c1cSxiaofeibao-xjtu    writeFflags = true,
668efdf5c1cSxiaofeibao-xjtu    latency = UncertainLatency(),
669efdf5c1cSxiaofeibao-xjtu    vconfigWakeUp = true,
670efdf5c1cSxiaofeibao-xjtu    maskWakeUp = true,
6712d12882cSxiaofeibao    destDataBits = 128,
6729a46f19dSsinsanction    exceptionOut = Seq(illegalInstr),
67334f9ccd0SZiyue Zhang    needSrcFrm = true,
674efdf5c1cSxiaofeibao-xjtu  )
675efdf5c1cSxiaofeibao-xjtu
6769d3cebe7Schengguanghui  val VfcvtCfg = FuConfig(
6779d3cebe7Schengguanghui    name = "vfcvt",
6789d3cebe7Schengguanghui    fuType = FuType.vfcvt,
6799d3cebe7Schengguanghui    fuGen = (p: Parameters, cfg: FuConfig) => Module(new VCVT(cfg)(p).suggestName("Vfcvt")),
6809d3cebe7Schengguanghui    srcData = Seq(
68107b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), // vs1, vs2, vd_old, v0, vtype&vl
6829d3cebe7Schengguanghui    ),
6839d3cebe7Schengguanghui    piped = true,
6849d3cebe7Schengguanghui    writeVecRf = true,
685b8db7211Sxiaofeibao    writeV0Rf = true,
6869d3cebe7Schengguanghui    writeFflags = true,
6879d3cebe7Schengguanghui    latency = CertainLatency(2),
6889d3cebe7Schengguanghui    vconfigWakeUp = true,
6899d3cebe7Schengguanghui    maskWakeUp = true,
6902d12882cSxiaofeibao    destDataBits = 128,
6919d3cebe7Schengguanghui    exceptionOut = Seq(illegalInstr),
69234f9ccd0SZiyue Zhang    needSrcFrm = true,
6939d3cebe7Schengguanghui  )
6949d3cebe7Schengguanghui
69560f0c5aeSxiaofeibao  val FaluCfg = FuConfig(
69660f0c5aeSxiaofeibao    name = "falu",
69760f0c5aeSxiaofeibao    fuType = FuType.falu,
69860f0c5aeSxiaofeibao    fuGen = (p: Parameters, cfg: FuConfig) => Module(new FAlu(cfg)(p).suggestName("Falu")),
69960f0c5aeSxiaofeibao    srcData = Seq(
70060f0c5aeSxiaofeibao      Seq(FpData(), FpData()),
70160f0c5aeSxiaofeibao    ),
70260f0c5aeSxiaofeibao    piped = true,
70360f0c5aeSxiaofeibao    writeFpRf = true,
70460f0c5aeSxiaofeibao    writeIntRf = true,
70560f0c5aeSxiaofeibao    writeFflags = true,
70660f0c5aeSxiaofeibao    latency = CertainLatency(1),
7072d12882cSxiaofeibao    destDataBits = 64,
70860f0c5aeSxiaofeibao    needSrcFrm = true,
70960f0c5aeSxiaofeibao  )
71060f0c5aeSxiaofeibao
71160f0c5aeSxiaofeibao  val FmacCfg = FuConfig(
71260f0c5aeSxiaofeibao    name = "fmac",
71360f0c5aeSxiaofeibao    fuType = FuType.fmac,
71460f0c5aeSxiaofeibao    fuGen = (p: Parameters, cfg: FuConfig) => Module(new FMA(cfg)(p).suggestName("Fmac")),
71560f0c5aeSxiaofeibao    srcData = Seq(
71660f0c5aeSxiaofeibao      Seq(FpData(), FpData(), FpData()),
71760f0c5aeSxiaofeibao    ),
71860f0c5aeSxiaofeibao    piped = true,
71960f0c5aeSxiaofeibao    writeFpRf = true,
72060f0c5aeSxiaofeibao    writeFflags = true,
72160f0c5aeSxiaofeibao    latency = CertainLatency(3),
7222d12882cSxiaofeibao    destDataBits = 64,
72360f0c5aeSxiaofeibao    needSrcFrm = true,
72460f0c5aeSxiaofeibao  )
72560f0c5aeSxiaofeibao
72660f0c5aeSxiaofeibao  val FdivCfg = FuConfig(
72760f0c5aeSxiaofeibao    name = "fdiv",
72860f0c5aeSxiaofeibao    fuType = FuType.fDivSqrt,
72960f0c5aeSxiaofeibao    fuGen = (p: Parameters, cfg: FuConfig) => Module(new FDivSqrt(cfg)(p).suggestName("Fdiv")),
73060f0c5aeSxiaofeibao    srcData = Seq(
73160f0c5aeSxiaofeibao      Seq(FpData(), FpData()),
73260f0c5aeSxiaofeibao    ),
73360f0c5aeSxiaofeibao    piped = false,
73460f0c5aeSxiaofeibao    writeFpRf = true,
73560f0c5aeSxiaofeibao    writeFflags = true,
73660f0c5aeSxiaofeibao    latency = UncertainLatency(),
7372d12882cSxiaofeibao    destDataBits = 64,
73860f0c5aeSxiaofeibao    needSrcFrm = true,
73960f0c5aeSxiaofeibao  )
74060f0c5aeSxiaofeibao
74160f0c5aeSxiaofeibao  val FcvtCfg = FuConfig(
74260f0c5aeSxiaofeibao    name = "fcvt",
74360f0c5aeSxiaofeibao    fuType = FuType.fcvt,
74460f0c5aeSxiaofeibao    fuGen = (p: Parameters, cfg: FuConfig) => Module(new FCVT(cfg)(p).suggestName("Fcvt")),
74560f0c5aeSxiaofeibao    srcData = Seq(
74660f0c5aeSxiaofeibao      Seq(FpData()),
74760f0c5aeSxiaofeibao    ),
74860f0c5aeSxiaofeibao    piped = true,
74960f0c5aeSxiaofeibao    writeFpRf = true,
75060f0c5aeSxiaofeibao    writeIntRf = true,
75160f0c5aeSxiaofeibao    writeFflags = true,
75260f0c5aeSxiaofeibao    latency = CertainLatency(2),
7532d12882cSxiaofeibao    destDataBits = 64,
75460f0c5aeSxiaofeibao    needSrcFrm = true,
75560f0c5aeSxiaofeibao  )
7569d3cebe7Schengguanghui
7574ee69032SzhanglyGit  val VlduCfg: FuConfig = FuConfig (
7584ee69032SzhanglyGit    name = "vldu",
7594ee69032SzhanglyGit    fuType = FuType.vldu,
7604ee69032SzhanglyGit    fuGen = null,
7614ee69032SzhanglyGit    srcData = Seq(
76207b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()),  //vs1, vs2, vd_old, v0, vconfig
7634ee69032SzhanglyGit    ),
7644ee69032SzhanglyGit    piped = false, // Todo: check it
7654ee69032SzhanglyGit    writeVecRf = true,
766b8db7211Sxiaofeibao    writeV0Rf = true,
767df3b4b92SAnzooooo    writeVlRf = true,
7684ee69032SzhanglyGit    latency = UncertainLatency(),
76994998b06Shappy-lx    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault, loadGuestPageFault, breakPoint),
7704ee69032SzhanglyGit    flushPipe = true,
7714ee69032SzhanglyGit    replayInst = true,
772506ca2a3SAnzooooo    trigger = true,
7734ee69032SzhanglyGit    hasLoadError = true,
7744ee69032SzhanglyGit    vconfigWakeUp = true,
7754ee69032SzhanglyGit    maskWakeUp = true,
7762d12882cSxiaofeibao    destDataBits = 128,
7774ee69032SzhanglyGit  )
77820a5248fSzhanglinjuan
779e703da02SzhanglyGit  val VstuCfg: FuConfig = FuConfig (
78020a5248fSzhanglinjuan    name = "vstu",
78120a5248fSzhanglinjuan    fuType = FuType.vstu,
78220a5248fSzhanglinjuan    fuGen = null,
78320a5248fSzhanglinjuan    srcData = Seq(
78407b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()),  //vs1, vs2, vd_old, v0, vconfig
78520a5248fSzhanglinjuan    ),
786e703da02SzhanglyGit    piped = false,
78720a5248fSzhanglinjuan    latency = UncertainLatency(),
78894998b06Shappy-lx    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, storeGuestPageFault, breakPoint),
78920a5248fSzhanglinjuan    flushPipe = true,
79020a5248fSzhanglinjuan    replayInst = true,
791506ca2a3SAnzooooo    trigger = true,
79220a5248fSzhanglinjuan    hasLoadError = true,
79320a5248fSzhanglinjuan    vconfigWakeUp = true,
79420a5248fSzhanglinjuan    maskWakeUp = true,
7952d12882cSxiaofeibao    destDataBits = 128,
79620a5248fSzhanglinjuan  )
797730cfbc0SXuan Hu
798985804e6SXuan Hu  val VseglduSeg: FuConfig = FuConfig (
799985804e6SXuan Hu    name = "vsegldu",
800985804e6SXuan Hu    fuType = FuType.vsegldu,
801985804e6SXuan Hu    fuGen = null,
802985804e6SXuan Hu    srcData = Seq(
80307b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), //vs1, vs2, vd_old, v0, vconfig
804985804e6SXuan Hu    ),
805985804e6SXuan Hu    piped = false, // Todo: check it
806985804e6SXuan Hu    writeVecRf = true,
807b8db7211Sxiaofeibao    writeV0Rf = true,
808df3b4b92SAnzooooo    writeVlRf = true,
809985804e6SXuan Hu    latency = UncertainLatency(),
81094998b06Shappy-lx    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault, breakPoint),
811985804e6SXuan Hu    flushPipe = true,
812985804e6SXuan Hu    replayInst = true,
813506ca2a3SAnzooooo    trigger = true,
814985804e6SXuan Hu    hasLoadError = true,
815985804e6SXuan Hu    vconfigWakeUp = true,
816985804e6SXuan Hu    maskWakeUp = true,
8172d12882cSxiaofeibao    destDataBits = 128,
818985804e6SXuan Hu  )
819985804e6SXuan Hu
820985804e6SXuan Hu  val VsegstuCfg: FuConfig = FuConfig(
821985804e6SXuan Hu    name = "vsegstu",
822985804e6SXuan Hu    fuType = FuType.vsegstu,
823985804e6SXuan Hu    fuGen = null,
824985804e6SXuan Hu    srcData = Seq(
82507b5cc60Sxiaofeibao      Seq(VecData(), VecData(), VecData(), V0Data(), VlData()), //vs1, vs2, vd_old, v0, vconfig
826985804e6SXuan Hu    ),
827985804e6SXuan Hu    piped = false,
828985804e6SXuan Hu    latency = UncertainLatency(),
82994998b06Shappy-lx    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault, breakPoint),
830985804e6SXuan Hu    flushPipe = true,
831985804e6SXuan Hu    replayInst = true,
832506ca2a3SAnzooooo    trigger = true,
833985804e6SXuan Hu    hasLoadError = true,
834985804e6SXuan Hu    vconfigWakeUp = true,
835985804e6SXuan Hu    maskWakeUp = true,
8362d12882cSxiaofeibao    destDataBits = 128,
837985804e6SXuan Hu  )
838985804e6SXuan Hu
839b6b11f60SXuan Hu  def allConfigs = Seq(
840395c8649SZiyue-Zhang    JmpCfg, BrhCfg, I2fCfg, I2vCfg, F2vCfg, CsrCfg, AluCfg, MulCfg, DivCfg, FenceCfg, BkuCfg, VSetRvfWvfCfg, VSetRiWvfCfg, VSetRiWiCfg,
841985804e6SXuan Hu    LduCfg, StaCfg, StdCfg, MouCfg, MoudCfg, VialuCfg, VipuCfg, VlduCfg, VstuCfg, VseglduSeg, VsegstuCfg,
84260f0c5aeSxiaofeibao    FaluCfg, FmacCfg, FcvtCfg, FdivCfg,
843e703da02SzhanglyGit    VfaluCfg, VfmaCfg, VfcvtCfg, HyldaCfg, HystaCfg
844b6b11f60SXuan Hu  )
845da778e6fSXuan Hu
846da778e6fSXuan Hu  def VecArithFuConfigs = Seq(
84736040c62Schengguanghui    VialuCfg, VimacCfg, VppuCfg, VipuCfg, VfaluCfg, VfmaCfg, VfcvtCfg
848da778e6fSXuan Hu  )
849730cfbc0SXuan Hu}
850730cfbc0SXuan Hu
851