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 _: VfWB => "VF" 21 case _: NoWB => "NO" 22 case _ => "??" 23 } 24 res += s"($port)" 25 res 26 } 27 } 28 29 sealed abstract class ExuWB extends WbConfig 30 31 sealed abstract class PregWB extends ExuWB { 32 val priority: Int 33 34 def numPreg(backendParams: BackendParams): Int 35 36 def pregIdxWidth(backendParams: BackendParams) = log2Up(numPreg(backendParams)) 37 } 38 39 case class IntWB( 40 port : Int = -1, 41 priority: Int = Int.MaxValue, 42 ) extends PregWB { 43 44 def dataCfg: DataConfig = IntData() 45 46 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(IntData()).numEntries 47 } 48 49 case class VfWB( 50 port : Int = -1, 51 priority: Int = Int.MaxValue, 52 ) extends PregWB { 53 54 def dataCfg: DataConfig = VecData() 55 56 def numPreg(backendParams: BackendParams): Int = backendParams.getPregParams(VecData()).numEntries 57 } 58 59 case class NoWB( 60 port : Int = -1, 61 priority: Int = Int.MaxValue, 62 ) extends PregWB { 63 64 override def dataCfg: DataConfig = NoData() 65 66 override def numPreg(backendParams: BackendParams): Int = 0 67 } 68 69 case class CtrlWB( 70 port: Int = -1, 71 ) extends WbConfig { 72 val priority: Int = Int.MaxValue 73 override def dataCfg: DataConfig = NoData() 74 } 75} 76 77