xref: /XiangShan/src/main/scala/xiangshan/backend/fu/FunctionUnit.scala (revision cafb355860832e74823efc10f9ea6c557461a10d)
1package xiangshan.backend.fu
2
3import chisel3._
4import chisel3.util._
5
6import xiangshan._
7import xiangshan.utils._
8
9import FunctionUnit._
10
11/*
12    XiangShan Function Unit
13    A Exu can have one or more function units
14 */
15
16case class FuConfig
17(
18  fuType: UInt,
19  numIntSrc: Int,
20  numFpSrc: Int,
21  writeIntRf: Boolean,
22  writeFpRf: Boolean,
23  hasRedirect: Boolean
24)
25
26abstract class FunctionUnit(cfg: FuConfig) extends XSModule
27
28object FunctionUnit {
29  val jmpCfg =
30    FuConfig(FuType.jmp, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)
31
32  val i2fCfg =
33    FuConfig(FuType.i2f, 1, 0, writeIntRf = false, writeFpRf = true, hasRedirect = false)
34
35  val aluCfg =
36    FuConfig(FuType.alu, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)
37
38  val mulCfg =
39    FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false)
40
41  val divCfg =
42    FuConfig(FuType.div, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false)
43
44  val lsuCfg =
45    FuConfig(FuType.ldu, 2, 1, writeIntRf = true, writeFpRf = true, hasRedirect = false)
46
47  val fmacCfg =
48    FuConfig(FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, hasRedirect = false)
49
50  val fmiscCfg =
51    FuConfig(FuType.fmisc, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false)
52
53  val fDivSqrtCfg =
54    FuConfig(FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false)
55}