Skip to content

Commit

Permalink
FuConfig: split dataBits into destDataBits and srcDataBits for distin…
Browse files Browse the repository at this point in the history
…guish input and output data width
  • Loading branch information
xiaofeibao-xjtu authored and Tang-Haojin committed Jun 11, 2024
1 parent 9eecf55 commit 2d12882
Show file tree
Hide file tree
Showing 18 changed files with 48 additions and 43 deletions.
6 changes: 3 additions & 3 deletions src/main/scala/xiangshan/backend/Bundles.scala
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,7 @@ object Bundles {
class ExuInput(val params: ExeUnitParams, copyWakeupOut:Boolean = false, copyNum:Int = 0)(implicit p: Parameters) extends XSBundle {
val fuType = FuType()
val fuOpType = FuOpType()
val src = Vec(params.numRegSrc, UInt(params.dataBitsMax.W))
val src = Vec(params.numRegSrc, UInt(params.srcDataBitsMax.W))
val imm = UInt(32.W)
val robIdx = new RobPtr
val iqIdx = UInt(log2Up(MemIQSizeMax).W)// Only used by store yet
Expand Down Expand Up @@ -651,7 +651,7 @@ object Bundles {
)(implicit
val p: Parameters
) extends Bundle with BundleSource with HasXSParameter {
val data = UInt(params.dataBitsMax.W)
val data = UInt(params.destDataBitsMax.W)
val pdest = UInt(params.wbPregIdxWidth.W)
val robIdx = new RobPtr
val intWen = if (params.needIntWen) Some(Bool()) else None
Expand Down Expand Up @@ -799,7 +799,7 @@ object Bundles {
)(implicit
val p: Parameters
) extends Bundle {
val data = UInt(params.dataBitsMax.W)
val data = UInt(params.destDataBitsMax.W)
val pdest = UInt(params.wbPregIdxWidth.W)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ class BypassNetwork()(implicit p: Parameters, params: BackendParams) extends XSM
val imm = ImmExtractor(
immInfo(exuIdx).imm,
immInfo(exuIdx).immType,
exuInput.bits.params.dataBitsMax,
exuInput.bits.params.destDataBitsMax,
exuInput.bits.params.immType.map(_.litValue)
)
val immLoadSrc0 = SignExt(ImmUnion.U.toImm32(immInfo(exuIdx).imm(immInfo(exuIdx).imm.getWidth - 1, ImmUnion.I.len)), XLEN)
Expand Down
3 changes: 2 additions & 1 deletion src/main/scala/xiangshan/backend/exu/ExeUnitParams.scala
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ case class ExeUnitParams(
val numVlSrc: Int = fuConfigs.map(_.numVlSrc).max
val numRegSrc: Int = fuConfigs.map(_.numRegSrc).max
val numSrc: Int = fuConfigs.map(_.numSrc).max
val dataBitsMax: Int = fuConfigs.map(_.dataBits).max
val destDataBitsMax: Int = fuConfigs.map(_.destDataBits).max
val srcDataBitsMax: Int = fuConfigs.map(x => x.srcDataBits.getOrElse(x.destDataBits)).max
val readIntRf: Boolean = numIntSrc > 0
val readFpRf: Boolean = numFpSrc > 0
val readVecRf: Boolean = numVecSrc > 0
Expand Down
46 changes: 25 additions & 21 deletions src/main/scala/xiangshan/backend/fu/FuConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ import xiangshan.backend.datapath.DataConfig._
* @param writeVlRf the $fu write vl regfiles
* @param writeFflags the $fu write fflags csr
* @param writeVxsat the $fu write vxsat csr
* @param dataBits the width of data in the $fu
* @param destDataBits the width of output data in the $fu
* @param srcDataBits the width of input data in the $fu, the default value is destDataBits
* @param latency the latency of instuction executed in the $fu
* @param hasInputBuffer if the $fu has input buffer
* @param exceptionOut the $fu can produce these exception
Expand Down Expand Up @@ -57,7 +58,8 @@ case class FuConfig (
writeFakeIntRf: Boolean = false,
writeFflags : Boolean = false,
writeVxsat : Boolean = false,
dataBits : Int = 64,
destDataBits : Int = 64,
srcDataBits : Option[Int] = None,
latency : HasFuLatency = CertainLatency(0),// two field (base latency, extra latency(option))
hasInputBuffer: (Boolean, Int, Boolean) = (false, 0, false),
exceptionOut : Seq[Int] = Seq(),
Expand Down Expand Up @@ -260,7 +262,8 @@ object FuConfig {
writeVecRf = true,
writeV0Rf = true,
latency = CertainLatency(0),
dataBits = 128,
destDataBits = 128,
srcDataBits = Some(64),
immType = Set(SelImm.IMM_OPIVIU, SelImm.IMM_OPIVIS),
)

Expand All @@ -276,7 +279,8 @@ object FuConfig {
writeVecRf = true,
writeV0Rf = true,
latency = CertainLatency(0),
dataBits = 128,
destDataBits = 128,
srcDataBits = Some(64),
)

val CsrCfg: FuConfig = FuConfig (
Expand Down Expand Up @@ -523,7 +527,7 @@ object FuConfig {
latency = CertainLatency(1),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
immType = Set(SelImm.IMM_OPIVIU, SelImm.IMM_OPIVIS, SelImm.IMM_VRORVI),
)
Expand All @@ -543,7 +547,7 @@ object FuConfig {
latency = CertainLatency(2),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
)

Expand All @@ -560,7 +564,7 @@ object FuConfig {
latency = UncertainLatency(),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
)

Expand All @@ -577,7 +581,7 @@ object FuConfig {
latency = CertainLatency(2),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
immType = Set(SelImm.IMM_OPIVIU, SelImm.IMM_OPIVIS),
)
Expand All @@ -596,7 +600,7 @@ object FuConfig {
latency = CertainLatency(2),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
)

Expand All @@ -615,7 +619,7 @@ object FuConfig {
latency = CertainLatency(1),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
needSrcFrm = true,
)
Expand All @@ -634,7 +638,7 @@ object FuConfig {
latency = CertainLatency(3),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
needSrcFrm = true,
)
Expand All @@ -653,7 +657,7 @@ object FuConfig {
latency = UncertainLatency(),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
needSrcFrm = true,
)
Expand All @@ -672,7 +676,7 @@ object FuConfig {
latency = CertainLatency(2),
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
exceptionOut = Seq(illegalInstr),
needSrcFrm = true,
)
Expand All @@ -689,7 +693,7 @@ object FuConfig {
writeIntRf = true,
writeFflags = true,
latency = CertainLatency(1),
dataBits = 64,
destDataBits = 64,
needSrcFrm = true,
)

Expand All @@ -704,7 +708,7 @@ object FuConfig {
writeFpRf = true,
writeFflags = true,
latency = CertainLatency(3),
dataBits = 64,
destDataBits = 64,
needSrcFrm = true,
)

Expand All @@ -719,7 +723,7 @@ object FuConfig {
writeFpRf = true,
writeFflags = true,
latency = UncertainLatency(),
dataBits = 64,
destDataBits = 64,
needSrcFrm = true,
)

Expand All @@ -735,7 +739,7 @@ object FuConfig {
writeIntRf = true,
writeFflags = true,
latency = CertainLatency(2),
dataBits = 64,
destDataBits = 64,
needSrcFrm = true,
)

Expand All @@ -756,7 +760,7 @@ object FuConfig {
hasLoadError = true,
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
)

val VstuCfg: FuConfig = FuConfig (
Expand All @@ -774,7 +778,7 @@ object FuConfig {
hasLoadError = true,
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
)

val VseglduSeg: FuConfig = FuConfig (
Expand All @@ -794,7 +798,7 @@ object FuConfig {
hasLoadError = true,
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
)

val VsegstuCfg: FuConfig = FuConfig(
Expand All @@ -812,7 +816,7 @@ object FuConfig {
hasLoadError = true,
vconfigWakeUp = true,
maskWakeUp = true,
dataBits = 128,
destDataBits = 128,
)

def allConfigs = Seq(
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/xiangshan/backend/fu/FuncUnit.scala
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,15 @@ class FuncUnitCtrlOutput(cfg: FuConfig)(implicit p: Parameters) extends XSBundle

class FuncUnitDataInput(cfg: FuConfig)(implicit p: Parameters) extends XSBundle {
val src = MixedVec(cfg.genSrcDataVec)
val imm = UInt(cfg.dataBits.W)
val imm = UInt(cfg.destDataBits.W)
val pc = OptionWrapper(cfg.needPc, UInt(VAddrData().dataWidth.W))

def getSrcVConfig : UInt = src(cfg.vconfigIdx)
def getSrcMask : UInt = src(cfg.maskSrcIdx)
}

class FuncUnitDataOutput(cfg: FuConfig)(implicit p: Parameters) extends XSBundle {
val data = UInt(cfg.dataBits.W)
val data = UInt(cfg.destDataBits.W)
val fflags = OptionWrapper(cfg.writeFflags, UInt(5.W))
val vxsat = OptionWrapper(cfg.writeVxsat, Vxsat())
val pc = OptionWrapper(cfg.isFence, UInt(VAddrData().dataWidth.W))
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/fpu/IntFPToVec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class IntFPToVec(cfg: FuConfig)(implicit p: Parameters) extends PipedFuncUnit(cf
private val scalaData = Mux(isImm, in.data.src(1), in.data.src(0))
// vsew is the lowest 2 bits of fuOpType
private val vsew = in.ctrl.fuOpType(1, 0)
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits

private val outNAN = Seq(
Cat(0.U, Fill(3, 1.U), 1.U, 0.U(3.W)),
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/xiangshan/backend/fu/wrapper/DivUnit.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import xiangshan.backend.fu.FuConfig

class DivUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) {

val xlen = cfg.dataBits
val xlen = cfg.destDataBits

val func = io.in.bits.ctrl.fuOpType
val ctrl = Wire(new MulDivCtrl)
Expand All @@ -30,7 +30,7 @@ class DivUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) {
val robIdxReg = RegEnable(io.in.bits.ctrl.robIdx, io.in.fire)
val ctrlReg = RegEnable(ctrl, io.in.fire)

val divDataModule = Module(new SRT16DividerDataModule(cfg.dataBits))
val divDataModule = Module(new SRT16DividerDataModule(cfg.destDataBits))

val kill_w = io.in.bits.ctrl.robIdx.needFlush(io.flush)
val kill_r = !divDataModule.io.in_ready && robIdxReg.needFlush(io.flush)
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/JumpUnit.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class JumpUnit(cfg: FuConfig)(implicit p: Parameters) extends PipedFuncUnit(cfg)

// associated with AddrData's position of JmpCfg.srcData
private val src = io.in.bits.data.src(0)
private val pc = SignExt(io.in.bits.data.pc.get, cfg.dataBits)
private val pc = SignExt(io.in.bits.data.pc.get, cfg.destDataBits)
private val immMin = io.in.bits.data.imm
private val func = io.in.bits.ctrl.fuOpType
private val isRVC = io.in.bits.ctrl.preDecode.get.isRVC
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/xiangshan/backend/fu/wrapper/MulUnit.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class MulUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg)
{
override def latency: Int = 2

private val xlen = cfg.dataBits
private val xlen = cfg.destDataBits

val func = io.in.bits.ctrl.fuOpType
val src = io.in.bits.data.src
Expand All @@ -35,7 +35,7 @@ class MulUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg)
)

// len should be xlen + 1
private val len = cfg.dataBits + 1
private val len = cfg.destDataBits + 1
private val mulDataModule = Module(new ArrayMulDataModule(len))

mulDataModule.io.a := LookupTree(
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/VCVT.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class VCVT(cfg: FuConfig)(implicit p: Parameters) extends VecPipedFuncUnit(cfg)
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VfpuType.dummy, "Vfcvt OpType not supported")

// params alias
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits
private val dataWidthOfDataModule = 64
private val numVecModule = dataWidth / dataWidthOfDataModule

Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/VFALU.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class VFAlu(cfg: FuConfig)(implicit p: Parameters) extends VecPipedFuncUnit(cfg)
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VfpuType.dummy, "Vfalu OpType not supported")

// params alias
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits
private val dataWidthOfDataModule = 64
private val numVecModule = dataWidth / dataWidthOfDataModule

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class VFDivSqrt(cfg: FuConfig)(implicit p: Parameters) extends VecNonPipedFuncUn
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VfpuType.dummy, "Vfdiv OpType not supported")

// params alias
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits
private val dataWidthOfDataModule = 64
private val numVecModule = dataWidth / dataWidthOfDataModule

Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/VFMA.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class VFMA(cfg: FuConfig)(implicit p: Parameters) extends VecPipedFuncUnit(cfg)
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VfpuType.dummy, "Vfalu OpType not supported")

// params alias
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits
private val dataWidthOfDataModule = 64
private val numVecModule = dataWidth / dataWidthOfDataModule

Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/VIAluFix.scala
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ class VIAluFix(cfg: FuConfig)(implicit p: Parameters) extends VecPipedFuncUnit(c
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VialuFixType.dummy, "VialuF OpType not supported")

// config params
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits
private val dataWidthOfDataModule = 64
private val numVecModule = dataWidth / dataWidthOfDataModule

Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/VIDiv.scala
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class VIDiv(cfg: FuConfig)(implicit p: Parameters) extends VecNonPipedFuncUnit(c
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VidivType.dummy, "Vfdiv OpType not supported")

// params alias
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits

// modules
private val vidiv = Module(new VectorIdiv)
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/VIMacU.scala
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class VIMacU(cfg: FuConfig)(implicit p: Parameters) extends VecPipedFuncUnit(cfg
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VimacType.dummy, "VialuF OpType not supported")

// params alias
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits
private val dataWidthOfDataModule = 64
private val numVecModule = dataWidth / dataWidthOfDataModule

Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/VIPU.scala
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ class VIPU(cfg: FuConfig)(implicit p: Parameters) extends VecPipedFuncUnit(cfg)
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VipuType.dummy, "VIPU OpType not supported")

// params alias
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits
private val dataWidthOfDataModule = 64
private val numVecModule = dataWidth / dataWidthOfDataModule
private val needClearVs1 = (VipuType.vcpop_m === io.in.bits.ctrl.fuOpType && vuopIdx === 0.U) ||
Expand Down
2 changes: 1 addition & 1 deletion src/main/scala/xiangshan/backend/fu/wrapper/VPPU.scala
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class VPPU(cfg: FuConfig)(implicit p: Parameters) extends VecPipedFuncUnit(cfg)
XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VpermType.dummy, "VpermType OpType not supported")

// params alias
private val dataWidth = cfg.dataBits
private val dataWidth = cfg.destDataBits
private val dataWidthOfDataModule = 64
private val numVecModule = dataWidth / dataWidthOfDataModule
private val vppuNeedClearMask = (VpermType.vcompress === io.in.bits.ctrl.fuOpType) && (vuopIdx(log2Up(MaxUopSize)-1,1) === 0.U)
Expand Down

0 comments on commit 2d12882

Please sign in to comment.