1package xiangshan.backend.fu 2 3import chisel3._ 4import chisel3.util._ 5 6import xiangshan._ 7import utils._ 8 9import FunctionUnit._ 10 11/* 12 XiangShan Function Unit 13 A Exu can have one or more function units 14 */ 15 16trait HasFuLatency { 17 val latencyVal: Option[Int] 18} 19 20case class CertainLatency(value: Int) extends HasFuLatency{ 21 override val latencyVal: Option[Int] = Some(value) 22} 23 24case class UncertainLatency() extends HasFuLatency { 25 override val latencyVal: Option[Int] = None 26} 27 28case class NexusLatency(value: Int) extends HasFuLatency { 29 override val latencyVal: Option[Int] = Some(value) 30} 31 32case class FuConfig 33( 34 fuType: UInt, 35 numIntSrc: Int, 36 numFpSrc: Int, 37 writeIntRf: Boolean, 38 writeFpRf: Boolean, 39 hasRedirect: Boolean, 40 latency: HasFuLatency = CertainLatency(0) 41) 42 43class FunctionUnitIO extends XSBundle { 44 val in = Flipped(Decoupled(new Bundle { 45 val src1 = Output(UInt(XLEN.W)) 46 val src2 = Output(UInt(XLEN.W)) 47 val src3 = Output(UInt(XLEN.W)) 48 val func = Output(FuOpType()) 49 })) 50 val out = Decoupled(Output(UInt(XLEN.W))) 51} 52 53abstract class FunctionUnit(cfg: FuConfig) extends XSModule 54 55object FunctionUnit { 56 57 val csrCfg = 58 FuConfig(FuType.csr, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false) 59 60 val jmpCfg = 61 FuConfig(FuType.jmp, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true) 62 63 val i2fCfg = 64 FuConfig(FuType.i2f, 1, 0, writeIntRf = false, writeFpRf = true, hasRedirect = false) 65 66 val aluCfg = 67 FuConfig(FuType.alu, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true) 68 69 val mulCfg = 70 FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false, 71 CertainLatency(3) 72 ) 73 74 val divCfg = 75 FuConfig(FuType.div, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false, 76 UncertainLatency() 77 ) 78 79 val fenceCfg = 80 FuConfig(FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false/*NOTE: need redirect but when commit*/) 81 82 val lduCfg = 83 FuConfig(FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, hasRedirect = false, 84 UncertainLatency() 85 ) 86 87 val stuCfg = 88 FuConfig(FuType.stu, 2, 1, writeIntRf = false, writeFpRf = false, hasRedirect = false, 89 UncertainLatency() 90 ) 91 92 val mouCfg = 93 FuConfig(FuType.mou, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false, 94 UncertainLatency() 95 ) 96 97 val fmacCfg = 98 FuConfig(FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, hasRedirect = false, 99 CertainLatency(5) 100 ) 101 102 val fmiscCfg = 103 FuConfig(FuType.fmisc, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false, 104 CertainLatency(2) 105 ) 106 107 val fDivSqrtCfg = 108 FuConfig(FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false, 109 UncertainLatency() 110 ) 111} 112