xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/CSRAIA.scala (revision 25dc4a827ee27e3ccbaf02e8e5134872cba28fcd)
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}