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 32 33 34case class FuConfig 35( 36 fuType: UInt, 37 numIntSrc: Int, 38 numFpSrc: Int, 39 writeIntRf: Boolean, 40 writeFpRf: Boolean, 41 hasRedirect: Boolean, 42 latency: HasFuLatency = CertainLatency(0) 43) 44 45class FunctionUnitIO extends XSBundle { 46 val in = Flipped(Decoupled(new Bundle { 47 val src1 = Output(UInt(XLEN.W)) 48 val src2 = Output(UInt(XLEN.W)) 49 val src3 = Output(UInt(XLEN.W)) 50 val func = Output(FuOpType()) 51 })) 52 val out = Decoupled(Output(UInt(XLEN.W))) 53} 54 55abstract class FunctionUnit(cfg: FuConfig) extends XSModule 56 57object FunctionUnit { 58 59 val csrCfg = 60 FuConfig(FuType.csr, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false) 61 62 val jmpCfg = 63 FuConfig(FuType.jmp, 1, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true) 64 65 val i2fCfg = 66 FuConfig(FuType.i2f, 1, 0, writeIntRf = false, writeFpRf = true, hasRedirect = false) 67 68 val aluCfg = 69 FuConfig(FuType.alu, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = true) 70 71 val mulCfg = 72 FuConfig(FuType.mul, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false, 73 UncertainLatency()// CertainLatency(3) 74 ) 75 76 val divCfg = 77 FuConfig(FuType.div, 2, 0, writeIntRf = true, writeFpRf = false, hasRedirect = false, 78 UncertainLatency() 79 ) 80 81 val fenceCfg = 82 FuConfig(FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false/*NOTE: need redirect but when commit*/) 83 84 val lduCfg = 85 FuConfig(FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, hasRedirect = false, 86 UncertainLatency() 87 ) 88 89 val stuCfg = 90 FuConfig(FuType.stu, 2, 1, writeIntRf = false, writeFpRf = false, hasRedirect = false, 91 UncertainLatency() 92 ) 93 94 val mouCfg = 95 FuConfig(FuType.mou, 2, 0, writeIntRf = false, writeFpRf = false, hasRedirect = false, 96 UncertainLatency() 97 ) 98 99 val fmacCfg = 100 FuConfig(FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, hasRedirect = false, 101 CertainLatency(5) 102 ) 103 104 val fmiscCfg = 105 FuConfig(FuType.fmisc, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false, 106 CertainLatency(2) 107 ) 108 109 val fDivSqrtCfg = 110 FuConfig(FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, hasRedirect = false, 111 UncertainLatency() 112 ) 113} 114