1package xiangshan.backend.datapath 2 3import chisel3.util.log2Up 4import xiangshan.backend.BackendParams 5import xiangshan.backend.datapath.DataConfig._ 6 7object WbConfig { 8 sealed abstract class WbConfig() { 9 val port: Int 10 def dataCfg: DataConfig 11 def dataWidth: Int = dataCfg.dataWidth 12 13 def writeInt = dataCfg == IntData() 14 def writeFp = dataCfg == FpData() 15 def writeVec = dataCfg == VecData() 16 17 override def toString: String = { 18 var res = this match { 19 case _: IntWB => "INT" 20 case _: FpWB => "FP" 21 case _: VfWB => "VF" 22 case _: NoWB => "NO" 23 case _ => "??" 24 } 25 res += s"($port)" 26 res 27 } 28 } 29 30 sealed abstract class ExuWB extends WbConfig 31 32 sealed abstract class PregWB extends ExuWB { 33 val priority: Int 34 35 def numPreg(backendParams: BackendParams): Int 36 37 def pregIdxWidth(backendParams: BackendParams) = log2Up(numPreg(backendParams)) 38 } 39 40 case class IntWB( 41 port : Int = -1, 42 priority: Int = Int.MaxValue, 43 ) extends PregWB { 44 45 def dataCfg: DataConfig = IntData() 46 47 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(IntData()).numEntries 48 } 49 50 case class FpWB( 51 port: Int = -1, 52 priority: Int = Int.MaxValue, 53 ) extends PregWB { 54 55 def dataCfg: DataConfig = FpData() 56 57 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FpData()).numEntries 58 } 59 60 case class VfWB( 61 port : Int = -1, 62 priority: Int = Int.MaxValue, 63 ) extends PregWB { 64 65 def dataCfg: DataConfig = VecData() 66 67 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VecData()).numEntries 68 } 69 70 case class NoWB( 71 port : Int = -1, 72 priority: Int = Int.MaxValue, 73 ) extends PregWB { 74 75 override def dataCfg: DataConfig = NoData() 76 77 override def numPreg(backendParams: BackendParams): Int = 0 78 } 79 80 case class CtrlWB( 81 port: Int = -1, 82 ) extends WbConfig { 83 val priority: Int = Int.MaxValue 84 override def dataCfg: DataConfig = NoData() 85 } 86 87 case class FakeIntWB( 88 port : Int = -1, 89 priority: Int = Int.MaxValue, 90 ) extends PregWB { 91 92 def dataCfg: DataConfig = FakeIntData() 93 94 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FakeIntData()).numEntries 95 } 96} 97