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("Miselevt", new MISelectBundle)) 15 .setAddr(CSRs.miselect) 16 17 val mireg = Module(new CSRModule("Mireg") with HasIregSink { 18 rdata := iregRead.mireg 19 }) 20 .setAddr(CSRs.mireg) 21 22 val mtopei = Module(new CSRModule("Mtopei", new CSRBundle { 23 val id = RW(26, 16) 24 val prio = RW(10, 0) 25 })) 26 .setAddr(CSRs.mtopei) 27 28 val mtopi = Module(new CSRModule("Mtopi", new TopIBundle) with HasInterruptFilterSink { 29 regOut.IID := topIR.mtopi.IID 30 regOut.IPRIO := topIR.mtopi.IPRIO 31 }) 32 .setAddr(CSRs.mtopi) 33 34 val siselect = Module(new CSRModule("Siselect", new SISelectBundle)) 35 .setAddr(CSRs.siselect) 36 37 val sireg = Module(new CSRModule("Sireg") with HasIregSink { 38 rdata := iregRead.sireg 39 }) 40 .setAddr(CSRs.sireg) 41 42 val stopei = Module(new CSRModule("Stopei", new CSRBundle { 43 val id = RW(26, 16) 44 val prio = RW(10, 0) 45 })) 46 .setAddr(CSRs.stopei) 47 48 val stopi = Module(new CSRModule("Stopi", new TopIBundle) with HasInterruptFilterSink { 49 regOut.IID := topIR.stopi.IID 50 regOut.IPRIO := topIR.stopi.IPRIO 51 }) 52 .setAddr(CSRs.stopi) 53 54 val vsiselect = Module(new CSRModule("VSiselect", new VSISelectBundle)) 55 .setAddr(CSRs.vsiselect) 56 57 val vsireg = Module(new CSRModule("VSireg") with HasIregSink { 58 rdata := iregRead.sireg 59 }) 60 .setAddr(CSRs.vsireg) 61 62 val vstopei = Module(new CSRModule("VStopei", new CSRBundle { 63 val id = RW(26, 16) 64 val prio = RW(10, 0) 65 })) 66 .setAddr(CSRs.vstopei) 67 68 val vstopi = Module(new CSRModule("VStopi", new TopIBundle) with HasInterruptFilterSink { 69 regOut.IID := topIR.vstopi.IID 70 regOut.IPRIO := topIR.vstopi.IPRIO 71 }) 72 .setAddr(CSRs.vstopi) 73 74 val miregiprios: Seq[CSRModule[_]] = Range(0, 0xF, 2).map(num => 75 Module(new CSRModule(s"Iprio$num")) 76 .setAddr(0x30 + num) 77 ) 78 79 val siregiprios: Seq[CSRModule[_]] = Range(0, 0xF, 2).map(num => 80 Module(new CSRModule(s"Iprio$num")) 81 .setAddr(0x30 + num) 82 ) 83 84 val aiaCSRMods = Seq( 85 miselect, 86 mireg, 87 mtopei, 88 mtopi, 89 siselect, 90 sireg, 91 stopei, 92 stopi, 93 vsiselect, 94 vsireg, 95 vstopi, 96 vstopei, 97 ) 98 99 val aiaCSRMap = SeqMap.from( 100 aiaCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata))).iterator 101 ) 102 103 val aiaCSROutMap: SeqMap[Int, UInt] = SeqMap.from( 104 aiaCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator 105 ) 106 107 private val miregRData: UInt = Mux1H( 108 miregiprios.map(prio => (miselect.rdata.asUInt === prio.addr.U) -> prio.rdata) 109 ) 110 111 private val siregRData: UInt = Mux1H( 112 siregiprios.map(prio => (siselect.rdata.asUInt === prio.addr.U) -> prio.rdata) 113 ) 114 115 aiaCSRMods.foreach { mod => 116 mod match { 117 case m: HasIregSink => 118 m.iregRead.mireg := miregRData 119 m.iregRead.sireg := siregRData 120 m.iregRead.vsireg := 0.U // Todo: IMSIC 121 case _ => 122 } 123 } 124} 125 126class ISelectField(final val maxValue: Int, reserved: Seq[Range]) extends CSREnum with WARLApply { 127 override def isLegal(enum: CSREnumType): Bool = { 128 !reserved.map(range => enum.asUInt >= range.start.U && enum.asUInt <= range.end.U).reduce(_ || _) 129 } 130} 131 132object VSISelectField extends ISelectField( 133 0x1FF, 134 reserved = Seq( 135 Range.inclusive(0x000, 0x02F), 136 Range.inclusive(0x040, 0x06F), 137 Range.inclusive(0x100, 0x1FF), 138 ), 139) 140 141object MISelectField extends ISelectField( 142 maxValue = 0xFF, 143 reserved = Seq( 144 Range.inclusive(0x00, 0x2F), 145 Range.inclusive(0x40, 0x6F), 146 ), 147) 148 149object SISelectField extends ISelectField( 150 maxValue = 0xFF, 151 reserved = Seq( 152 Range.inclusive(0x00, 0x2F), 153 Range.inclusive(0x40, 0x6F), 154 ), 155) 156 157class VSISelectBundle extends CSRBundle { 158 val ALL = VSISelectField(log2Up(0x1FF), 0, null) 159} 160 161class MISelectBundle extends CSRBundle { 162 val ALL = MISelectField(log2Up(0xFF), 0, null) 163} 164 165class SISelectBundle extends CSRBundle { 166 val ALL = SISelectField(log2Up(0xFF), 0, null) 167} 168 169class TopIBundle extends CSRBundle { 170 val IID = RO(27, 16) 171 val IPRIO = RO(7, 0) 172} 173 174class TopEIBundle extends CSRBundle { 175 val IID = RW(26, 16) 176 val IPRIO = RW(10, 0) 177} 178 179class IprioBundle extends CSRBundle { 180 val ALL = RW(63, 0).withReset(0.U) 181} 182 183class CSRToAIABundle extends Bundle { 184 private final val AddrWidth = 12 185 186 val addr = ValidIO(new Bundle { 187 val addr = UInt(AddrWidth.W) 188 val v = VirtMode() 189 val prvm = PrivMode() 190 }) 191 192 val vgein = UInt(VGEINWidth.W) 193 194 val wdata = ValidIO(new Bundle { 195 val data = UInt(XLEN.W) 196 }) 197 198 val mClaim = Bool() 199 val sClaim = Bool() 200 val vsClaim = Bool() 201} 202 203class AIAToCSRBundle extends Bundle { 204 val rdata = ValidIO(new Bundle { 205 val data = UInt(XLEN.W) 206 val illegal = Bool() 207 }) 208 val mtopei = ValidIO(new TopEIBundle) 209 val stopei = ValidIO(new TopEIBundle) 210 val vstopei = ValidIO(new TopEIBundle) 211} 212 213trait HasAIABundle { self: CSRModule[_] => 214 val aiaToCSR = IO(Input(new AIAToCSRBundle)) 215} 216 217trait HasInterruptFilterSink { self: CSRModule[_] => 218 val topIR = IO(new Bundle { 219 val mtopi = Input(new TopIBundle) 220 val stopi = Input(new TopIBundle) 221 val vstopi = Input(new TopIBundle) 222 }) 223} 224 225trait HasISelectBundle { self: CSRModule[_] => 226 val privState = IO(Input(new PrivState)) 227 val miselect = IO(Input(new MISelectBundle)) 228 val siselect = IO(Input(new SISelectBundle)) 229 val mireg = IO(Input(UInt(XLEN.W))) 230 val sireg = IO(Input(UInt(XLEN.W))) 231} 232 233trait HasIregSink { self: CSRModule[_] => 234 val iregRead = IO(Input(new Bundle { 235 val mireg = UInt(XLEN.W) // Todo: check if use ireg bundle, and shrink the width 236 val sireg = UInt(XLEN.W) 237 val vsireg = UInt(XLEN.W) 238 })) 239}