xref: /XiangShan/src/main/scala/xiangshan/backend/fu/FunctionUnit.scala (revision 3e60a3572d209373dba5a6b1c6198ca94a896539)
1cafb3558SLinJiaweipackage xiangshan.backend.fu
2cafb3558SLinJiawei
3cafb3558SLinJiaweiimport chisel3._
4cafb3558SLinJiaweiimport chisel3.util._
5cafb3558SLinJiawei
6cafb3558SLinJiaweiimport xiangshan._
7b9fd1892SLinJiaweiimport utils._
8cafb3558SLinJiawei
9cafb3558SLinJiaweiimport FunctionUnit._
10cafb3558SLinJiawei
11cafb3558SLinJiawei/*
12cafb3558SLinJiawei    XiangShan Function Unit
13cafb3558SLinJiawei    A Exu can have one or more function units
14cafb3558SLinJiawei */
15cafb3558SLinJiawei
16*3e60a357SLinJiaweitrait HasFuLatency {
17*3e60a357SLinJiawei  val latencyVal: Option[Int]
18*3e60a357SLinJiawei}
19*3e60a357SLinJiawei
20*3e60a357SLinJiaweicase class CertainLatency(value: Int) extends HasFuLatency{
21*3e60a357SLinJiawei  override val latencyVal: Option[Int] = Some(value)
22*3e60a357SLinJiawei}
23*3e60a357SLinJiawei
24*3e60a357SLinJiaweicase class UncertainLatency() extends HasFuLatency {
25*3e60a357SLinJiawei  override val latencyVal: Option[Int] = None
26*3e60a357SLinJiawei}
27*3e60a357SLinJiawei
28*3e60a357SLinJiaweicase class NexusLatency(value: Int) extends HasFuLatency {
29*3e60a357SLinJiawei  override val latencyVal: Option[Int] = Some(value)
30*3e60a357SLinJiawei}
31*3e60a357SLinJiawei
32cafb3558SLinJiaweicase class FuConfig
33cafb3558SLinJiawei(
34cafb3558SLinJiawei  fuType: UInt,
35cafb3558SLinJiawei  numIntSrc: Int,
36cafb3558SLinJiawei  numFpSrc: Int,
37cafb3558SLinJiawei  writeIntRf: Boolean,
38cafb3558SLinJiawei  writeFpRf: Boolean,
39*3e60a357SLinJiawei  hasRedirect: Boolean,
40*3e60a357SLinJiawei  latency: HasFuLatency = CertainLatency(0)
41cafb3558SLinJiawei)
42cafb3558SLinJiawei
43c84054caSLinJiaweiclass FunctionUnitIO extends XSBundle {
44c84054caSLinJiawei  val in = Flipped(Decoupled(new Bundle {
45c84054caSLinJiawei    val src1 = Output(UInt(XLEN.W))
46c84054caSLinJiawei    val src2 = Output(UInt(XLEN.W))
47c84054caSLinJiawei    val src3 = Output(UInt(XLEN.W))
48c84054caSLinJiawei    val func = Output(FuOpType())
49c84054caSLinJiawei  }))
50c84054caSLinJiawei  val out = Decoupled(Output(UInt(XLEN.W)))
51c84054caSLinJiawei}
52c84054caSLinJiawei
53cafb3558SLinJiaweiabstract class FunctionUnit(cfg: FuConfig) extends XSModule
54cafb3558SLinJiawei
55cafb3558SLinJiaweiobject FunctionUnit {
56c84054caSLinJiawei
57c84054caSLinJiawei  val csrCfg =
58c84054caSLinJiawei    FuConfig(FuType.csr, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false)
59c84054caSLinJiawei
60cafb3558SLinJiawei  val jmpCfg =
61cafb3558SLinJiawei    FuConfig(FuType.jmp, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)
62cafb3558SLinJiawei
63cafb3558SLinJiawei  val i2fCfg =
64cafb3558SLinJiawei    FuConfig(FuType.i2f, 1, 0, writeIntRf = false, writeFpRf = true, hasRedirect = false)
65cafb3558SLinJiawei
66cafb3558SLinJiawei  val aluCfg =
67cafb3558SLinJiawei    FuConfig(FuType.alu, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)
68cafb3558SLinJiawei
69cafb3558SLinJiawei  val mulCfg =
70*3e60a357SLinJiawei    FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false,
71*3e60a357SLinJiawei      CertainLatency(3)
72*3e60a357SLinJiawei    )
73cafb3558SLinJiawei
74cafb3558SLinJiawei  val divCfg =
75*3e60a357SLinJiawei    FuConfig(FuType.div, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false,
76*3e60a357SLinJiawei      UncertainLatency()
77*3e60a357SLinJiawei    )
78cafb3558SLinJiawei
79b8f08ca0SZhangZifei  val fenceCfg =
80b8f08ca0SZhangZifei    FuConfig(FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false/*NOTE: need redirect but when commit*/)
81b8f08ca0SZhangZifei
826624015fSLinJiawei  val lduCfg =
83*3e60a357SLinJiawei    FuConfig(FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, hasRedirect = false,
84*3e60a357SLinJiawei      UncertainLatency()
85*3e60a357SLinJiawei    )
866624015fSLinJiawei
876624015fSLinJiawei  val stuCfg =
88*3e60a357SLinJiawei    FuConfig(FuType.stu, 2, 1, writeIntRf = false, writeFpRf = false, hasRedirect = false,
89*3e60a357SLinJiawei      UncertainLatency()
90*3e60a357SLinJiawei    )
91cafb3558SLinJiawei
9268c44d2dSAllen  val mouCfg =
93*3e60a357SLinJiawei    FuConfig(FuType.mou, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false,
94*3e60a357SLinJiawei      UncertainLatency()
95*3e60a357SLinJiawei  )
9668c44d2dSAllen
97cafb3558SLinJiawei  val fmacCfg =
98*3e60a357SLinJiawei    FuConfig(FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, hasRedirect = false,
99*3e60a357SLinJiawei      CertainLatency(5)
100*3e60a357SLinJiawei    )
101cafb3558SLinJiawei
102cafb3558SLinJiawei  val fmiscCfg =
103*3e60a357SLinJiawei    FuConfig(FuType.fmisc, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false,
104*3e60a357SLinJiawei      CertainLatency(2)
105*3e60a357SLinJiawei    )
106cafb3558SLinJiawei
107cafb3558SLinJiawei  val fDivSqrtCfg =
108*3e60a357SLinJiawei    FuConfig(FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false,
109*3e60a357SLinJiawei      UncertainLatency()
110*3e60a357SLinJiawei    )
111cafb3558SLinJiawei}
112