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