xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRBundles.scala (revision 237d4cfdf1ee221ec141b1ffee983a89747b6608)
1package xiangshan.backend.fu.NewCSR
2
3import chisel3._
4import chisel3.experimental.BundleLiterals._
5import xiangshan.backend.fu.NewCSR.CSRDefines.{
6  CSRROField => RO,
7  CSRRWField => RW,
8  CSRWARLField => WARL,
9  _
10}
11import xiangshan.backend.fu.NewCSR.CSRFunc._
12
13object CSRBundles {
14  class XtvecBundle extends CSRBundle {
15    val mode = XtvecMode(1, 0, wNoFilter)
16    val addr = WARL(63, 2, wNoFilter)
17  }
18
19  class CauseBundle extends CSRBundle {
20    val Interrupt = RW(63)
21    val ExceptionCode = RW(62, 0)
22  }
23
24  class Counteren extends CSRBundle {
25    val CY = RW(0)
26    val TM = RW(1)
27    val IR = RW(2)
28    val HPM = RW(31, 3)
29  }
30
31  class OneFieldBundle extends CSRBundle {
32    val ALL = RW(63, 0)
33  }
34
35  class Envcfg extends CSRBundle {
36    val STCE  = RO(    63).withReset(0.U)
37    val PBMTE = RO(    62).withReset(0.U)
38    val ADUE  = RO(    61).withReset(0.U)
39    val PMM   = RO(33, 32).withReset(0.U)
40    val CBZE  = RO(     7).withReset(0.U)
41    val CBCFE = RO(     6).withReset(0.U)
42    val CBIE  = RO( 5,  4).withReset(0.U)
43    val FIOM  = RO(     0).withReset(0.U)
44  }
45
46  class PrivState extends Bundle {
47    val PRVM = PrivMode(0)
48    val V    = VirtMode(0)
49
50    def isModeHU: Bool = this.V === VirtMode.Off && this.PRVM === PrivMode.U
51
52    def isModeHS: Bool = this.V === VirtMode.Off && this.PRVM === PrivMode.S
53
54    def isModeHUorHS: Bool = this.V === VirtMode.Off && this.PRVM.isOneOf(PrivMode.S, PrivMode.U)
55
56    def isModeM: Bool = this.V === VirtMode.Off && this.PRVM === PrivMode.M
57
58    def isModeVU: Bool = this.V === VirtMode.On && this.PRVM === PrivMode.U
59
60    def isModeVS: Bool = this.V === VirtMode.On && this.PRVM === PrivMode.S
61
62    def isVirtual: Bool = this.V === VirtMode.On
63  }
64
65  object PrivState {
66    def ModeM: PrivState = WireInit((new PrivState).Lit(
67      _.PRVM -> PrivMode.M,
68      _.V    -> VirtMode.Off,
69    ))
70
71    def ModeHS: PrivState = WireInit((new PrivState).Lit(
72      _.PRVM -> PrivMode.S,
73      _.V    -> VirtMode.Off,
74    ))
75
76    def ModeHU: PrivState = WireInit((new PrivState).Lit(
77      _.PRVM -> PrivMode.U,
78      _.V    -> VirtMode.Off,
79    ))
80
81    def ModeVS: PrivState = WireInit((new PrivState).Lit(
82      _.PRVM -> PrivMode.S,
83      _.V    -> VirtMode.On,
84    ))
85
86    def ModeVU: PrivState = WireInit((new PrivState).Lit(
87      _.PRVM -> PrivMode.U,
88      _.V    -> VirtMode.On,
89    ))
90  }
91}
92