xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRDefines.scala (revision b03c55a5df5dc8793cb44b42dd60141566e57e78)
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 Page
168    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39)
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 Page
178    override def isLegal(enumeration: CSREnumType): Bool = enumeration.isOneOf(Bare, Sv39x4)
179  }
180
181  object ReflectHelper {
182    val mirror: ru.Mirror = ru.runtimeMirror(getClass.getClassLoader)
183
184    def getCSRFieldMethodMirror(typeString: String, msb: Int, lsb: Int): ru.MethodMirror = {
185      val moduleSymbol = mirror.typeOf[CSRDefines.type].termSymbol
186        .info.decl(ru.TermName(s"CSRField${msb - lsb + 1}Bits")).asModule
187
188      val methodSymbol = moduleSymbol
189        .info.member(ru.TermName(typeString)).asMethod
190
191      val instanceMirror: ru.InstanceMirror = mirror.reflect(mirror.reflectModule(moduleSymbol).instance)
192      val methodMirror: ru.MethodMirror = instanceMirror.reflectMethod(methodSymbol)
193
194      methodMirror
195    }
196  }
197
198  object CSRWARLField {
199    private def helper(msb: Int, lsb: Int, wfn: CSRWfnType, rfn: CSRRfnType): CSREnumType = {
200      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("WARL", msb, lsb)
201      methodMirror.apply(msb, lsb, wfn, rfn).asInstanceOf[CSREnumType]
202    }
203
204    def apply(msb: Int, lsb: Int, fn: CSRRfnType): CSREnumType = this.helper(msb, lsb, null, fn)
205
206    def apply(bit: Int, fn: CSRRfnType): CSREnumType = this.helper(bit, bit, null, fn)
207
208    def apply(msb: Int, lsb: Int, fn: CSRWfnType): CSREnumType = this.helper(msb, lsb, fn, null)
209
210    def apply(bit: Int, fn: CSRWfnType): CSREnumType = this.helper(bit, bit, fn, null)
211  }
212
213  object CSRROField {
214    private def helper(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = {
215      val methodMirror = ReflectHelper.getCSRFieldMethodMirror("RO", msb, lsb)
216      methodMirror.apply(msb, lsb, rfn).asInstanceOf[CSREnumType]
217    }
218
219    def apply(msb: Int, lsb: Int, rfn: CSRRfnType): CSREnumType = this.helper(msb, lsb, rfn)
220
221    def apply(bit: Int, rfn: CSRRfnType): CSREnumType = this.helper(bit, bit, rfn)
222
223    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb, null)
224
225    def apply(bit: Int): CSREnumType = this.helper(bit, bit, null)
226  }
227
228  object CSRRWField {
229    private def helper(msb: Int, lsb: Int) : CSREnumType = {
230      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("RW", msb, lsb)
231      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
232    }
233
234    def apply(msb: Int, lsb: Int) : CSREnumType = this.helper(msb, lsb)
235
236    def apply(bit: Int): CSREnumType = this.helper(bit, bit)
237  }
238
239  object CSRWLRLField {
240    private def helper(msb: Int, lsb: Int) : CSREnumType = {
241      val methodMirror: ru.MethodMirror = ReflectHelper.getCSRFieldMethodMirror("WLRL", msb, lsb)
242      methodMirror.apply(msb, lsb).asInstanceOf[CSREnumType]
243    }
244
245    def apply(msb: Int, lsb: Int): CSREnumType = this.helper(msb, lsb)
246  }
247
248  object PrivMode extends CSREnum with RWApply {
249    val U = Value(0.U)
250    val S = Value(1.U)
251    val M = Value(3.U)
252  }
253
254  object VirtMode extends CSREnum with RWApply {
255    val Off = Value(0.U)
256    val On  = Value(1.U)
257  }
258
259  object DebugverMode extends CSREnum with DebugverModeDef with ROApply
260
261  trait DebugverModeDef {
262    this: CSREnum =>
263    val None = Value(0.U)
264    val Spec = Value(4.U)
265    val Custom = Value(15.U)
266  }
267}
268