xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRBundles.scala (revision dafddbf0ee612a40fe658c7c5a3c3d680a2ced81)
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 isModeHUorVU: Bool = this.PRVM === PrivMode.U
63
64    def isVirtual: Bool = this.V === VirtMode.On
65
66    // VU < VS < HS < M
67    // HU < HS < M
68    def < (that: PrivState): Bool = {
69      (this.isVirtual && (that.isModeM || that.isModeHS)) ||
70        (this.V === that.V && this.PRVM < that.PRVM)
71    }
72
73    def > (that: PrivState): Bool = {
74      (that.isVirtual && (this.isModeM || this.isModeHS)) ||
75        (that.V === this.V && that.PRVM < this.PRVM)
76    }
77  }
78
79  object PrivState {
80    def ModeM: PrivState = WireInit((new PrivState).Lit(
81      _.PRVM -> PrivMode.M,
82      _.V    -> VirtMode.Off,
83    ))
84
85    def ModeHS: PrivState = WireInit((new PrivState).Lit(
86      _.PRVM -> PrivMode.S,
87      _.V    -> VirtMode.Off,
88    ))
89
90    def ModeHU: PrivState = WireInit((new PrivState).Lit(
91      _.PRVM -> PrivMode.U,
92      _.V    -> VirtMode.Off,
93    ))
94
95    def ModeVS: PrivState = WireInit((new PrivState).Lit(
96      _.PRVM -> PrivMode.S,
97      _.V    -> VirtMode.On,
98    ))
99
100    def ModeVU: PrivState = WireInit((new PrivState).Lit(
101      _.PRVM -> PrivMode.U,
102      _.V    -> VirtMode.On,
103    ))
104  }
105}
106