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