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 V0WB( 71 port : Int = -1, 72 priority: Int = Int.MaxValue, 73 ) extends PregWB { 74 75 def dataCfg: DataConfig = MaskSrcData() 76 77 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(MaskSrcData()).numEntries 78 } 79 80 case class VlWB( 81 port : Int = -1, 82 priority: Int = Int.MaxValue, 83 ) extends PregWB { 84 85 def dataCfg: DataConfig = VConfigData() 86 87 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VConfigData()).numEntries 88 } 89 90 case class NoWB( 91 port : Int = -1, 92 priority: Int = Int.MaxValue, 93 ) extends PregWB { 94 95 override def dataCfg: DataConfig = NoData() 96 97 override def numPreg(backendParams: BackendParams): Int = 0 98 } 99 100 case class CtrlWB( 101 port: Int = -1, 102 ) extends WbConfig { 103 val priority: Int = Int.MaxValue 104 override def dataCfg: DataConfig = NoData() 105 } 106 107 case class FakeIntWB( 108 port : Int = -1, 109 priority: Int = Int.MaxValue, 110 ) extends PregWB { 111 112 def dataCfg: DataConfig = FakeIntData() 113 114 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(FakeIntData()).numEntries 115 } 116} 117