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