xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/WbConfig.scala (revision 45d40ce719a8202e16a540541c72fd4de6dfde60)
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