19681ffb2SXuan Hupackage xiangshan.backend.fu.NewCSR 29681ffb2SXuan Hu 39681ffb2SXuan Huimport chisel3._ 49681ffb2SXuan Huimport chisel3.util._ 52c054816SsinceforYyimport freechips.rocketchip.rocket.CSRs 68cfc24b2STang Haojinimport org.chipsalliance.cde.config.Parameters 72c054816SsinceforYyimport CSRConfig._ 88cfc24b2STang Haojinimport system.HasSoCParameter 9a53de5b8SsinceforYyimport xiangshan.backend.fu.NewCSR.CSRBundles._ 10d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.CSRConfig._ 11d0b87b97SXuan Huimport xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW, _} 128cfc24b2STang Haojinimport xiangshan.XSBundle 139681ffb2SXuan Hu 149681ffb2SXuan Huimport scala.collection.immutable.SeqMap 159681ffb2SXuan Hu 16e877d8bfSXuan Hutrait CSRAIA { self: NewCSR with HypervisorLevel => 17cdf05a9cSsinceforYy val miselect = Module(new CSRModule("Miselect", new MISelectBundle) with HasISelectBundle { 18f7c21cb5SXuan Hu private val value = reg.ALL.asUInt 19bf652b44SNewPaulWalker inIMSICRange := value >= 0x70.U && value < 0x100.U 20f7c21cb5SXuan Hu isIllegal := 21f7c21cb5SXuan Hu value < 0x30.U || 22bf652b44SNewPaulWalker value >= 0x30.U && value < 0x40.U && value(0) === 1.U || 23f7c21cb5SXuan Hu value >= 0x40.U && value < 0x70.U || 24bf652b44SNewPaulWalker value >= 0x100.U 25f7c21cb5SXuan Hu }) 262c054816SsinceforYy .setAddr(CSRs.miselect) 279681ffb2SXuan Hu 28523f2fa2SXuan Hu val mireg = Module(new CSRModule("Mireg") with HasIregSink { 29523f2fa2SXuan Hu rdata := iregRead.mireg 30523f2fa2SXuan Hu }) 312c054816SsinceforYy .setAddr(CSRs.mireg) 329681ffb2SXuan Hu 3389bb2535SXuan Hu val mtopei = Module(new CSRModule("Mtopei", new TopEIBundle) with HasAIABundle { 3489bb2535SXuan Hu regOut := aiaToCSR.mtopei 357d3fb559SXuan Hu }) 362c054816SsinceforYy .setAddr(CSRs.mtopei) 379681ffb2SXuan Hu 38523f2fa2SXuan Hu val mtopi = Module(new CSRModule("Mtopi", new TopIBundle) with HasInterruptFilterSink { 39a37e0a1fSsinceforYy regOut.IID := topIR.mtopi.IID 40a37e0a1fSsinceforYy regOut.IPRIO := topIR.mtopi.IPRIO 414016eee8SsinceforYy }) 422c054816SsinceforYy .setAddr(CSRs.mtopi) 439681ffb2SXuan Hu 44f7c21cb5SXuan Hu val siselect = Module(new CSRModule("Siselect", new SISelectBundle) with HasISelectBundle { 45f7c21cb5SXuan Hu private val value = reg.ALL.asUInt 46bf652b44SNewPaulWalker inIMSICRange := value >= 0x70.U && value < 0x100.U 47f7c21cb5SXuan Hu isIllegal := 48f7c21cb5SXuan Hu value < 0x30.U || 49bf652b44SNewPaulWalker value >= 0x30.U && value < 0x40.U && value(0) === 1.U || 50f7c21cb5SXuan Hu value >= 0x40.U && value < 0x70.U || 51bf652b44SNewPaulWalker value >= 0x100.U 52f7c21cb5SXuan Hu }) 532c054816SsinceforYy .setAddr(CSRs.siselect) 549681ffb2SXuan Hu 55523f2fa2SXuan Hu val sireg = Module(new CSRModule("Sireg") with HasIregSink { 56523f2fa2SXuan Hu rdata := iregRead.sireg 57523f2fa2SXuan Hu }) 582c054816SsinceforYy .setAddr(CSRs.sireg) 599681ffb2SXuan Hu 6089bb2535SXuan Hu val stopei = Module(new CSRModule("Stopei", new TopEIBundle) with HasAIABundle { 6189bb2535SXuan Hu regOut := aiaToCSR.stopei 627d3fb559SXuan Hu }) 632c054816SsinceforYy .setAddr(CSRs.stopei) 649681ffb2SXuan Hu 65523f2fa2SXuan Hu val stopi = Module(new CSRModule("Stopi", new TopIBundle) with HasInterruptFilterSink { 66a37e0a1fSsinceforYy regOut.IID := topIR.stopi.IID 67a37e0a1fSsinceforYy regOut.IPRIO := topIR.stopi.IPRIO 684016eee8SsinceforYy }) 692c054816SsinceforYy .setAddr(CSRs.stopi) 709681ffb2SXuan Hu 71f7c21cb5SXuan Hu val vsiselect = Module(new CSRModule("VSiselect", new VSISelectBundle) with HasISelectBundle { 72f7c21cb5SXuan Hu private val value = reg.ALL.asUInt 73bf652b44SNewPaulWalker inIMSICRange := value >= 0x70.U && value < 0x100.U 74f7c21cb5SXuan Hu isIllegal := 75f7c21cb5SXuan Hu value < 0x70.U || 76bf652b44SNewPaulWalker value >= 0x100.U 77f7c21cb5SXuan Hu }) 782c054816SsinceforYy .setAddr(CSRs.vsiselect) 799681ffb2SXuan Hu 80523f2fa2SXuan Hu val vsireg = Module(new CSRModule("VSireg") with HasIregSink { 81523f2fa2SXuan Hu rdata := iregRead.sireg 82523f2fa2SXuan Hu }) 832c054816SsinceforYy .setAddr(CSRs.vsireg) 849681ffb2SXuan Hu 8589bb2535SXuan Hu val vstopei = Module(new CSRModule("VStopei", new TopEIBundle) with HasAIABundle { 8689bb2535SXuan Hu regOut := aiaToCSR.vstopei 877d3fb559SXuan Hu }) 882c054816SsinceforYy .setAddr(CSRs.vstopei) 899681ffb2SXuan Hu 90523f2fa2SXuan Hu val vstopi = Module(new CSRModule("VStopi", new TopIBundle) with HasInterruptFilterSink { 91a37e0a1fSsinceforYy regOut.IID := topIR.vstopi.IID 92a37e0a1fSsinceforYy regOut.IPRIO := topIR.vstopi.IPRIO 934016eee8SsinceforYy }) 942c054816SsinceforYy .setAddr(CSRs.vstopi) 959681ffb2SXuan Hu 9696292cf5SsinceforYy val miprio0 = Module(new CSRModule(s"Iprio0", new Iprio0Bundle) with HasIeBundle { 9796292cf5SsinceforYy val mask = Wire(Vec(8, UInt(8.W))) 9896292cf5SsinceforYy for (i <- 0 until 8) { 9996292cf5SsinceforYy mask(i) := Fill(8, mie.asUInt(i)) 10096292cf5SsinceforYy } 10196292cf5SsinceforYy regOut := reg & mask.asUInt 10296292cf5SsinceforYy }) 103acddddb6SsinceforYy .setAddr(0x30) 104ef44afa0SsinceforYy 10596292cf5SsinceforYy val miprio2 = Module(new CSRModule(s"Iprio2", new MIprio2Bundle) with HasIeBundle { 10696292cf5SsinceforYy val mask = Wire(Vec(8, UInt(8.W))) 10796292cf5SsinceforYy for (i <- 0 until 8) { 10896292cf5SsinceforYy mask(i) := Fill(8, mie.asUInt(i+8)) 10996292cf5SsinceforYy } 11096292cf5SsinceforYy regOut := reg & mask.asUInt 11196292cf5SsinceforYy }) 11296292cf5SsinceforYy .setAddr(0x32) 11396292cf5SsinceforYy 11496292cf5SsinceforYy val miprios: Seq[CSRModule[_]] = (4 to (0xF, 2)).map(num => 11596292cf5SsinceforYy Module(new CSRModule(s"Iprio$num", new IprioBundle) with HasIeBundle { 11696292cf5SsinceforYy val mask = Wire(Vec(8, UInt(8.W))) 11796292cf5SsinceforYy for (i <- 0 until 8) { 11896292cf5SsinceforYy mask(i) := Fill(8, mie.asUInt(num*4+i)) 11996292cf5SsinceforYy } 12096292cf5SsinceforYy regOut := reg & mask.asUInt 12196292cf5SsinceforYy }) 122a53de5b8SsinceforYy .setAddr(0x30 + num) 123a53de5b8SsinceforYy ) 124acddddb6SsinceforYy 12596292cf5SsinceforYy val siprio0 = Module(new CSRModule(s"Iprio0", new Iprio0Bundle) with HasIeBundle { 12696292cf5SsinceforYy val mask = Wire(Vec(8, UInt(8.W))) 12796292cf5SsinceforYy for (i <- 0 until 8) { 12896292cf5SsinceforYy mask(i) := Fill(8, sie.asUInt(i)) 12996292cf5SsinceforYy } 13096292cf5SsinceforYy regOut := reg & mask.asUInt 13196292cf5SsinceforYy }) 132acddddb6SsinceforYy .setAddr(0x30) 133acddddb6SsinceforYy 13496292cf5SsinceforYy val siprio2 = Module(new CSRModule(s"Iprio2", new SIprio2Bundle) with HasIeBundle { 13596292cf5SsinceforYy val mask = Wire(Vec(8, UInt(8.W))) 13696292cf5SsinceforYy for (i <- 0 until 8) { 13796292cf5SsinceforYy mask(i) := Fill(8, sie.asUInt(i+8)) 13896292cf5SsinceforYy } 13996292cf5SsinceforYy regOut := reg & mask.asUInt 14096292cf5SsinceforYy }) 14196292cf5SsinceforYy .setAddr(0x32) 14296292cf5SsinceforYy 14396292cf5SsinceforYy val siprios: Seq[CSRModule[_]] = (4 to (0xF, 2)).map(num => 14496292cf5SsinceforYy Module(new CSRModule(s"Iprio$num", new IprioBundle) with HasIeBundle{ 14596292cf5SsinceforYy val mask = Wire(Vec(8, UInt(8.W))) 14696292cf5SsinceforYy for (i <- 0 until 8) { 14796292cf5SsinceforYy mask(i) := Fill(8, sie.asUInt(num*4+i)) 14896292cf5SsinceforYy } 14996292cf5SsinceforYy regOut := reg & mask.asUInt 15096292cf5SsinceforYy }) 151a53de5b8SsinceforYy .setAddr(0x30 + num) 152a53de5b8SsinceforYy ) 153acddddb6SsinceforYy 15496292cf5SsinceforYy val miregiprios: Seq[CSRModule[_]] = Seq(miprio0, miprio2) ++: miprios 155acddddb6SsinceforYy 15696292cf5SsinceforYy val siregiprios: Seq[CSRModule[_]] = Seq(siprio0, siprio2) ++: siprios 15796292cf5SsinceforYy 15896292cf5SsinceforYy val iregiprios = miregiprios ++ siregiprios 159523f2fa2SXuan Hu 1609681ffb2SXuan Hu val aiaCSRMods = Seq( 1619681ffb2SXuan Hu miselect, 1629681ffb2SXuan Hu mireg, 1639681ffb2SXuan Hu mtopei, 1649681ffb2SXuan Hu mtopi, 1659681ffb2SXuan Hu siselect, 1669681ffb2SXuan Hu sireg, 1679681ffb2SXuan Hu stopei, 1689681ffb2SXuan Hu stopi, 1699681ffb2SXuan Hu vsiselect, 1709681ffb2SXuan Hu vsireg, 1719681ffb2SXuan Hu vstopi, 1729681ffb2SXuan Hu vstopei, 173523f2fa2SXuan Hu ) 1749681ffb2SXuan Hu 17594895e77SXuan Hu val aiaCSRMap: SeqMap[Int, (CSRAddrWriteBundle[_], UInt)] = SeqMap.from( 1768aa89407SXuan Hu aiaCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata))).iterator 1779681ffb2SXuan Hu ) 1789681ffb2SXuan Hu 179e877d8bfSXuan Hu val aiaCSROutMap: SeqMap[Int, UInt] = SeqMap.from( 180e877d8bfSXuan Hu aiaCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator 181e877d8bfSXuan Hu ) 182523f2fa2SXuan Hu 1838aa89407SXuan Hu private val miregRData: UInt = Mux1H( 1848aa89407SXuan Hu miregiprios.map(prio => (miselect.rdata.asUInt === prio.addr.U) -> prio.rdata) 1858aa89407SXuan Hu ) 186523f2fa2SXuan Hu 1878aa89407SXuan Hu private val siregRData: UInt = Mux1H( 1888aa89407SXuan Hu siregiprios.map(prio => (siselect.rdata.asUInt === prio.addr.U) -> prio.rdata) 1898aa89407SXuan Hu ) 190523f2fa2SXuan Hu 191523f2fa2SXuan Hu aiaCSRMods.foreach { mod => 192523f2fa2SXuan Hu mod match { 193523f2fa2SXuan Hu case m: HasIregSink => 1948aa89407SXuan Hu m.iregRead.mireg := miregRData 1958aa89407SXuan Hu m.iregRead.sireg := siregRData 196423dd365SXuan Hu m.iregRead.vsireg := 0.U // Todo: IMSIC 197523f2fa2SXuan Hu case _ => 198523f2fa2SXuan Hu } 199523f2fa2SXuan Hu } 2009681ffb2SXuan Hu} 2019681ffb2SXuan Hu 202436f48ccSXuan Huclass ISelectField(final val maxValue: Int, reserved: Seq[Range]) extends CSREnum with WARLApply { 203e3da8badSTang Haojin override def isLegal(enumeration: CSREnumType): Bool = enumeration.asUInt <= maxValue.U 2049681ffb2SXuan Hu} 2059681ffb2SXuan Hu 2069681ffb2SXuan Huobject VSISelectField extends ISelectField( 207*f9ed852fSNewPaulWalker 0xFFF, 2089681ffb2SXuan Hu reserved = Seq( 2099681ffb2SXuan Hu Range.inclusive(0x000, 0x02F), 2109681ffb2SXuan Hu Range.inclusive(0x040, 0x06F), 211*f9ed852fSNewPaulWalker Range.inclusive(0x100, 0xFFF), 2129681ffb2SXuan Hu ), 2139681ffb2SXuan Hu) 2149681ffb2SXuan Hu 2159681ffb2SXuan Huobject MISelectField extends ISelectField( 2169681ffb2SXuan Hu maxValue = 0xFF, 2179681ffb2SXuan Hu reserved = Seq( 2189681ffb2SXuan Hu Range.inclusive(0x00, 0x2F), 2199681ffb2SXuan Hu Range.inclusive(0x40, 0x6F), 2209681ffb2SXuan Hu ), 2219681ffb2SXuan Hu) 2229681ffb2SXuan Hu 2239681ffb2SXuan Huobject SISelectField extends ISelectField( 224*f9ed852fSNewPaulWalker maxValue = 0xFFF, 2259681ffb2SXuan Hu reserved = Seq( 226*f9ed852fSNewPaulWalker Range.inclusive(0x000, 0x02F), 227*f9ed852fSNewPaulWalker Range.inclusive(0x040, 0x06F), 228*f9ed852fSNewPaulWalker Range.inclusive(0x100, 0xFFF), 2299681ffb2SXuan Hu ), 2309681ffb2SXuan Hu) 2319681ffb2SXuan Hu 2329681ffb2SXuan Huclass VSISelectBundle extends CSRBundle { 233*f9ed852fSNewPaulWalker val ALL = VSISelectField(log2Up(0xFFF), 0, null).withReset(0.U) 2349681ffb2SXuan Hu} 2359681ffb2SXuan Hu 2369681ffb2SXuan Huclass MISelectBundle extends CSRBundle { 23711f2d1cbSXuan Hu val ALL = MISelectField(log2Up(0xFF), 0, null).withReset(0.U) 2389681ffb2SXuan Hu} 2399681ffb2SXuan Hu 2409681ffb2SXuan Huclass SISelectBundle extends CSRBundle { 241*f9ed852fSNewPaulWalker val ALL = SISelectField(log2Up(0xFFF), 0, null).withReset(0.U) 2429681ffb2SXuan Hu} 2439681ffb2SXuan Hu 2449681ffb2SXuan Huclass TopIBundle extends CSRBundle { 2459681ffb2SXuan Hu val IID = RO(27, 16) 2469681ffb2SXuan Hu val IPRIO = RO(7, 0) 2479681ffb2SXuan Hu} 2489681ffb2SXuan Hu 2499681ffb2SXuan Huclass TopEIBundle extends CSRBundle { 2509681ffb2SXuan Hu val IID = RW(26, 16) 2519681ffb2SXuan Hu val IPRIO = RW(10, 0) 2529681ffb2SXuan Hu} 2539681ffb2SXuan Hu 254a53de5b8SsinceforYyclass IprioBundle extends FieldInitBundle 255acddddb6SsinceforYy 256acddddb6SsinceforYyclass Iprio0Bundle extends CSRBundle { 257acddddb6SsinceforYy val PrioSSI = RW(15, 8).withReset(0.U) 258acddddb6SsinceforYy val PrioVSSI = RW(23, 16).withReset(0.U) 259acddddb6SsinceforYy val PrioMSI = RW(31, 24).withReset(0.U) 260acddddb6SsinceforYy val PrioSTI = RW(47, 40).withReset(0.U) 261acddddb6SsinceforYy val PrioVSTI = RW(55, 48).withReset(0.U) 262acddddb6SsinceforYy val PrioMTI = RW(63, 56).withReset(0.U) 263acddddb6SsinceforYy} 264acddddb6SsinceforYy 26596292cf5SsinceforYyclass MIprio2Bundle extends CSRBundle { 26696292cf5SsinceforYy val PrioSEI = RW(15, 8).withReset(0.U) 26796292cf5SsinceforYy val PrioVSEI = RW(23, 16).withReset(0.U) 26896292cf5SsinceforYy val PrioMEI = RO(31, 24).withReset(0.U) 26996292cf5SsinceforYy val PrioSGEI = RW(39, 32).withReset(0.U) 27096292cf5SsinceforYy val PrioLCOFI = RW(47, 40).withReset(0.U) 27196292cf5SsinceforYy val Prio14 = RW(55, 48).withReset(0.U) 27296292cf5SsinceforYy val Prio15 = RW(63, 56).withReset(0.U) 27396292cf5SsinceforYy} 27496292cf5SsinceforYy 27596292cf5SsinceforYyclass SIprio2Bundle extends CSRBundle { 27696292cf5SsinceforYy val PrioSEI = RO(15, 8).withReset(0.U) 27796292cf5SsinceforYy val PrioVSEI = RW(23, 16).withReset(0.U) 27896292cf5SsinceforYy val PrioMEI = RW(31, 24).withReset(0.U) 27996292cf5SsinceforYy val PrioSGEI = RW(39, 32).withReset(0.U) 28096292cf5SsinceforYy val PrioLCOFI = RW(47, 40).withReset(0.U) 28196292cf5SsinceforYy val Prio14 = RW(55, 48).withReset(0.U) 28296292cf5SsinceforYy val Prio15 = RW(63, 56).withReset(0.U) 28396292cf5SsinceforYy} 28496292cf5SsinceforYy 2858cfc24b2STang Haojinclass CSRToAIABundle(implicit p: Parameters) extends XSBundle with HasSoCParameter { 2869681ffb2SXuan Hu val addr = ValidIO(new Bundle { 2878cfc24b2STang Haojin val addr = UInt(soc.IMSICParams.iselectWidth.W) 2889681ffb2SXuan Hu val v = VirtMode() 2899681ffb2SXuan Hu val prvm = PrivMode() 2909681ffb2SXuan Hu }) 2919681ffb2SXuan Hu 2928cfc24b2STang Haojin val vgein = UInt(soc.IMSICParams.vgeinWidth.W) 2939681ffb2SXuan Hu 2949681ffb2SXuan Hu val wdata = ValidIO(new Bundle { 295f7c21cb5SXuan Hu val op = UInt(2.W) 2969681ffb2SXuan Hu val data = UInt(XLEN.W) 2979681ffb2SXuan Hu }) 2989681ffb2SXuan Hu 2999681ffb2SXuan Hu val mClaim = Bool() 3009681ffb2SXuan Hu val sClaim = Bool() 3019681ffb2SXuan Hu val vsClaim = Bool() 3029681ffb2SXuan Hu} 3039681ffb2SXuan Hu 3048cfc24b2STang Haojinclass AIAToCSRBundle(implicit p: Parameters) extends XSBundle with HasSoCParameter { 3059681ffb2SXuan Hu val rdata = ValidIO(new Bundle { 3069681ffb2SXuan Hu val data = UInt(XLEN.W) 3079681ffb2SXuan Hu val illegal = Bool() 3089681ffb2SXuan Hu }) 30989bb2535SXuan Hu val meip = Bool() 31089bb2535SXuan Hu val seip = Bool() 3118cfc24b2STang Haojin val vseip = UInt(soc.IMSICParams.geilen.W) 31289bb2535SXuan Hu val mtopei = new TopEIBundle 31389bb2535SXuan Hu val stopei = new TopEIBundle 31489bb2535SXuan Hu val vstopei = new TopEIBundle 3159681ffb2SXuan Hu} 316007f6122SXuan Hu 317007f6122SXuan Hutrait HasAIABundle { self: CSRModule[_] => 318007f6122SXuan Hu val aiaToCSR = IO(Input(new AIAToCSRBundle)) 319007f6122SXuan Hu} 3204016eee8SsinceforYy 321523f2fa2SXuan Hutrait HasInterruptFilterSink { self: CSRModule[_] => 322523f2fa2SXuan Hu val topIR = IO(new Bundle { 3234016eee8SsinceforYy val mtopi = Input(new TopIBundle) 3244016eee8SsinceforYy val stopi = Input(new TopIBundle) 3254016eee8SsinceforYy val vstopi = Input(new TopIBundle) 3264016eee8SsinceforYy }) 3274016eee8SsinceforYy} 3284016eee8SsinceforYy 3294016eee8SsinceforYytrait HasISelectBundle { self: CSRModule[_] => 330f7c21cb5SXuan Hu val inIMSICRange = IO(Output(Bool())) 331f7c21cb5SXuan Hu val isIllegal = IO(Output(Bool())) 3324016eee8SsinceforYy} 333523f2fa2SXuan Hu 334523f2fa2SXuan Hutrait HasIregSink { self: CSRModule[_] => 335523f2fa2SXuan Hu val iregRead = IO(Input(new Bundle { 336523f2fa2SXuan Hu val mireg = UInt(XLEN.W) // Todo: check if use ireg bundle, and shrink the width 337523f2fa2SXuan Hu val sireg = UInt(XLEN.W) 338523f2fa2SXuan Hu val vsireg = UInt(XLEN.W) 339523f2fa2SXuan Hu })) 340523f2fa2SXuan Hu} 34196292cf5SsinceforYy 34296292cf5SsinceforYytrait HasIeBundle { self: CSRModule[_] => 34396292cf5SsinceforYy val mie = IO(Input(new MieBundle)) 34496292cf5SsinceforYy val sie = IO(Input(new SieBundle)) 34596292cf5SsinceforYy} 346