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 def writeV0 = dataCfg == V0Data() 17 def writeVl = dataCfg == VlData() 18 19 override def toString: String = { 20 var res = this match { 21 case _: IntWB => "INT" 22 case _: FpWB => "FP" 23 case _: VfWB => "VF" 24 case _: V0WB => "V0" 25 case _: VlWB => "VL" 26 case _: NoWB => "NO" 27 case _ => "??" 28 } 29 res += s"($port)" 30 res 31 } 32 } 33 34 sealed abstract class ExuWB extends WbConfig 35 36 sealed abstract class PregWB extends ExuWB { 37 val priority: Int 38 39 def numPreg(backendParams: BackendParams): Int 40 41 def pregIdxWidth(backendParams: BackendParams) = log2Up(numPreg(backendParams)) 42 } 43 44 case class IntWB( 45 port : Int = -1, 46 priority: Int = Int.MaxValue, 47 ) extends PregWB { 48 49 def dataCfg: DataConfig = IntData() 50 51 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(IntData()).numEntries 52 } 53 54 case class FpWB( 55 port: Int = -1, 56 priority: Int = Int.MaxValue, 57 ) extends PregWB { 58 59 def dataCfg: DataConfig = FpData() 60 61 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FpData()).numEntries 62 } 63 64 case class VfWB( 65 port : Int = -1, 66 priority: Int = Int.MaxValue, 67 ) extends PregWB { 68 69 def dataCfg: DataConfig = VecData() 70 71 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VecData()).numEntries 72 } 73 74 case class V0WB( 75 port : Int = -1, 76 priority: Int = Int.MaxValue, 77 ) extends PregWB { 78 79 def dataCfg: DataConfig = V0Data() 80 81 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(V0Data()).numEntries 82 } 83 84 case class VlWB( 85 port : Int = -1, 86 priority: Int = Int.MaxValue, 87 ) extends PregWB { 88 89 def dataCfg: DataConfig = VlData() 90 91 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VlData()).numEntries 92 } 93 94 case class NoWB( 95 port : Int = -1, 96 priority: Int = Int.MaxValue, 97 ) extends PregWB { 98 99 override def dataCfg: DataConfig = NoData() 100 101 override def numPreg(backendParams: BackendParams): Int = 0 102 } 103 104 case class CtrlWB( 105 port: Int = -1, 106 ) extends WbConfig { 107 val priority: Int = Int.MaxValue 108 override def dataCfg: DataConfig = NoData() 109 } 110 111 case class FakeIntWB( 112 port : Int = -1, 113 priority: Int = Int.MaxValue, 114 ) extends PregWB { 115 116 def dataCfg: DataConfig = FakeIntData() 117 118 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FakeIntData()).numEntries 119 } 120} 121