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