1package xiangshan.backend.fu.NewCSR 2 3import chisel3._ 4import chisel3.util._ 5import freechips.rocketchip.rocket.CSRs 6import CSRConfig._ 7import xiangshan.backend.fu.NewCSR.CSRBundles.PrivState 8import xiangshan.backend.fu.NewCSR.CSRConfig._ 9import xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, _} 10 11import scala.collection.immutable.SeqMap 12 13trait CSRAIA { self: NewCSR with HypervisorLevel => 14 val miselect = Module(new CSRModule("Miselect", new MISelectBundle) with HasISelectBundle { 15 private val value = reg.ALL.asUInt 16 inIMSICRange := value >= 0x70.U && value < 0x100.U 17 isIllegal := 18 value < 0x30.U || 19 value >= 0x30.U && value < 0x40.U && value(0) === 1.U || 20 value >= 0x40.U && value < 0x70.U || 21 value >= 0x100.U 22 }) 23 .setAddr(CSRs.miselect) 24 25 val mireg = Module(new CSRModule("Mireg") with HasIregSink { 26 rdata := iregRead.mireg 27 }) 28 .setAddr(CSRs.mireg) 29 30 val mtopei = Module(new CSRModule("Mtopei", new TopEIBundle) with HasAIABundle { 31 regOut := aiaToCSR.mtopei 32 }) 33 .setAddr(CSRs.mtopei) 34 35 val mtopi = Module(new CSRModule("Mtopi", new TopIBundle) with HasInterruptFilterSink { 36 regOut.IID := topIR.mtopi.IID 37 regOut.IPRIO := topIR.mtopi.IPRIO 38 }) 39 .setAddr(CSRs.mtopi) 40 41 val siselect = Module(new CSRModule("Siselect", new SISelectBundle) with HasISelectBundle { 42 private val value = reg.ALL.asUInt 43 inIMSICRange := value >= 0x70.U && value < 0x100.U 44 isIllegal := 45 value < 0x30.U || 46 value >= 0x30.U && value < 0x40.U && value(0) === 1.U || 47 value >= 0x40.U && value < 0x70.U || 48 value >= 0x100.U 49 }) 50 .setAddr(CSRs.siselect) 51 52 val sireg = Module(new CSRModule("Sireg") with HasIregSink { 53 rdata := iregRead.sireg 54 }) 55 .setAddr(CSRs.sireg) 56 57 val stopei = Module(new CSRModule("Stopei", new TopEIBundle) with HasAIABundle { 58 regOut := aiaToCSR.stopei 59 }) 60 .setAddr(CSRs.stopei) 61 62 val stopi = Module(new CSRModule("Stopi", new TopIBundle) with HasInterruptFilterSink { 63 regOut.IID := topIR.stopi.IID 64 regOut.IPRIO := topIR.stopi.IPRIO 65 }) 66 .setAddr(CSRs.stopi) 67 68 val vsiselect = Module(new CSRModule("VSiselect", new VSISelectBundle) with HasISelectBundle { 69 private val value = reg.ALL.asUInt 70 inIMSICRange := value >= 0x70.U && value < 0x100.U 71 isIllegal := 72 value < 0x70.U || 73 value >= 0x100.U 74 }) 75 .setAddr(CSRs.vsiselect) 76 77 val vsireg = Module(new CSRModule("VSireg") with HasIregSink { 78 rdata := iregRead.sireg 79 }) 80 .setAddr(CSRs.vsireg) 81 82 val vstopei = Module(new CSRModule("VStopei", new TopEIBundle) with HasAIABundle { 83 regOut := aiaToCSR.vstopei 84 }) 85 .setAddr(CSRs.vstopei) 86 87 val vstopi = Module(new CSRModule("VStopi", new TopIBundle) with HasInterruptFilterSink { 88 regOut.IID := topIR.vstopi.IID 89 regOut.IPRIO := topIR.vstopi.IPRIO 90 }) 91 .setAddr(CSRs.vstopi) 92 93 val miprio0 = Module(new CSRModule(s"Iprio0", new Iprio0Bundle)) 94 .setAddr(0x30) 95 96 val miprio2 = Module(new CSRModule(s"Iprio2", new Iprio2Bundle)) 97 .setAddr(0x32) 98 99 val miprio4 = Module(new CSRModule(s"Iprio4", new IprioBundle)) 100 .setAddr(0x34) 101 102 val miprio6 = Module(new CSRModule(s"Iprio6", new IprioBundle)) 103 .setAddr(0x36) 104 105 val miprio8 = Module(new CSRModule(s"Iprio8", new Iprio8Bundle)) 106 .setAddr(0x38) 107 108 val miprio10 = Module(new CSRModule(s"Iprio10", new Iprio10Bundle)) 109 .setAddr(0x3A) 110 111 val miprio12 = Module(new CSRModule(s"Iprio12", new IprioBundle)) 112 .setAddr(0x3C) 113 114 val miprio14 = Module(new CSRModule(s"Iprio14", new IprioBundle)) 115 .setAddr(0x3E) 116 117 val siprio0 = Module(new CSRModule(s"Iprio0", new Iprio0Bundle)) 118 .setAddr(0x30) 119 120 val siprio2 = Module(new CSRModule(s"Iprio2", new Iprio2Bundle)) 121 .setAddr(0x32) 122 123 val siprio4 = Module(new CSRModule(s"Iprio4", new IprioBundle)) 124 .setAddr(0x34) 125 126 val siprio6 = Module(new CSRModule(s"Iprio6", new IprioBundle)) 127 .setAddr(0x36) 128 129 val siprio8 = Module(new CSRModule(s"Iprio8", new Iprio8Bundle)) 130 .setAddr(0x38) 131 132 val siprio10 = Module(new CSRModule(s"Iprio10", new Iprio10Bundle)) 133 .setAddr(0x3A) 134 135 val siprio12 = Module(new CSRModule(s"Iprio12", new IprioBundle)) 136 .setAddr(0x3C) 137 138 val siprio14 = Module(new CSRModule(s"Iprio14", new IprioBundle)) 139 .setAddr(0x3E) 140 141 val miregiprios: Seq[CSRModule[_]] = Seq(miprio0, miprio2, miprio4, miprio6, miprio8, miprio10, miprio12, miprio14) 142 143 val siregiprios: Seq[CSRModule[_]] = Seq(siprio0, siprio2, siprio4, siprio6, siprio8, siprio10, siprio12, siprio14) 144 145 val aiaCSRMods = Seq( 146 miselect, 147 mireg, 148 mtopei, 149 mtopi, 150 siselect, 151 sireg, 152 stopei, 153 stopi, 154 vsiselect, 155 vsireg, 156 vstopi, 157 vstopei, 158 ) 159 160 val aiaSkipCSRs = Seq( 161 mtopei, 162 mtopi, 163 stopei, 164 stopi, 165 vstopi, 166 vstopei, 167 ) 168 169 val aiaCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], UInt)] = SeqMap.from( 170 aiaCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata))).iterator 171 ) 172 173 val aiaCSROutMap: SeqMap[Int, UInt] = SeqMap.from( 174 aiaCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator 175 ) 176 177 private val miregRData: UInt = Mux1H( 178 miregiprios.map(prio => (miselect.rdata.asUInt === prio.addr.U) -> prio.rdata) 179 ) 180 181 private val siregRData: UInt = Mux1H( 182 siregiprios.map(prio => (siselect.rdata.asUInt === prio.addr.U) -> prio.rdata) 183 ) 184 185 aiaCSRMods.foreach { mod => 186 mod match { 187 case m: HasIregSink => 188 m.iregRead.mireg := miregRData 189 m.iregRead.sireg := siregRData 190 m.iregRead.vsireg := 0.U // Todo: IMSIC 191 case _ => 192 } 193 } 194} 195 196class ISelectField(final val maxValue: Int, reserved: Seq[Range]) extends CSREnum with WARLApply { 197 override def isLegal(enumeration: CSREnumType): Bool = enumeration.asUInt <= maxValue.U 198} 199 200object VSISelectField extends ISelectField( 201 0x1FF, 202 reserved = Seq( 203 Range.inclusive(0x000, 0x02F), 204 Range.inclusive(0x040, 0x06F), 205 Range.inclusive(0x100, 0x1FF), 206 ), 207) 208 209object MISelectField extends ISelectField( 210 maxValue = 0xFF, 211 reserved = Seq( 212 Range.inclusive(0x00, 0x2F), 213 Range.inclusive(0x40, 0x6F), 214 ), 215) 216 217object SISelectField extends ISelectField( 218 maxValue = 0xFF, 219 reserved = Seq( 220 Range.inclusive(0x00, 0x2F), 221 Range.inclusive(0x40, 0x6F), 222 ), 223) 224 225class VSISelectBundle extends CSRBundle { 226 val ALL = VSISelectField(log2Up(0x1FF), 0, null).withReset(0.U) 227} 228 229class MISelectBundle extends CSRBundle { 230 val ALL = MISelectField(log2Up(0xFF), 0, null).withReset(0.U) 231} 232 233class SISelectBundle extends CSRBundle { 234 val ALL = SISelectField(log2Up(0xFF), 0, null).withReset(0.U) 235} 236 237class TopIBundle extends CSRBundle { 238 val IID = RO(27, 16) 239 val IPRIO = RO(7, 0) 240} 241 242class TopEIBundle extends CSRBundle { 243 val IID = RW(26, 16) 244 val IPRIO = RW(10, 0) 245} 246 247class IprioBundle extends CSRBundle { 248 val ALL = RO(63, 0).withReset(0.U) 249} 250 251class Iprio0Bundle extends CSRBundle { 252 val PrioSSI = RW(15, 8).withReset(0.U) 253 val PrioVSSI = RW(23, 16).withReset(0.U) 254 val PrioMSI = RW(31, 24).withReset(0.U) 255 val PrioSTI = RW(47, 40).withReset(0.U) 256 val PrioVSTI = RW(55, 48).withReset(0.U) 257 val PrioMTI = RW(63, 56).withReset(0.U) 258} 259 260class Iprio2Bundle extends CSRBundle { 261 val PrioSEI = RW(15, 8).withReset(0.U) 262 val PrioVSEI = RW(23, 16).withReset(0.U) 263 val PrioMEI = RW(31, 24).withReset(0.U) 264 val PrioSGEI = RW(39, 32).withReset(0.U) 265 val PrioCOI = RW(47, 40).withReset(0.U) 266} 267 268class Iprio8Bundle extends CSRBundle { 269 val PrioLPRASEI = RW(31, 24).withReset(0.U) 270} 271 272class Iprio10Bundle extends CSRBundle { 273 val PrioHPRASEI = RW(31, 24).withReset(0.U) 274} 275 276class CSRToAIABundle extends Bundle { 277 private final val AddrWidth = 12 278 279 val addr = ValidIO(new Bundle { 280 val addr = UInt(AddrWidth.W) 281 val v = VirtMode() 282 val prvm = PrivMode() 283 }) 284 285 val vgein = UInt(VGEINWidth.W) 286 287 val wdata = ValidIO(new Bundle { 288 val op = UInt(2.W) 289 val data = UInt(XLEN.W) 290 }) 291 292 val mClaim = Bool() 293 val sClaim = Bool() 294 val vsClaim = Bool() 295} 296 297class AIAToCSRBundle extends Bundle { 298 private val NumVSIRFiles = 63 299 val rdata = ValidIO(new Bundle { 300 val data = UInt(XLEN.W) 301 val illegal = Bool() 302 }) 303 val meip = Bool() 304 val seip = Bool() 305 val vseip = UInt(NumVSIRFiles.W) 306 val mtopei = new TopEIBundle 307 val stopei = new TopEIBundle 308 val vstopei = new TopEIBundle 309} 310 311trait HasAIABundle { self: CSRModule[_] => 312 val aiaToCSR = IO(Input(new AIAToCSRBundle)) 313} 314 315trait HasInterruptFilterSink { self: CSRModule[_] => 316 val topIR = IO(new Bundle { 317 val mtopi = Input(new TopIBundle) 318 val stopi = Input(new TopIBundle) 319 val vstopi = Input(new TopIBundle) 320 }) 321} 322 323trait HasISelectBundle { self: CSRModule[_] => 324 val inIMSICRange = IO(Output(Bool())) 325 val isIllegal = IO(Output(Bool())) 326} 327 328trait HasIregSink { self: CSRModule[_] => 329 val iregRead = IO(Input(new Bundle { 330 val mireg = UInt(XLEN.W) // Todo: check if use ireg bundle, and shrink the width 331 val sireg = UInt(XLEN.W) 332 val vsireg = UInt(XLEN.W) 333 })) 334} 335