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 16*3e60a357SLinJiaweitrait HasFuLatency { 17*3e60a357SLinJiawei val latencyVal: Option[Int] 18*3e60a357SLinJiawei} 19*3e60a357SLinJiawei 20*3e60a357SLinJiaweicase class CertainLatency(value: Int) extends HasFuLatency{ 21*3e60a357SLinJiawei override val latencyVal: Option[Int] = Some(value) 22*3e60a357SLinJiawei} 23*3e60a357SLinJiawei 24*3e60a357SLinJiaweicase class UncertainLatency() extends HasFuLatency { 25*3e60a357SLinJiawei override val latencyVal: Option[Int] = None 26*3e60a357SLinJiawei} 27*3e60a357SLinJiawei 28*3e60a357SLinJiaweicase class NexusLatency(value: Int) extends HasFuLatency { 29*3e60a357SLinJiawei override val latencyVal: Option[Int] = Some(value) 30*3e60a357SLinJiawei} 31*3e60a357SLinJiawei 32cafb3558SLinJiaweicase class FuConfig 33cafb3558SLinJiawei( 34cafb3558SLinJiawei fuType: UInt, 35cafb3558SLinJiawei numIntSrc: Int, 36cafb3558SLinJiawei numFpSrc: Int, 37cafb3558SLinJiawei writeIntRf: Boolean, 38cafb3558SLinJiawei writeFpRf: Boolean, 39*3e60a357SLinJiawei hasRedirect: Boolean, 40*3e60a357SLinJiawei latency: HasFuLatency = CertainLatency(0) 41cafb3558SLinJiawei) 42cafb3558SLinJiawei 43c84054caSLinJiaweiclass FunctionUnitIO extends XSBundle { 44c84054caSLinJiawei val in = Flipped(Decoupled(new Bundle { 45c84054caSLinJiawei val src1 = Output(UInt(XLEN.W)) 46c84054caSLinJiawei val src2 = Output(UInt(XLEN.W)) 47c84054caSLinJiawei val src3 = Output(UInt(XLEN.W)) 48c84054caSLinJiawei val func = Output(FuOpType()) 49c84054caSLinJiawei })) 50c84054caSLinJiawei val out = Decoupled(Output(UInt(XLEN.W))) 51c84054caSLinJiawei} 52c84054caSLinJiawei 53cafb3558SLinJiaweiabstract class FunctionUnit(cfg: FuConfig) extends XSModule 54cafb3558SLinJiawei 55cafb3558SLinJiaweiobject FunctionUnit { 56c84054caSLinJiawei 57c84054caSLinJiawei val csrCfg = 58c84054caSLinJiawei FuConfig(FuType.csr, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false) 59c84054caSLinJiawei 60cafb3558SLinJiawei val jmpCfg = 61cafb3558SLinJiawei FuConfig(FuType.jmp, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true) 62cafb3558SLinJiawei 63cafb3558SLinJiawei val i2fCfg = 64cafb3558SLinJiawei FuConfig(FuType.i2f, 1, 0, writeIntRf = false, writeFpRf = true, hasRedirect = false) 65cafb3558SLinJiawei 66cafb3558SLinJiawei val aluCfg = 67cafb3558SLinJiawei FuConfig(FuType.alu, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true) 68cafb3558SLinJiawei 69cafb3558SLinJiawei val mulCfg = 70*3e60a357SLinJiawei FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false, 71*3e60a357SLinJiawei CertainLatency(3) 72*3e60a357SLinJiawei ) 73cafb3558SLinJiawei 74cafb3558SLinJiawei val divCfg = 75*3e60a357SLinJiawei FuConfig(FuType.div, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false, 76*3e60a357SLinJiawei UncertainLatency() 77*3e60a357SLinJiawei ) 78cafb3558SLinJiawei 79b8f08ca0SZhangZifei val fenceCfg = 80b8f08ca0SZhangZifei FuConfig(FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false/*NOTE: need redirect but when commit*/) 81b8f08ca0SZhangZifei 826624015fSLinJiawei val lduCfg = 83*3e60a357SLinJiawei FuConfig(FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, hasRedirect = false, 84*3e60a357SLinJiawei UncertainLatency() 85*3e60a357SLinJiawei ) 866624015fSLinJiawei 876624015fSLinJiawei val stuCfg = 88*3e60a357SLinJiawei FuConfig(FuType.stu, 2, 1, writeIntRf = false, writeFpRf = false, hasRedirect = false, 89*3e60a357SLinJiawei UncertainLatency() 90*3e60a357SLinJiawei ) 91cafb3558SLinJiawei 9268c44d2dSAllen val mouCfg = 93*3e60a357SLinJiawei FuConfig(FuType.mou, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false, 94*3e60a357SLinJiawei UncertainLatency() 95*3e60a357SLinJiawei ) 9668c44d2dSAllen 97cafb3558SLinJiawei val fmacCfg = 98*3e60a357SLinJiawei FuConfig(FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, hasRedirect = false, 99*3e60a357SLinJiawei CertainLatency(5) 100*3e60a357SLinJiawei ) 101cafb3558SLinJiawei 102cafb3558SLinJiawei val fmiscCfg = 103*3e60a357SLinJiawei FuConfig(FuType.fmisc, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false, 104*3e60a357SLinJiawei CertainLatency(2) 105*3e60a357SLinJiawei ) 106cafb3558SLinJiawei 107cafb3558SLinJiawei val fDivSqrtCfg = 108*3e60a357SLinJiawei FuConfig(FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false, 109*3e60a357SLinJiawei UncertainLatency() 110*3e60a357SLinJiawei ) 111cafb3558SLinJiawei} 112