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

import chisel3._
import chisel3.util._
import xiangshan._
6
import xiangshan.FuType._
7 8 9 10

case class ExuConfig
(
  BruCnt: Int,
11
  AluCnt: Int,
12 13 14 15 16
  MulCnt: Int,
  MduCnt: Int,
  FmacCnt: Int,
  FmiscCnt: Int,
  FmiscDivSqrtCnt: Int,
17 18
  LduCnt: Int,
  StuCnt: Int
19 20 21 22
){
  assert(BruCnt == 1, "Only support 1 Bru now!")
  def IntExuCnt = AluCnt + MulCnt + MduCnt + BruCnt
  def FpExuCnt = FmacCnt + FmiscCnt + FmiscDivSqrtCnt
23 24 25
  def ExuCnt = IntExuCnt + FpExuCnt + LduCnt
  def NRFuType = 9
  def FuOpWidth = 7
26 27
}

28 29 30 31 32 33
abstract class Exu
(
  val fuTypeInt: BigInt,
  val readIntRf: Boolean = true,
  val readFpRf: Boolean = false,
  val writeIntRf: Boolean = true,
34 35 36
  val writeFpRf: Boolean = false,
  val enableBypass: Boolean = false, // join bypass group or not, require readIntRf & writeIntRf now
  val fixedDelay: BigInt = 1 // IssueQueue's selectUop's delay
37
) extends Module {
38 39 40 41
  val io = IO(new ExuIO)
}


42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

class Alu extends Exu(alu.litValue()) with NeedImpl {
  override def toString: String = "Alu"
}

class Bru extends Exu(FuType.bru.litValue(), writeFpRf = true) with NeedImpl{
  override def toString: String = "Bru"
}

class Mul extends Exu(FuType.mul.litValue()) with NeedImpl{
  override def toString: String = "Mul"
}

class Mdu extends Exu(FuType.mdu.litValue()) with NeedImpl{
  override def toString: String = "MulDiv"
}

class Fmac extends Exu(
  FuType.fmac.litValue(),
  readIntRf = false,
  readFpRf = true,
  writeIntRf = false,
  writeFpRf = true
) with NeedImpl {
  override def toString: String = "Fmac"
67 68
}

69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
class Fmisc extends Exu(
  FuType.fmisc.litValue(),
  readIntRf = false,
  readFpRf = true,
  writeIntRf = true,
  writeFpRf = true
) with NeedImpl {
  override def toString: String = "Fmisc"
}

class FmiscDivSqrt extends Exu(
  FuType.fmiscDivSqrt.litValue(),
  readIntRf = false,
  readFpRf = true,
  writeIntRf = false,
  writeFpRf = true
) with NeedImpl {
  override def toString: String = "FmiscDivSqrt"
}

class Lsu extends Exu(
  FuType.ldu.litValue(),
  readIntRf = true,
  readFpRf = true,
  writeIntRf = true,
  writeFpRf = true
) with NeedImpl {
  override def toString: String = "Lsu"
}

trait HasExeUnits{

  val aluExeUnits = Array.tabulate(exuConfig.AluCnt)(_ => Module(new Alu))
  val bruExeUnit = Module(new Bru)
  val mulExeUnits = Array.tabulate(exuConfig.MulCnt)(_ => Module(new Mul))
  val mduExeUnits = Array.tabulate(exuConfig.MduCnt)(_ => Module(new Mdu))
  val fmacExeUnits = Array.tabulate(exuConfig.FmacCnt)(_ => Module(new Fmac))
  val fmiscExeUnits = Array.tabulate(exuConfig.FmiscCnt)(_ => Module(new Fmisc))
  val fmiscDivSqrtExeUnits = Array.tabulate(exuConfig.FmiscDivSqrtCnt)(_ => Module(new FmiscDivSqrt))
  val lsuExeUnits = Array.tabulate(exuConfig.LduCnt)(_ => Module(new Lsu))

  val exeUnits = bruExeUnit +: (aluExeUnits ++ mulExeUnits ++ mduExeUnits ++
    fmacExeUnits ++ fmiscExeUnits ++ fmiscDivSqrtExeUnits ++ lsuExeUnits)
112 113 114 115 116
}

class WriteBackArbMtoN(m: Int, n: Int) extends XSModule with NeedImpl {
  val io = IO(new Bundle() {
    val in = Vec(m, Flipped(DecoupledIO(new ExuOutput)))
117
    val out = Vec(n, ValidIO(new ExuOutput))
118 119 120 121 122 123
  })
}