FunctionUnit.scala 2.8 KB
Newer Older
L
LinJiawei 已提交
1 2 3 4 5 6
package xiangshan.backend.fu

import chisel3._
import chisel3.util._

import xiangshan._
L
LinJiawei 已提交
7
import utils._
L
LinJiawei 已提交
8 9 10 11 12 13 14 15

import FunctionUnit._

/*
    XiangShan Function Unit
    A Exu can have one or more function units
 */

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
trait HasFuLatency {
  val latencyVal: Option[Int]
}

case class CertainLatency(value: Int) extends HasFuLatency{
  override val latencyVal: Option[Int] = Some(value)
}

case class UncertainLatency() extends HasFuLatency {
  override val latencyVal: Option[Int] = None
}

case class NexusLatency(value: Int) extends HasFuLatency {
  override val latencyVal: Option[Int] = Some(value)
}

L
LinJiawei 已提交
32 33 34 35 36 37 38
case class FuConfig
(
  fuType: UInt,
  numIntSrc: Int,
  numFpSrc: Int,
  writeIntRf: Boolean,
  writeFpRf: Boolean,
39 40
  hasRedirect: Boolean,
  latency: HasFuLatency = CertainLatency(0)
L
LinJiawei 已提交
41 42
)

L
Add CSR  
LinJiawei 已提交
43 44 45 46 47 48 49 50 51 52
class FunctionUnitIO extends XSBundle {
  val in = Flipped(Decoupled(new Bundle {
    val src1 = Output(UInt(XLEN.W))
    val src2 = Output(UInt(XLEN.W))
    val src3 = Output(UInt(XLEN.W))
    val func = Output(FuOpType())
  }))
  val out = Decoupled(Output(UInt(XLEN.W)))
}

L
LinJiawei 已提交
53 54 55
abstract class FunctionUnit(cfg: FuConfig) extends XSModule

object FunctionUnit {
L
Add CSR  
LinJiawei 已提交
56 57 58 59

  val csrCfg =
    FuConfig(FuType.csr, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false)

L
LinJiawei 已提交
60 61 62 63 64 65 66 67 68 69
  val jmpCfg =
    FuConfig(FuType.jmp, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)

  val i2fCfg =
    FuConfig(FuType.i2f, 1, 0, writeIntRf = false, writeFpRf = true, hasRedirect = false)

  val aluCfg =
    FuConfig(FuType.alu, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true)

  val mulCfg =
70 71 72
    FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false,
      CertainLatency(3)
    )
L
LinJiawei 已提交
73 74

  val divCfg =
75 76 77
    FuConfig(FuType.div, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false,
      UncertainLatency()
    )
L
LinJiawei 已提交
78

79 80 81
  val fenceCfg = 
    FuConfig(FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false/*NOTE: need redirect but when commit*/)

82
  val lduCfg =
83 84 85
    FuConfig(FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, hasRedirect = false,
      UncertainLatency()
    )
86 87

  val stuCfg =
88 89 90
    FuConfig(FuType.stu, 2, 1, writeIntRf = false, writeFpRf = false, hasRedirect = false,
      UncertainLatency()
    )
L
LinJiawei 已提交
91

92 93 94 95
  val mouCfg = 
    FuConfig(FuType.mou, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false,
      UncertainLatency()
  )
96

L
LinJiawei 已提交
97
  val fmacCfg =
98 99 100
    FuConfig(FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, hasRedirect = false,
      CertainLatency(5)
    )
L
LinJiawei 已提交
101 102

  val fmiscCfg =
103 104 105
    FuConfig(FuType.fmisc, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false,
      CertainLatency(2)
    )
L
LinJiawei 已提交
106 107

  val fDivSqrtCfg =
108 109 110
    FuConfig(FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false,
      UncertainLatency()
    )
111
}