Exu.scala 3.3 KB
Newer Older
1 2 3 4 5
package xiangshan.backend.exu

import chisel3._
import chisel3.util._
import xiangshan._
6
import xiangshan.FuType._
7
import xiangshan.backend.fu.{CertainLatency, FuConfig, HasFuLatency, NexusLatency, UncertainLatency}
L
LinJiawei 已提交
8
import utils.ParallelOR
L
LinJiawei 已提交
9
import xiangshan.backend.fu.FunctionUnit._
10

L
LinJiawei 已提交
11
case class ExuParameters
12
(
L
LinJiawei 已提交
13
  JmpCnt: Int,
14
  AluCnt: Int,
15 16 17 18 19
  MulCnt: Int,
  MduCnt: Int,
  FmacCnt: Int,
  FmiscCnt: Int,
  FmiscDivSqrtCnt: Int,
20 21
  LduCnt: Int,
  StuCnt: Int
22
){
L
LinJiawei 已提交
23 24
  assert(JmpCnt == 1, "Only support 1 JmpUnit now!")
  def IntExuCnt = AluCnt + MulCnt + MduCnt + JmpCnt
25
  def FpExuCnt = FmacCnt + FmiscCnt + FmiscDivSqrtCnt
26
  def LsExuCnt = LduCnt + StuCnt
Y
Yinan Xu 已提交
27
  def ExuCnt = IntExuCnt + FpExuCnt + LduCnt + StuCnt
28 29
  def NRFuType = 9
  def FuOpWidth = 7
30 31
}

L
LinJiawei 已提交
32
case class ExuConfig
33
(
L
LinJiawei 已提交
34 35 36 37
  name: String,
  supportedFuncUnits: Array[FuConfig],
  enableBypass: Boolean
){
L
LinJiawei 已提交
38 39 40 41 42 43 44 45
  def max(in: Seq[Int]): Int = in.reduce((x, y) => if(x > y) x else y)
  val intSrcCnt = max(supportedFuncUnits.map(_.numIntSrc))
  val fpSrcCnt = max(supportedFuncUnits.map(_.numFpSrc))
  val readIntRf = intSrcCnt > 0
  val readFpRf = fpSrcCnt > 0
  val writeIntRf = supportedFuncUnits.map(_.writeIntRf).reduce(_||_)
  val writeFpRf = supportedFuncUnits.map(_.writeFpRf).reduce(_||_)
  val hasRedirect = supportedFuncUnits.map(_.hasRedirect).reduce(_||_)
46

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
  val latency: HasFuLatency = {
    val lats = supportedFuncUnits.map(_.latency)
    val latencyValue = lats.collectFirst{
      case x if x.latencyVal.nonEmpty =>
        x.latencyVal.get
    }
    val hasUncertain = lats.exists(x => x.latencyVal.isEmpty)
    if(latencyValue.nonEmpty){
      if(hasUncertain) NexusLatency(latencyValue.get) else CertainLatency(latencyValue.get)
    } else UncertainLatency()
  }
  val hasCertainLatency = latency.latencyVal.nonEmpty
  val hasUncertainlatency = latency match {
    case _: UncertainLatency =>
      true
    case _: NexusLatency =>
      true
    case _ =>
      false
  }

L
LinJiawei 已提交
68
  def canAccept(fuType: UInt): Bool = {
L
LinJiawei 已提交
69
    ParallelOR(supportedFuncUnits.map(_.fuType === fuType))
L
LinJiawei 已提交
70
  }
71 72
}

73 74
abstract class Exu(val config: ExuConfig) extends XSModule {
  val io = IO(new ExuIO)
75
  io.out.bits.brUpdate <> DontCare
L
linjiawei 已提交
76
  io.out.bits.fflags <> DontCare
77
  io.out.bits.debug.isMMIO := false.B
78 79
}

L
LinJiawei 已提交
80
object Exu {
81
  val jmpExeUnitCfg = ExuConfig("JmpExu", Array(jmpCfg, i2fCfg, csrCfg, fenceCfg), enableBypass = false)
82
  val aluExeUnitCfg = ExuConfig("AluExu", Array(aluCfg), enableBypass = true)
L
LinJiawei 已提交
83
  val mulExeUnitCfg = ExuConfig("MulExu", Array(mulCfg), enableBypass = false)
84 85
  val divExeUnitCfg = ExuConfig("DivExu", Array(divCfg), enableBypass = false)
  val fenceExeUnitCfg = ExuConfig("FenceCfg", Array(fenceCfg), enableBypass = false)
86
  val i2fExeUnitCfg = ExuConfig("I2fExu", Array(i2fCfg), enableBypass = false)
L
LinJiawei 已提交
87
  val mulDivExeUnitCfg = ExuConfig("MulDivExu", Array(mulCfg, divCfg), enableBypass = false)
88
  val mulDivFenceExeUnitCfg = ExuConfig("MulDivFenceExu", Array(mulCfg, divCfg, fenceCfg), enableBypass = false)
89
  val ldExeUnitCfg = ExuConfig("LoadExu", Array(lduCfg), enableBypass = false)
90
  val stExeUnitCfg =ExuConfig("StoreExu", Array(stuCfg, mouCfg), enableBypass = false)
L
LinJiawei 已提交
91 92 93
  val fmacExeUnitCfg = ExuConfig("FmacExu", Array(fmacCfg), enableBypass = false)
  val fmiscExeUnitCfg = ExuConfig("FmiscExu", Array(fmiscCfg), enableBypass = false)
  val fmiscDivExeUnitCfg = ExuConfig("FmiscDivExu", Array(fmiscCfg, fDivSqrtCfg), enableBypass = false)
94
}