xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/WbConfig.scala (revision 2e0a7dc5b7b351e89578b74832f6ea55c6a89344)
1package xiangshan.backend.datapath
2
3import chisel3.util.log2Up
4import xiangshan.backend.datapath.DataConfig._
5
6object WbConfig {
7  sealed abstract class WbConfig() {
8    val port: Int
9    def dataCfg: DataConfig
10    def numPreg: Int = 0
11    def dataWidth: Int = dataCfg.dataWidth
12
13    def pregIdxWidth = log2Up(numPreg)
14
15    def writeInt = dataCfg == IntData()
16    def writeFp = dataCfg == FpData()
17    def writeVec = dataCfg == VecData()
18  }
19
20  sealed abstract class ExuWB extends WbConfig
21
22  sealed abstract class PregWB extends ExuWB {
23    val priority: Int
24  }
25
26  case class IntWB(
27    port    : Int = -1,
28    priority: Int = Int.MaxValue,
29  ) extends PregWB {
30    def dataCfg: DataConfig = IntData()
31    override def numPreg: Int = 160
32  }
33
34  case class VfWB(
35    port    : Int = -1,
36    priority: Int = Int.MaxValue,
37  ) extends PregWB {
38    def dataCfg: DataConfig = VecData()
39    override def numPreg: Int = 160
40  }
41
42  case class VecWB(
43    port: Int = -1,
44    priority: Int = Int.MaxValue,
45  ) extends PregWB {
46    def dataCfg: DataConfig = VecData()
47
48    override def numPreg: Int = 160
49  }
50
51  case class CtrlWB(
52    port: Int = -1,
53  ) extends WbConfig {
54    val priority: Int = Int.MaxValue
55    override def dataCfg: DataConfig = NoData()
56  }
57
58  // Todo: use it
59  sealed trait WBSource
60  case class WBFromInt() extends WBSource
61  case class WBFromMem() extends WBSource
62  case class WBFromVec() extends WBSource
63  case class WBFromFp()  extends WBSource
64}
65
66