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