xref: /XiangShan/src/main/scala/xiangshan/backend/fu/FunctionUnit.scala (revision 16df83adafbc2e25ae14c8c7ccccc5516db96bdd)
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
163e60a357SLinJiaweitrait HasFuLatency {
173e60a357SLinJiawei  val latencyVal: Option[Int]
183e60a357SLinJiawei}
193e60a357SLinJiawei
203e60a357SLinJiaweicase class CertainLatency(value: Int) extends HasFuLatency{
213e60a357SLinJiawei  override val latencyVal: Option[Int] = Some(value)
223e60a357SLinJiawei}
233e60a357SLinJiawei
243e60a357SLinJiaweicase class UncertainLatency() extends HasFuLatency {
253e60a357SLinJiawei  override val latencyVal: Option[Int] = None
263e60a357SLinJiawei}
273e60a357SLinJiawei
283e60a357SLinJiaweicase class NexusLatency(value: Int) extends HasFuLatency {
293e60a357SLinJiawei  override val latencyVal: Option[Int] = Some(value)
303e60a357SLinJiawei}
313e60a357SLinJiawei
32*16df83adSZhangZifei
33*16df83adSZhangZifei
34cafb3558SLinJiaweicase class FuConfig
35cafb3558SLinJiawei(
36cafb3558SLinJiawei  fuType: UInt,
37cafb3558SLinJiawei  numIntSrc: Int,
38cafb3558SLinJiawei  numFpSrc: Int,
39cafb3558SLinJiawei  writeIntRf: Boolean,
40cafb3558SLinJiawei  writeFpRf: Boolean,
413e60a357SLinJiawei  hasRedirect: Boolean,
423e60a357SLinJiawei  latency: HasFuLatency = CertainLatency(0)
43cafb3558SLinJiawei)
44cafb3558SLinJiawei
45c84054caSLinJiaweiclass FunctionUnitIO extends XSBundle {
46c84054caSLinJiawei  val in = Flipped(Decoupled(new Bundle {
47c84054caSLinJiawei    val src1 = Output(UInt(XLEN.W))
48c84054caSLinJiawei    val src2 = Output(UInt(XLEN.W))
49c84054caSLinJiawei    val src3 = Output(UInt(XLEN.W))
50c84054caSLinJiawei    val func = Output(FuOpType())
51c84054caSLinJiawei  }))
52c84054caSLinJiawei  val out = Decoupled(Output(UInt(XLEN.W)))
53c84054caSLinJiawei}
54c84054caSLinJiawei
55cafb3558SLinJiaweiabstract class FunctionUnit(cfg: FuConfig) extends XSModule
56cafb3558SLinJiawei
57cafb3558SLinJiaweiobject FunctionUnit {
58c84054caSLinJiawei
59c84054caSLinJiawei  val csrCfg =
60c84054caSLinJiawei    FuConfig(FuType.csr, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false)
61c84054caSLinJiawei
62cafb3558SLinJiawei  val jmpCfg =
63cafb3558SLinJiawei    FuConfig(FuType.jmp, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)
64cafb3558SLinJiawei
65cafb3558SLinJiawei  val i2fCfg =
66cafb3558SLinJiawei    FuConfig(FuType.i2f, 1, 0, writeIntRf = false, writeFpRf = true, hasRedirect = false)
67cafb3558SLinJiawei
68cafb3558SLinJiawei  val aluCfg =
69cafb3558SLinJiawei    FuConfig(FuType.alu, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)
70cafb3558SLinJiawei
71cafb3558SLinJiawei  val mulCfg =
723e60a357SLinJiawei    FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false,
733e60a357SLinJiawei      CertainLatency(3)
743e60a357SLinJiawei    )
75cafb3558SLinJiawei
76cafb3558SLinJiawei  val divCfg =
773e60a357SLinJiawei    FuConfig(FuType.div, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false,
783e60a357SLinJiawei      UncertainLatency()
793e60a357SLinJiawei    )
80cafb3558SLinJiawei
81b8f08ca0SZhangZifei  val fenceCfg =
82b8f08ca0SZhangZifei    FuConfig(FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false/*NOTE: need redirect but when commit*/)
83b8f08ca0SZhangZifei
846624015fSLinJiawei  val lduCfg =
853e60a357SLinJiawei    FuConfig(FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, hasRedirect = false,
863e60a357SLinJiawei      UncertainLatency()
873e60a357SLinJiawei    )
886624015fSLinJiawei
896624015fSLinJiawei  val stuCfg =
903e60a357SLinJiawei    FuConfig(FuType.stu, 2, 1, writeIntRf = false, writeFpRf = false, hasRedirect = false,
913e60a357SLinJiawei      UncertainLatency()
923e60a357SLinJiawei    )
93cafb3558SLinJiawei
9468c44d2dSAllen  val mouCfg =
953e60a357SLinJiawei    FuConfig(FuType.mou, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false,
963e60a357SLinJiawei      UncertainLatency()
973e60a357SLinJiawei  )
9868c44d2dSAllen
99cafb3558SLinJiawei  val fmacCfg =
1003e60a357SLinJiawei    FuConfig(FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, hasRedirect = false,
1013e60a357SLinJiawei      CertainLatency(5)
1023e60a357SLinJiawei    )
103cafb3558SLinJiawei
104cafb3558SLinJiawei  val fmiscCfg =
1053e60a357SLinJiawei    FuConfig(FuType.fmisc, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false,
1063e60a357SLinJiawei      CertainLatency(2)
1073e60a357SLinJiawei    )
108cafb3558SLinJiawei
109cafb3558SLinJiawei  val fDivSqrtCfg =
1103e60a357SLinJiawei    FuConfig(FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false,
1113e60a357SLinJiawei      UncertainLatency()
1123e60a357SLinJiawei    )
113cafb3558SLinJiawei}
114