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