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._ 7 8import scala.collection.immutable.SeqMap 9 10trait CSRAIA { self: NewCSR with HypervisorLevel => 11 val miselect = Module(new CSRModule("Miselevt", new MISelectBundle)) 12 .setAddr(0x350) 13 14 val mireg = Module(new CSRModule("Mireg")) 15 .setAddr(0x351) 16 17 val mtopei = Module(new CSRModule("Mtopei", new CSRBundle { 18 val id = RW(26, 16) 19 val prio = RW(10, 0) 20 })) 21 .setAddr(0x35C) 22 23 val mtopi = Module(new CSRModule("Mtopi", new TopIBundle)) 24 .setAddr(0xFB0) 25 26 val siselect = Module(new CSRModule("Siselect", new SISelectBundle)) 27 .setAddr(0x150) 28 29 val sireg = Module(new CSRModule("Sireg")) 30 .setAddr(0x151) 31 32 val stopei = Module(new CSRModule("Stopei", new CSRBundle { 33 val id = RW(26, 16) 34 val prio = RW(10, 0) 35 })) 36 .setAddr(0x15C) 37 38 val stopi = Module(new CSRModule("Stopi", new TopIBundle)) 39 .setAddr(0xDB0) 40 41 val vsiselect = Module(new CSRModule("VSiselect", new VSISelectBundle)) 42 .setAddr(0x250) 43 44 val vsireg = Module(new CSRModule("VSireg")) 45 .setAddr(0x251) 46 47 val vstopei = Module(new CSRModule("VStopei", new CSRBundle { 48 val id = RW(26, 16) 49 val prio = RW(10, 0) 50 })) 51 .setAddr(0x25C) 52 53 val vstopi = Module(new CSRModule("VStopi", new TopIBundle)) 54 .setAddr(0xEB0) 55 56 val aiaCSRMods = Seq( 57 miselect, 58 mireg, 59 mtopei, 60 mtopi, 61 siselect, 62 sireg, 63 stopei, 64 stopi, 65 vsiselect, 66 vsireg, 67 vstopi, 68 vstopei, 69 ) 70 71 val aiaCSRMap = SeqMap.from( 72 aiaCSRMods.map(csr => (csr.addr -> (csr.w -> csr.rdata.asInstanceOf[CSRBundle].asUInt))).iterator 73 ) 74 75 val aiaCSROutMap: SeqMap[Int, UInt] = SeqMap.from( 76 aiaCSRMods.map(csr => (csr.addr -> csr.regOut.asInstanceOf[CSRBundle].asUInt)).iterator 77 ) 78} 79 80class ISelectField(final val maxValue: Int, reserved: Seq[Range]) extends CSREnum with WARLApply { 81 override def isLegal(enum: CSREnumType): Bool = { 82 !reserved.map(range => enum.asUInt >= range.start.U && enum.asUInt <= range.end.U).reduce(_ || _) 83 } 84} 85 86object VSISelectField extends ISelectField( 87 0x1FF, 88 reserved = Seq( 89 Range.inclusive(0x000, 0x02F), 90 Range.inclusive(0x040, 0x06F), 91 Range.inclusive(0x100, 0x1FF), 92 ), 93) 94 95object MISelectField extends ISelectField( 96 maxValue = 0xFF, 97 reserved = Seq( 98 Range.inclusive(0x00, 0x2F), 99 Range.inclusive(0x40, 0x6F), 100 ), 101) 102 103object SISelectField extends ISelectField( 104 maxValue = 0xFF, 105 reserved = Seq( 106 Range.inclusive(0x00, 0x2F), 107 Range.inclusive(0x40, 0x6F), 108 ), 109) 110 111class VSISelectBundle extends CSRBundle { 112 val ALL = VSISelectField(log2Up(0x1FF), 0, null) 113} 114 115class MISelectBundle extends CSRBundle { 116 val ALL = MISelectField(log2Up(0xFF), 0, null) 117} 118 119class SISelectBundle extends CSRBundle { 120 val ALL = SISelectField(log2Up(0xFF), 0, null) 121} 122 123class TopIBundle extends CSRBundle { 124 val IID = RO(27, 16) 125 val IPRIO = RO(7, 0) 126} 127 128class TopEIBundle extends CSRBundle { 129 val IID = RW(26, 16) 130 val IPRIO = RW(10, 0) 131} 132 133class CSRToAIABundle extends Bundle { 134 private final val AddrWidth = 12 135 136 val addr = ValidIO(new Bundle { 137 val addr = UInt(AddrWidth.W) 138 val v = VirtMode() 139 val prvm = PrivMode() 140 }) 141 142 val vgein = UInt(VGEINWidth.W) 143 144 val wdata = ValidIO(new Bundle { 145 val data = UInt(XLEN.W) 146 }) 147 148 val mClaim = Bool() 149 val sClaim = Bool() 150 val vsClaim = Bool() 151} 152 153class AIAToCSRBundle extends Bundle { 154 val rdata = ValidIO(new Bundle { 155 val data = UInt(XLEN.W) 156 val illegal = Bool() 157 }) 158 val mtopei = ValidIO(new TopEIBundle) 159 val stopei = ValidIO(new TopEIBundle) 160 val vstopei = ValidIO(new TopEIBundle) 161} 162 163trait HasAIABundle { self: CSRModule[_] => 164 val aiaToCSR = IO(Input(new AIAToCSRBundle)) 165}