xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRBundles.scala (revision 760398d77ceaf708c6dbc8a489765e90cd0e0aae)
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._
9import xiangshan.backend.fu.fpu.Bundles.Fflags
10import xiangshan.backend.fu.vector.Bundles.{Vl, Vstart, Vxsat}
11import xiangshan.frontend.BPUCtrl
12import chisel3.experimental.noPrefix
13
14object CSRBundles {
15  class XtvecBundle extends CSRBundle {
16    val mode = XtvecMode(1, 0, wNoFilter)
17    val addr = WARL(63, 2, wNoFilter)
18  }
19
20  class CauseBundle extends CSRBundle {
21    val Interrupt = RW(63)
22    val ExceptionCode = RW(62, 0)
23  }
24
25  class Counteren extends CSRBundle {
26    val CY = RW(0)
27    val TM = RW(1)
28    val IR = RW(2)
29    val HPM = RW(31, 3)
30  }
31
32  class OneFieldBundle extends CSRBundle {
33    val ALL = RW(63, 0)
34  }
35
36  class Envcfg extends CSRBundle {
37    val STCE  = RO(    63).withReset(0.U)
38    val PBMTE = RO(    62).withReset(0.U)
39    val ADUE  = RO(    61).withReset(0.U)
40    val PMM   = RO(33, 32).withReset(0.U)
41    val CBZE  = RO(     7).withReset(0.U)
42    val CBCFE = RO(     6).withReset(0.U)
43    val CBIE  = RO( 5,  4).withReset(0.U)
44    val FIOM  = RO(     0).withReset(0.U)
45  }
46
47  class PrivState extends Bundle { self =>
48    val PRVM = PrivMode(0)
49    val V    = VirtMode(0)
50
51    def isModeM: Bool = isModeMImpl()
52
53    def isModeHS: Bool = isModeHSImpl()
54
55    def isModeHU: Bool = isModeHUImpl()
56
57    def isModeVU: Bool = isModeVUImpl()
58
59    def isModeVS: Bool = isModeVSImpl()
60
61    def isModeHUorVU: Bool = this.PrvmIsU()
62
63    def isVirtual: Bool = this.V.isOneOf(VirtMode.On)
64
65    private[this] object PrvmIsM {
66      val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.M).suggestName("PrvmIsM"))
67      def apply(): Bool = v
68    }
69
70    private[this] object PrvmIsS {
71      val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.S).suggestName("PrvmIsS"))
72      def apply(): Bool = v
73    }
74
75    private[this] object PrvmIsU {
76      val v: Bool = dontTouch(WireInit(self.PRVM === PrivMode.U).suggestName("PrvmIsU"))
77      def apply(): Bool = v
78    }
79
80    private[this] object isModeMImpl {
81      val v: Bool = dontTouch(WireInit(PrvmIsM()).suggestName("isModeM"))
82      def apply(): Bool = v
83    }
84
85    private[this] object isModeHSImpl {
86      val v: Bool = dontTouch(WireInit(!self.isVirtual && noPrefix(PrvmIsS())).suggestName("isModeHS"))
87      def apply(): Bool = v
88    }
89
90    private[this] object isModeHUImpl {
91      val v: Bool = dontTouch(WireInit(!self.isVirtual && noPrefix(PrvmIsU())).suggestName("isModeHU"))
92      def apply(): Bool = v
93    }
94
95    private[this] object isModeVSImpl {
96      val v: Bool = dontTouch(WireInit(self.isVirtual && noPrefix(PrvmIsS())).suggestName("isModeVS"))
97      def apply(): Bool = v
98    }
99
100    private[this] object isModeVUImpl {
101      val v: Bool = dontTouch(WireInit(self.isVirtual && noPrefix(PrvmIsU())).suggestName("isModeVU"))
102      def apply(): Bool = v
103    }
104
105    // VU < VS < HS < M
106    // HU < HS < M
107    def < (that: PrivState): Bool = {
108      (this.isVirtual && (that.isModeM || that.isModeHS)) ||
109        (this.V === that.V && this.PRVM < that.PRVM)
110    }
111
112    def > (that: PrivState): Bool = {
113      (that.isVirtual && (this.isModeM || this.isModeHS)) ||
114        (that.V === this.V && that.PRVM < this.PRVM)
115    }
116  }
117
118  object PrivState {
119    def ModeM: PrivState = WireInit((new PrivState).Lit(
120      _.PRVM -> PrivMode.M,
121      _.V    -> VirtMode.Off,
122    ))
123
124    def ModeHS: PrivState = WireInit((new PrivState).Lit(
125      _.PRVM -> PrivMode.S,
126      _.V    -> VirtMode.Off,
127    ))
128
129    def ModeHU: PrivState = WireInit((new PrivState).Lit(
130      _.PRVM -> PrivMode.U,
131      _.V    -> VirtMode.Off,
132    ))
133
134    def ModeVS: PrivState = WireInit((new PrivState).Lit(
135      _.PRVM -> PrivMode.S,
136      _.V    -> VirtMode.On,
137    ))
138
139    def ModeVU: PrivState = WireInit((new PrivState).Lit(
140      _.PRVM -> PrivMode.U,
141      _.V    -> VirtMode.On,
142    ))
143  }
144
145  class RobCommitCSR(implicit p: Parameters) extends Bundle {
146    // need contain 8x8
147    val instNum = ValidIO(UInt(7.W))
148    val fflags  = ValidIO(Fflags())
149    val fsDirty = Bool()
150    val vxsat   = ValidIO(Vxsat())
151    val vsDirty = Bool()
152    val vtype   = ValidIO(new CSRVTypeBundle)
153    val vl      = ValidIO(Vl())
154    val vstart  = ValidIO(Vstart())
155  }
156
157  class CSRCustomState(implicit p: Parameters) extends Bundle {
158    // Prefetcher
159    val l1I_pf_enable = Output(Bool())
160    val l2_pf_enable = Output(Bool())
161    val l1D_pf_enable = Output(Bool())
162    val l1D_pf_train_on_hit = Output(Bool())
163    val l1D_pf_enable_agt = Output(Bool())
164    val l1D_pf_enable_pht = Output(Bool())
165    val l1D_pf_active_threshold = Output(UInt(4.W))
166    val l1D_pf_active_stride = Output(UInt(6.W))
167    val l1D_pf_enable_stride = Output(Bool())
168    val l2_pf_store_only = Output(Bool())
169    // ICache
170    val icache_parity_enable = Output(Bool())
171    // Labeled XiangShan
172    val dsid = Output(UInt(8.W)) // TODO: DsidWidth as parameter
173    // Load violation predictor
174    val lvpred_disable = Output(Bool())
175    val no_spec_load = Output(Bool())
176    val storeset_wait_store = Output(Bool())
177    val storeset_no_fast_wakeup = Output(Bool())
178    val lvpred_timeout = Output(UInt(5.W))
179    // Branch predictor
180    val bp_ctrl = Output(new BPUCtrl)
181    // Memory Block
182    val sbuffer_threshold = Output(UInt(4.W))
183    val ldld_vio_check_enable = Output(Bool())
184    val soft_prefetch_enable = Output(Bool())
185    val cache_error_enable = Output(Bool())
186    val uncache_write_outstanding_enable = Output(Bool())
187    // Rename
188    val fusion_enable = Output(Bool())
189    val wfi_enable = Output(Bool())
190    // Decode
191    val svinval_enable = Output(Bool())
192  }
193}
194