xref: /XiangShan/src/main/scala/xiangshan/backend/fu/FunctionUnit.scala (revision 66314a3840e5ebe6cc81ca4725bde95942f67489)
1package xiangshan.backend.fu
2
3import chisel3._
4import chisel3.util._
5
6import xiangshan._
7import 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
26class FunctionUnitIO extends XSBundle {
27  val in = Flipped(Decoupled(new Bundle {
28    val src1 = Output(UInt(XLEN.W))
29    val src2 = Output(UInt(XLEN.W))
30    val src3 = Output(UInt(XLEN.W))
31    val func = Output(FuOpType())
32  }))
33  val out = Decoupled(Output(UInt(XLEN.W)))
34}
35
36abstract class FunctionUnit(cfg: FuConfig) extends XSModule
37
38object FunctionUnit {
39
40  val csrCfg =
41    FuConfig(FuType.csr, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false)
42
43  val jmpCfg =
44    FuConfig(FuType.jmp, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)
45
46  val i2fCfg =
47    FuConfig(FuType.i2f, 1, 0, writeIntRf = false, writeFpRf = true, hasRedirect = false)
48
49  val aluCfg =
50    FuConfig(FuType.alu, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)
51
52  val mulCfg =
53    FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false)
54
55  val divCfg =
56    FuConfig(FuType.div, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false)
57
58  val lsuCfg =
59    FuConfig(FuType.ldu, 2, 1, writeIntRf = true, writeFpRf = true, hasRedirect = false)
60
61  val fmacCfg =
62    FuConfig(FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, hasRedirect = false)
63
64  val fmiscCfg =
65    FuConfig(FuType.fmisc, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false)
66
67  val fDivSqrtCfg =
68    FuConfig(FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false)
69}