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