xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRDefines.scala (revision 491c16ade93d4956fec6dde187943d72bb010bc4)
1package xiangshan.backend.fu.NewCSR
2
3import chisel3._
4import xiangshan.backend.fu.NewCSR.CSRFunc._
5
6import scala.language.experimental.macros
7import scala.reflect.runtime.{universe => ru}
8
9object CSRDefines {
10  object CSRField1Bits extends CSREnum with CSRMacroApply
11
12  object CSRField2Bits extends CSREnum with CSRMacroApply
13
14  object CSRField3Bits extends CSREnum with CSRMacroApply
15
16  object CSRField4Bits extends CSREnum with CSRMacroApply
17
18  object CSRField5Bits extends CSREnum with CSRMacroApply
19
20  object CSRField6Bits extends CSREnum with CSRMacroApply
21
22  object CSRField7Bits extends CSREnum with CSRMacroApply
23
24  object CSRField8Bits extends CSREnum with CSRMacroApply
25
26  object CSRField9Bits extends CSREnum with CSRMacroApply
27
28  object CSRField10Bits extends CSREnum with CSRMacroApply
29
30  object CSRField11Bits extends CSREnum with CSRMacroApply
31
32  object CSRField12Bits extends CSREnum with CSRMacroApply
33
34  object CSRField13Bits extends CSREnum with CSRMacroApply
35
36  object CSRField14Bits extends CSREnum with CSRMacroApply
37
38  object CSRField15Bits extends CSREnum with CSRMacroApply
39
40  object CSRField16Bits extends CSREnum with CSRMacroApply
41
42  object CSRField17Bits extends CSREnum with CSRMacroApply
43
44  object CSRField18Bits extends CSREnum with CSRMacroApply
45
46  object CSRField19Bits extends CSREnum with CSRMacroApply
47
48  object CSRField20Bits extends CSREnum with CSRMacroApply
49
50  object CSRField21Bits extends CSREnum with CSRMacroApply
51
52  object CSRField22Bits extends CSREnum with CSRMacroApply
53
54  object CSRField23Bits extends CSREnum with CSRMacroApply
55
56  object CSRField24Bits extends CSREnum with CSRMacroApply
57
58  object CSRField25Bits extends CSREnum with CSRMacroApply
59
60  object CSRField26Bits extends CSREnum with CSRMacroApply
61
62  object CSRField27Bits extends CSREnum with CSRMacroApply
63
64  object CSRField28Bits extends CSREnum with CSRMacroApply
65
66  object CSRField29Bits extends CSREnum with CSRMacroApply
67
68  object CSRField30Bits extends CSREnum with CSRMacroApply
69
70  object CSRField31Bits extends CSREnum with CSRMacroApply
71
72  object CSRField32Bits extends CSREnum with CSRMacroApply
73
74  object CSRField33Bits extends CSREnum with CSRMacroApply
75
76  object CSRField34Bits extends CSREnum with CSRMacroApply
77
78  object CSRField35Bits extends CSREnum with CSRMacroApply
79
80  object CSRField36Bits extends CSREnum with CSRMacroApply
81
82  object CSRField37Bits extends CSREnum with CSRMacroApply
83
84  object CSRField38Bits extends CSREnum with CSRMacroApply
85
86  object CSRField39Bits extends CSREnum with CSRMacroApply
87
88  object CSRField40Bits extends CSREnum with CSRMacroApply
89
90  object CSRField41Bits extends CSREnum with CSRMacroApply
91
92  object CSRField42Bits extends CSREnum with CSRMacroApply
93
94  object CSRField43Bits extends CSREnum with CSRMacroApply
95
96  object CSRField44Bits extends CSREnum with CSRMacroApply
97
98  object CSRField45Bits extends CSREnum with CSRMacroApply
99
100  object CSRField46Bits extends CSREnum with CSRMacroApply
101
102  object CSRField47Bits extends CSREnum with CSRMacroApply
103
104  object CSRField48Bits extends CSREnum with CSRMacroApply
105
106  object CSRField49Bits extends CSREnum with CSRMacroApply
107
108  object CSRField50Bits extends CSREnum with CSRMacroApply
109
110  object CSRField51Bits extends CSREnum with CSRMacroApply
111
112  object CSRField52Bits extends CSREnum with CSRMacroApply
113
114  object CSRField53Bits extends CSREnum with CSRMacroApply
115
116  object CSRField54Bits extends CSREnum with CSRMacroApply
117
118  object CSRField55Bits extends CSREnum with CSRMacroApply
119
120  object CSRField56Bits extends CSREnum with CSRMacroApply
121
122  object CSRField57Bits extends CSREnum with CSRMacroApply
123
124  object CSRField58Bits extends CSREnum with CSRMacroApply
125
126  object CSRField59Bits extends CSREnum with CSRMacroApply
127
128  object CSRField60Bits extends CSREnum with CSRMacroApply
129
130  object CSRField61Bits extends CSREnum with CSRMacroApply
131
132  object CSRField62Bits extends CSREnum with CSRMacroApply
133
134  object CSRField63Bits extends CSREnum with CSRMacroApply
135
136  object CSRField64Bits extends CSREnum with CSRMacroApply
137
138  object ContextStatus extends CSREnum with ContextStatusDef with RWApply
139  object ContextStatusRO extends CSREnum with ContextStatusDef with ROApply
140  trait ContextStatusDef { this: CSREnum =>
141    val Off = Value(0.U)
142    val Initial = Value(1.U)
143    val Clean = Value(2.U)
144    val Dirty = Value(3.U)
145  }
146
147  object XLENField extends CSREnum with ROApply {
148    val XLEN32 = Value(1.U)
149    val XLEN64 = Value(2.U)
150    val XLEN128 = Value(3.U)
151  }
152
153  object XtvecMode extends CSREnum with WARLApply {
154    val Direct = Value(0.U)
155    val Vectored = Value(1.U)
156
157    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Direct, Vectored)
158  }
159
160  object SatpMode extends CSREnum with WARLApply {
161    val Bare = Value(0.U)
162    val Sv39 = Value(8.U)
163    val Sv48 = Value(9.U)
164    val Sv57 = Value(10.U)
165    val Sv64 = Value(11.U) // Reserved for page-based 64-bit virtual addressing
166
167    // XiangShan only support Sv39 & Sv48 Page
168    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39, Sv48)
169  }
170
171  object HgatpMode extends CSREnum with WARLApply {
172    val Bare   = Value(0.U)
173    val Sv39x4 = Value(8.U)
174    val Sv48x4 = Value(9.U)
175    val Sv57x4 = Value(10.U)
176
177    // XiangShan only support Sv39 & Sv48 Page
178    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39x4, Sv48x4)
179  }
180
181  object EnvCBIE extends CSREnum with WARLApply {
182    val Off   = Value("b00".U)
183    val Flush = Value("b01".U)
184    val Inval = Value("b11".U)
185
186    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Off, Flush, Inval)
187  }
188
189  object EnvPMM extends CSREnum with WARLApply {
190    val Disable  = Value("b00".U)
191    val PMLEN7   = Value("b10".U)
192    val PMLEN16  = Value("b11".U)
193
194    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Disable, PMLEN7, PMLEN16)
195  }
196
197  object ReflectHelper {
198    val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader)
199
200    def getCSRFieldMethodMirror(typeString: String, msb: Int, lsb: Int): ru.MethodMirror = {
201      val moduleSymbol = mirror.typeOf[CSRDefines.type].termSymbol
202        .info.decl(ru.TermName(s"CSRField${msb - lsb + 1}Bits")).asModule
203
204      val methodSymbol = moduleSymbol
205        .info.member(ru.TermName(typeString)).asMethod
206
207      val instanceMirror: ru.InstanceMirror = mirror.reflect(mirror.reflectModule(moduleSymbol).instance)
208      val methodMirror: ru.MethodMirror = instanceMirror.reflectMethod(methodSymbol)
209
210      methodMirror
211    }
212  }
213
214  object CSRWARLField {
215    private def helper(msb: Int, lsb: Int, wfn: CSRWfnType, rfn: CSRRfnType): CSREnumType = {
216      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("WARL", msb, lsb)
217      methodMirror.apply(msb, lsb, wfn, rfn).asInstanceOf[CSREnumType]
218    }
219
220    def apply(msb: Int, lsb: Int, fn: CSRRfnType): CSREnumType = this.helper(msb, lsb, null, fn)
221
222    def apply(bit: Int, fn: CSRRfnType): CSREnumType = this.helper(bit, bit, null, fn)
223
224    def apply(msb: Int, lsb: Int, fn: CSRWfnType): CSREnumType = this.helper(msb, lsb, fn, null)
225
226    def apply(bit: Int, fn: CSRWfnType): CSREnumType = this.helper(bit, bit, fn, null)
227  }
228
229  object CSRROField {
230    private def helper(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = {
231      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("RO", msb, lsb)
232      methodMirror.apply(msb, lsb, rfn).asInstanceOf[CSREnumType]
233    }
234
235    def apply(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = this.helper(msb, lsb, rfn)
236
237    def apply(bit: Int, rfn: CSRRfnType): CSREnumType = this.helper(bit, bit, rfn)
238
239    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb, null)
240
241    def apply(bit: Int): CSREnumType = this.helper(bit, bit, null)
242  }
243
244  object CSRRWField {
245    private def helper(msb: Int, lsb: Int) : CSREnumType = {
246      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("RW", msb, lsb)
247      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
248    }
249
250    def apply(msb: Int, lsb: Int) : CSREnumType = this.helper(msb, lsb)
251
252    def apply(bit: Int): CSREnumType = this.helper(bit, bit)
253  }
254
255  object CSRWLRLField {
256    private def helper(msb: Int, lsb: Int) : CSREnumType = {
257      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("WLRL", msb, lsb)
258      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
259    }
260
261    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb)
262  }
263
264  object PrivMode extends CSREnum with RWApply {
265    val U = Value(0.U)
266    val S = Value(1.U)
267    val M = Value(3.U)
268
269    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(U, S, M)
270  }
271
272  object VirtMode extends CSREnum with RWApply {
273    val Off = Value(0.U)
274    val On  = Value(1.U)
275  }
276
277  object DebugverMode extends CSREnum with DebugverModeDef with ROApply
278
279  trait DebugverModeDef {
280    this: CSREnum =>
281    val None = Value(0.U)
282    val Spec = Value(4.U)
283    val Custom = Value(15.U)
284  }
285}
286