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