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