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 => 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} 76 77class ISelectField(final val maxValue: Int, reserved: Seq[Range]) extends CSREnum with CSRWARLApply { 78 override def isLegal(enum: CSREnumType): Bool = { 79 !reserved.map(range => enum.asUInt >= range.start.U && enum.asUInt <= range.end.U).reduce(_ || _) 80 } 81} 82 83object VSISelectField extends ISelectField( 84 0x1FF, 85 reserved = Seq( 86 Range.inclusive(0x000, 0x02F), 87 Range.inclusive(0x040, 0x06F), 88 Range.inclusive(0x100, 0x1FF), 89 ), 90) 91 92object MISelectField extends ISelectField( 93 maxValue = 0xFF, 94 reserved = Seq( 95 Range.inclusive(0x00, 0x2F), 96 Range.inclusive(0x40, 0x6F), 97 ), 98) 99 100object SISelectField extends ISelectField( 101 maxValue = 0xFF, 102 reserved = Seq( 103 Range.inclusive(0x00, 0x2F), 104 Range.inclusive(0x40, 0x6F), 105 ), 106) 107 108class VSISelectBundle extends CSRBundle { 109 val ALL = VSISelectField(log2Up(0x1FF), 0, null) 110} 111 112class MISelectBundle extends CSRBundle { 113 val ALL = MISelectField(log2Up(0xFF), 0, null) 114} 115 116class SISelectBundle extends CSRBundle { 117 val ALL = SISelectField(log2Up(0xFF), 0, null) 118} 119 120class TopIBundle extends CSRBundle { 121 val IID = RO(27, 16) 122 val IPRIO = RO(7, 0) 123} 124 125class TopEIBundle extends CSRBundle { 126 val IID = RW(26, 16) 127 val IPRIO = RW(10, 0) 128} 129 130class CSRToAIABundle extends Bundle { 131 private final val AddrWidth = 12 132 133 val addr = ValidIO(new Bundle { 134 val addr = UInt(AddrWidth.W) 135 val v = VirtMode() 136 val prvm = PrivMode() 137 }) 138 139 val vgein = UInt(VGEINWidth.W) 140 141 val wdata = ValidIO(new Bundle { 142 val data = UInt(XLEN.W) 143 }) 144 145 val mClaim = Bool() 146 val sClaim = Bool() 147 val vsClaim = Bool() 148} 149 150class AIAToCSRBundle extends Bundle { 151 val rdata = ValidIO(new Bundle { 152 val data = UInt(XLEN.W) 153 val illegal = Bool() 154 }) 155 val mtopei = new TopEIBundle 156 val stopei = new TopEIBundle 157 val vstopei = new TopEIBundle 158} 159