xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/InterruptBundle.scala (revision b03c55a5df5dc8793cb44b42dd60141566e57e78)
1package xiangshan.backend.fu.NewCSR
2
3import chisel3._
4import chisel3.util._
5import xiangshan.backend.fu.NewCSR.CSRDefines.{CSRROField => RO, CSRRWField => RW}
6import xiangshan.backend.fu.NewCSR.ChiselRecordForField.AddRecordSpecifyFields
7
8class InterruptBundle extends CSRBundle {
9  // Software Interrupt
10  val SSI      = RW(1)
11  val VSSI     = RW(2)
12  val MSI      = RW(3)
13  // Time Interrupt
14  val STI      = RW(5)
15  val VSTI     = RW(6)
16  val MTI      = RW(7)
17  // External Interrupt
18  val SEI      = RW(9)
19  val VSEI     = RW(10)
20  val MEI      = RW(11)
21  val SGEI     = RW(12)
22  // SoC
23  val LCOFI    = RW(13) // Counter overflow interrupt
24  val LC14I    = RO(14)
25  val LC15I    = RO(15)
26  val LC16I    = RO(16)
27  val LC17I    = RO(17)
28  val LC18I    = RO(18)
29  val LC19I    = RO(19)
30  val LC20I    = RO(20)
31  val LC21I    = RO(21)
32  val LC22I    = RO(22)
33  val LC23I    = RO(23)
34  val LC24I    = RO(24)
35  val LC25I    = RO(25)
36  val LC26I    = RO(26)
37  val LC27I    = RO(27)
38  val LC28I    = RO(28)
39  val LC29I    = RO(29)
40  val LC30I    = RO(30)
41  val LC31I    = RO(31)
42  val LC32I    = RO(32)
43  val LC33I    = RO(33)
44  val LC34I    = RO(34)
45  val LPRASEI  = RO(35)
46  val LC36I    = RO(36)
47  val LC37I    = RO(37)
48  val LC38I    = RO(38)
49  val LC39I    = RO(39)
50  val LC40I    = RO(40)
51  val LC41I    = RO(41)
52  val LC42I    = RO(42)
53  val HPRASEI  = RO(43)
54  val LC44I    = RO(44)
55  val LC45I    = RO(45)
56  val LC46I    = RO(46)
57  val LC47I    = RO(47)
58  val LC48I    = RO(48)
59  val LC49I    = RO(49)
60  val LC50I    = RO(50)
61  val LC51I    = RO(51)
62  val LC52I    = RO(52)
63  val LC53I    = RO(53)
64  val LC54I    = RO(54)
65  val LC55I    = RO(55)
66  val LC56I    = RO(56)
67  val LC57I    = RO(57)
68  val LC58I    = RO(58)
69  val LC59I    = RO(59)
70  val LC60I    = RO(60)
71  val LC61I    = RO(61)
72  val LC62I    = RO(62)
73  val LC63I    = RO(63)
74
75  def getVS = Seq(VSSI, VSTI, VSEI)
76
77  def getHS = Seq(SSI, STI, SEI)
78
79  def getM = Seq(MSI, MTI, MEI)
80
81  def getNonLocal = Seq(
82    SSI, VSSI, MSI,
83    STI, VSTI, MTI,
84    SEI, VSEI, MEI,
85    SGEI
86  )
87
88  def getLocal = Seq(
89    LCOFI,LC14I,LC15I,
90    LC16I,LC17I,LC18I,LC19I,LC20I,LC21I,LC22I,LC23I,
91    LC24I,LC25I,LC26I,LC27I,LC28I,LC29I,LC30I,LC31I,
92    LC32I,LC33I,LC34I,LPRASEI,LC36I,LC37I,LC38I,LC39I,
93    LC40I,LC41I,LC42I,HPRASEI,LC44I,LC45I,LC46I,LC47I,
94    LC48I,LC49I,LC50I,LC51I,LC52I,LC53I,LC54I,LC55I,
95    LC56I,LC57I,LC58I,LC59I,LC60I,LC61I,LC62I,LC63I,
96  )
97
98  def getALL = getNonLocal ++ getLocal
99}
100
101class InterruptPendingBundle extends CSRBundle {
102  // Software Interrupt
103  val SSIP     = RO(1)
104  val VSSIP    = RO(2)
105  val MSIP     = RO(3)
106  // Time Interrupt
107  val STIP     = RO(5)
108  val VSTIP    = RO(6)
109  val MTIP     = RO(7)
110  // External Interrupt
111  val SEIP     = RO(9)
112  val VSEIP    = RO(10)
113  val MEIP     = RO(11)
114  val SGEIP    = RO(12)
115  // Local Interrupt
116  val LCOFIP   = RO(13) // Counter overflow interrupt
117  val LC14IP   = RO(14)
118  val LC15IP   = RO(15)
119  val LC16IP   = RO(16)
120  val LC17IP   = RO(17)
121  val LC18IP   = RO(18)
122  val LC19IP   = RO(19)
123  val LC20IP   = RO(20)
124  val LC21IP   = RO(21)
125  val LC22IP   = RO(22)
126  val LC23IP   = RO(23)
127  val LC24IP   = RO(24)
128  val LC25IP   = RO(25)
129  val LC26IP   = RO(26)
130  val LC27IP   = RO(27)
131  val LC28IP   = RO(28)
132  val LC29IP   = RO(29)
133  val LC30IP   = RO(30)
134  val LC31IP   = RO(31)
135  val LC32IP   = RO(32)
136  val LC33IP   = RO(33)
137  val LC34IP   = RO(34)
138  val LPRASEIP = RO(35) // Low-priority RAS event interrupt
139  val LC36IP   = RO(36)
140  val LC37IP   = RO(37)
141  val LC38IP   = RO(38)
142  val LC39IP   = RO(39)
143  val LC40IP   = RO(40)
144  val LC41IP   = RO(41)
145  val LC42IP   = RO(42)
146  val HPRASEIP = RO(43) // High-priority RAS event interrupt
147  val LC44IP   = RO(44)
148  val LC45IP   = RO(45)
149  val LC46IP   = RO(46)
150  val LC47IP   = RO(47)
151  val LC48IP   = RO(48)
152  val LC49IP   = RO(49)
153  val LC50IP   = RO(50)
154  val LC51IP   = RO(51)
155  val LC52IP   = RO(52)
156  val LC53IP   = RO(53)
157  val LC54IP   = RO(54)
158  val LC55IP   = RO(55)
159  val LC56IP   = RO(56)
160  val LC57IP   = RO(57)
161  val LC58IP   = RO(58)
162  val LC59IP   = RO(59)
163  val LC60IP   = RO(60)
164  val LC61IP   = RO(61)
165  val LC62IP   = RO(62)
166  val LC63IP   = RO(63)
167
168  def getVS = Seq(VSSIP, VSTIP, VSEIP)
169
170  def getHS = Seq(SSIP, STIP, SEIP)
171
172  def getM = Seq(MSIP, MTIP, MEIP)
173
174  def getNonLocal = Seq(
175    SSIP, VSSIP, MSIP,
176    STIP, VSTIP, MTIP,
177    SEIP, VSEIP, MEIP,
178    SGEIP
179  )
180
181  def getLocal = Seq(
182    LCOFIP,LC14IP,LC15IP,
183    LC16IP,LC17IP,LC18IP,LC19IP,LC20IP,LC21IP,LC22IP,LC23IP,
184    LC24IP,LC25IP,LC26IP,LC27IP,LC28IP,LC29IP,LC30IP,LC31IP,
185    LC32IP,LC33IP,LC34IP,LPRASEIP,LC36IP,LC37IP,LC38IP,LC39IP,
186    LC40IP,LC41IP,LC42IP,HPRASEIP,LC44IP,LC45IP,LC46IP,LC47IP,
187    LC48IP,LC49IP,LC50IP,LC51IP,LC52IP,LC53IP,LC54IP,LC55IP,
188    LC56IP,LC57IP,LC58IP,LC59IP,LC60IP,LC61IP,LC62IP,LC63IP,
189  )
190
191  def getALL = getNonLocal ++ getLocal
192}
193
194class InterruptEnableBundle extends CSRBundle {
195  // Software Interrupt
196  val SSIE     = RO(1)
197  val VSSIE    = RO(2)
198  val MSIE     = RO(3)
199  // Time Interrupt
200  val STIE     = RO(5)
201  val VSTIE    = RO(6)
202  val MTIE     = RO(7)
203  // External Interrupt
204  val SEIE     = RO(9)
205  val VSEIE    = RO(10)
206  val MEIE     = RO(11)
207  val SGEIE    = RO(12)
208  // SoC
209  val LCOFIE   = RO(13) // Counter overflow interrupt
210  val LC14IE   = RO(14)
211  val LC15IE   = RO(15)
212  val LC16IE   = RO(16)
213  val LC17IE   = RO(17)
214  val LC18IE   = RO(18)
215  val LC19IE   = RO(19)
216  val LC20IE   = RO(20)
217  val LC21IE   = RO(21)
218  val LC22IE   = RO(22)
219  val LC23IE   = RO(23)
220  val LC24IE   = RO(24)
221  val LC25IE   = RO(25)
222  val LC26IE   = RO(26)
223  val LC27IE   = RO(27)
224  val LC28IE   = RO(28)
225  val LC29IE   = RO(29)
226  val LC30IE   = RO(30)
227  val LC31IE   = RO(31)
228  val LC32IE   = RO(32)
229  val LC33IE   = RO(33)
230  val LC34IE   = RO(34)
231  val LPRASEIE = RO(35) // Low-priority RAS event interrupt
232  val LC36IE   = RO(36)
233  val LC37IE   = RO(37)
234  val LC38IE   = RO(38)
235  val LC39IE   = RO(39)
236  val LC40IE   = RO(40)
237  val LC41IE   = RO(41)
238  val LC42IE   = RO(42)
239  val HPRASEIE = RO(43) // High-priority RAS event interrupt
240  val LC44IE   = RO(44)
241  val LC45IE   = RO(45)
242  val LC46IE   = RO(46)
243  val LC47IE   = RO(47)
244  val LC48IE   = RO(48)
245  val LC49IE   = RO(49)
246  val LC50IE   = RO(50)
247  val LC51IE   = RO(51)
248  val LC52IE   = RO(52)
249  val LC53IE   = RO(53)
250  val LC54IE   = RO(54)
251  val LC55IE   = RO(55)
252  val LC56IE   = RO(56)
253  val LC57IE   = RO(57)
254  val LC58IE   = RO(58)
255  val LC59IE   = RO(59)
256  val LC60IE   = RO(60)
257  val LC61IE   = RO(61)
258  val LC62IE   = RO(62)
259  val LC63IE   = RO(63)
260
261  def getVS = Seq(VSSIE, VSTIE, VSEIE)
262
263  def getHS = Seq(SSIE, STIE, SEIE)
264
265  def getM = Seq(MSIE, MTIE, MEIE)
266
267  def getNonVS = this.getHS ++ this.getM ++ this.getLocal :+ this.SGEIE
268
269  def getNonLocal = Seq(
270    SSIE, VSSIE, MSIE,
271    STIE, VSTIE, MTIE,
272    SEIE, VSEIE, MEIE,
273    SGEIE
274  )
275
276  def getLocal = Seq(
277    LCOFIE,LC14IE,LC15IE,
278    LC16IE,LC17IE,LC18IE,LC19IE,LC20IE,LC21IE,LC22IE,LC23IE,
279    LC24IE,LC25IE,LC26IE,LC27IE,LC28IE,LC29IE,LC30IE,LC31IE,
280    LC32IE,LC33IE,LC34IE,LPRASEIE,LC36IE,LC37IE,LC38IE,LC39IE,
281    LC40IE,LC41IE,LC42IE,HPRASEIE,LC44IE,LC45IE,LC46IE,LC47IE,
282    LC48IE,LC49IE,LC50IE,LC51IE,LC52IE,LC53IE,LC54IE,LC55IE,
283    LC56IE,LC57IE,LC58IE,LC59IE,LC60IE,LC61IE,LC62IE,LC63IE
284  )
285
286  def getALL = getNonLocal ++ getLocal
287
288  def getRW = getALL.filter(_.isRW)
289}
290
291object InterruptNO {
292  // Software Interrupt
293  final val SSI  = 1
294  final val VSSI = 2
295  final val MSI  = 3
296  // Time Interrupt
297  final val STI  = 5
298  final val VSTI = 6
299  final val MTI  = 7
300  // External Interrupt
301  final val SEI  = 9
302  final val VSEI = 10
303  final val MEI  = 11
304  final val SGEI = 12
305  // SoC
306  final val COI = 13
307  final val LPRASEI = 35
308  final val HPRASEI = 43
309
310  val interruptDefaultPrio = Seq(
311    HPRASEI,
312
313    MEI, MSI, MTI,
314    SEI, SSI, STI,
315    SGEI,
316    VSEI, VSSI, VSTI,
317    COI,
318
319    LPRASEI
320  )
321
322  def getPrioIdx(f: this.type => Int): Int = {
323    val idx = this.interruptDefaultPrio.indexOf(f(this))
324    assert(idx != -1)
325    idx
326  }
327
328  def getIRQHigherThan(irq: Int): Seq[Int] = {
329    val idx = this.interruptDefaultPrio.indexOf(irq, 0)
330    require(idx != -1, s"The irq($irq) does not exists in IntPriority Seq")
331    this.interruptDefaultPrio.slice(0, idx)
332  }
333
334  def getVS = Seq(VSSI, VSTI, VSEI)
335
336  def getHS = Seq(SSI, STI, SEI)
337
338  def getM = Seq(MSI, MTI, MEI)
339
340  def getNonLocal = Seq(
341    SSI, VSSI, MSI,
342    STI, VSTI, MTI,
343    SEI, VSEI, MEI,
344    SGEI
345  )
346}
347
348trait HasIpIeBundle { self: CSRModule[_] =>
349  val mideleg = IO(Input(new MidelegBundle))
350  val mip     = IO(Input(new MipBundle))
351  val mie     = IO(Input(new MieBundle))
352  val mvip    = IO(Input(new MvipBundle))
353  val mvien   = IO(Input(new MvienBundle))
354  val hideleg = IO(Input(new HidelegBundle))
355  val hip     = IO(Input(new HipBundle))
356  val hie     = IO(Input(new HieBundle))
357  val hvien   = IO(Input(new HvienBundle))
358  val hvip    = IO(Input(new HvipBundle))
359  val sip     = IO(Input(new SipBundle))
360  val sie     = IO(Input(new SieBundle))
361  val vsip    = IO(Input(new VSipBundle))
362  val vsie    = IO(Input(new VSieBundle))
363  val hgeip   = IO(Input(new HgeipBundle))
364  val hgeie   = IO(Input(new HgeieBundle))
365  val hstatusVGEIN = IO(Input(HstatusVgeinField()))
366}
367
368trait ToAliasIpLocalPart extends Bundle {
369  val LCOFIP   = ValidIO(RO(13)) // Counter overflow interrupt
370  val LC14IP   = ValidIO(RO(14))
371  val LC15IP   = ValidIO(RO(15))
372  val LC16IP   = ValidIO(RO(16))
373  val LC17IP   = ValidIO(RO(17))
374  val LC18IP   = ValidIO(RO(18))
375  val LC19IP   = ValidIO(RO(19))
376  val LC20IP   = ValidIO(RO(20))
377  val LC21IP   = ValidIO(RO(21))
378  val LC22IP   = ValidIO(RO(22))
379  val LC23IP   = ValidIO(RO(23))
380  val LC24IP   = ValidIO(RO(24))
381  val LC25IP   = ValidIO(RO(25))
382  val LC26IP   = ValidIO(RO(26))
383  val LC27IP   = ValidIO(RO(27))
384  val LC28IP   = ValidIO(RO(28))
385  val LC29IP   = ValidIO(RO(29))
386  val LC30IP   = ValidIO(RO(30))
387  val LC31IP   = ValidIO(RO(31))
388  val LC32IP   = ValidIO(RO(32))
389  val LC33IP   = ValidIO(RO(33))
390  val LC34IP   = ValidIO(RO(34))
391  val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt
392  val LC36IP   = ValidIO(RO(36))
393  val LC37IP   = ValidIO(RO(37))
394  val LC38IP   = ValidIO(RO(38))
395  val LC39IP   = ValidIO(RO(39))
396  val LC40IP   = ValidIO(RO(40))
397  val LC41IP   = ValidIO(RO(41))
398  val LC42IP   = ValidIO(RO(42))
399  val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt
400  val LC44IP   = ValidIO(RO(44))
401  val LC45IP   = ValidIO(RO(45))
402  val LC46IP   = ValidIO(RO(46))
403  val LC47IP   = ValidIO(RO(47))
404  val LC48IP   = ValidIO(RO(48))
405  val LC49IP   = ValidIO(RO(49))
406  val LC50IP   = ValidIO(RO(50))
407  val LC51IP   = ValidIO(RO(51))
408  val LC52IP   = ValidIO(RO(52))
409  val LC53IP   = ValidIO(RO(53))
410  val LC54IP   = ValidIO(RO(54))
411  val LC55IP   = ValidIO(RO(55))
412  val LC56IP   = ValidIO(RO(56))
413  val LC57IP   = ValidIO(RO(57))
414  val LC58IP   = ValidIO(RO(58))
415  val LC59IP   = ValidIO(RO(59))
416  val LC60IP   = ValidIO(RO(60))
417  val LC61IP   = ValidIO(RO(61))
418  val LC62IP   = ValidIO(RO(62))
419  val LC63IP   = ValidIO(RO(63))
420
421  def getLocal = Seq(
422    LCOFIP, LC14IP, LC15IP,
423    LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP,
424    LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP,
425    LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP,
426    LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP,
427    LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP,
428    LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP,
429  )
430}
431
432class IeValidBundle extends Bundle with IgnoreSeqInBundle {
433  val SSIE     = ValidIO(RO( 1))
434  val VSSIE    = ValidIO(RO( 2))
435  val MSIE     = ValidIO(RO( 3))
436  val STIE     = ValidIO(RO( 5))
437  val VSTIE    = ValidIO(RO( 6))
438  val MTIE     = ValidIO(RO( 7))
439  val SEIE     = ValidIO(RO( 9))
440  val VSEIE    = ValidIO(RO(10))
441  val MEIE     = ValidIO(RO(11))
442  val SGEIE    = ValidIO(RO(12))
443
444  val LCOFIE   = ValidIO(RO(13)) // Counter overflow interrupt
445  val LC14IE   = ValidIO(RO(14))
446  val LC15IE   = ValidIO(RO(15))
447  val LC16IE   = ValidIO(RO(16))
448  val LC17IE   = ValidIO(RO(17))
449  val LC18IE   = ValidIO(RO(18))
450  val LC19IE   = ValidIO(RO(19))
451  val LC20IE   = ValidIO(RO(20))
452  val LC21IE   = ValidIO(RO(21))
453  val LC22IE   = ValidIO(RO(22))
454  val LC23IE   = ValidIO(RO(23))
455  val LC24IE   = ValidIO(RO(24))
456  val LC25IE   = ValidIO(RO(25))
457  val LC26IE   = ValidIO(RO(26))
458  val LC27IE   = ValidIO(RO(27))
459  val LC28IE   = ValidIO(RO(28))
460  val LC29IE   = ValidIO(RO(29))
461  val LC30IE   = ValidIO(RO(30))
462  val LC31IE   = ValidIO(RO(31))
463  val LC32IE   = ValidIO(RO(32))
464  val LC33IE   = ValidIO(RO(33))
465  val LC34IE   = ValidIO(RO(34))
466  val LPRASEIE = ValidIO(RO(35)) // Low-priority RAS event interrupt
467  val LC36IE   = ValidIO(RO(36))
468  val LC37IE   = ValidIO(RO(37))
469  val LC38IE   = ValidIO(RO(38))
470  val LC39IE   = ValidIO(RO(39))
471  val LC40IE   = ValidIO(RO(40))
472  val LC41IE   = ValidIO(RO(41))
473  val LC42IE   = ValidIO(RO(42))
474  val HPRASEIE = ValidIO(RO(43)) // High-priority RAS event interrupt
475  val LC44IE   = ValidIO(RO(44))
476  val LC45IE   = ValidIO(RO(45))
477  val LC46IE   = ValidIO(RO(46))
478  val LC47IE   = ValidIO(RO(47))
479  val LC48IE   = ValidIO(RO(48))
480  val LC49IE   = ValidIO(RO(49))
481  val LC50IE   = ValidIO(RO(50))
482  val LC51IE   = ValidIO(RO(51))
483  val LC52IE   = ValidIO(RO(52))
484  val LC53IE   = ValidIO(RO(53))
485  val LC54IE   = ValidIO(RO(54))
486  val LC55IE   = ValidIO(RO(55))
487  val LC56IE   = ValidIO(RO(56))
488  val LC57IE   = ValidIO(RO(57))
489  val LC58IE   = ValidIO(RO(58))
490  val LC59IE   = ValidIO(RO(59))
491  val LC60IE   = ValidIO(RO(60))
492  val LC61IE   = ValidIO(RO(61))
493  val LC62IE   = ValidIO(RO(62))
494  val LC63IE   = ValidIO(RO(63))
495
496  val getVS = Seq(VSSIE, VSTIE, VSEIE)
497
498  def getHS = Seq(SSIE, STIE, SEIE)
499
500  def getM = Seq(MSIE, MTIE, MEIE)
501
502  def getNonLocal = Seq(
503    SSIE, VSSIE, MSIE,
504    STIE, VSTIE, MTIE,
505    SEIE, VSEIE, MEIE,
506    SGEIE
507  )
508
509  def getLocal = Seq(
510    LCOFIE, LC14IE, LC15IE,
511    LC16IE, LC17IE, LC18IE, LC19IE, LC20IE, LC21IE, LC22IE, LC23IE,
512    LC24IE, LC25IE, LC26IE, LC27IE, LC28IE, LC29IE, LC30IE, LC31IE,
513    LC32IE, LC33IE, LC34IE, LPRASEIE, LC36IE, LC37IE, LC38IE, LC39IE,
514    LC40IE, LC41IE, LC42IE, HPRASEIE, LC44IE, LC45IE, LC46IE, LC47IE,
515    LC48IE, LC49IE, LC50IE, LC51IE, LC52IE, LC53IE, LC54IE, LC55IE,
516    LC56IE, LC57IE, LC58IE, LC59IE, LC60IE, LC61IE, LC62IE, LC63IE,
517  )
518
519  def getAll = getNonLocal ++ getLocal
520
521  def getRW = getAll.filter(_.bits.isRW)
522
523  def getNonRW = getAll.filterNot(_.bits.isRW)
524
525  def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get
526
527  def connectZeroNonRW : this.type = {
528    this.getNonRW.foreach(_.specifyField(
529      _.valid := false.B,
530      _.bits  := DontCare
531    ))
532    this
533  }
534}
535
536class IpValidBundle extends Bundle with IgnoreSeqInBundle {
537  val SSIP     = ValidIO(RO( 1))
538  val VSSIP    = ValidIO(RO( 2))
539  val MSIP     = ValidIO(RO( 3))
540  val STIP     = ValidIO(RO( 5))
541  val VSTIP    = ValidIO(RO( 6))
542  val MTIP     = ValidIO(RO( 7))
543  val SEIP     = ValidIO(RO( 9))
544  val VSEIP    = ValidIO(RO(10))
545  val MEIP     = ValidIO(RO(11))
546  val SGEIP    = ValidIO(RO(12))
547
548  val LCOFIP   = ValidIO(RO(13)) // Counter overflow interrupt
549  val LC14IP   = ValidIO(RO(14))
550  val LC15IP   = ValidIO(RO(15))
551  val LC16IP   = ValidIO(RO(16))
552  val LC17IP   = ValidIO(RO(17))
553  val LC18IP   = ValidIO(RO(18))
554  val LC19IP   = ValidIO(RO(19))
555  val LC20IP   = ValidIO(RO(20))
556  val LC21IP   = ValidIO(RO(21))
557  val LC22IP   = ValidIO(RO(22))
558  val LC23IP   = ValidIO(RO(23))
559  val LC24IP   = ValidIO(RO(24))
560  val LC25IP   = ValidIO(RO(25))
561  val LC26IP   = ValidIO(RO(26))
562  val LC27IP   = ValidIO(RO(27))
563  val LC28IP   = ValidIO(RO(28))
564  val LC29IP   = ValidIO(RO(29))
565  val LC30IP   = ValidIO(RO(30))
566  val LC31IP   = ValidIO(RO(31))
567  val LC32IP   = ValidIO(RO(32))
568  val LC33IP   = ValidIO(RO(33))
569  val LC34IP   = ValidIO(RO(34))
570  val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt
571  val LC36IP   = ValidIO(RO(36))
572  val LC37IP   = ValidIO(RO(37))
573  val LC38IP   = ValidIO(RO(38))
574  val LC39IP   = ValidIO(RO(39))
575  val LC40IP   = ValidIO(RO(40))
576  val LC41IP   = ValidIO(RO(41))
577  val LC42IP   = ValidIO(RO(42))
578  val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt
579  val LC44IP   = ValidIO(RO(44))
580  val LC45IP   = ValidIO(RO(45))
581  val LC46IP   = ValidIO(RO(46))
582  val LC47IP   = ValidIO(RO(47))
583  val LC48IP   = ValidIO(RO(48))
584  val LC49IP   = ValidIO(RO(49))
585  val LC50IP   = ValidIO(RO(50))
586  val LC51IP   = ValidIO(RO(51))
587  val LC52IP   = ValidIO(RO(52))
588  val LC53IP   = ValidIO(RO(53))
589  val LC54IP   = ValidIO(RO(54))
590  val LC55IP   = ValidIO(RO(55))
591  val LC56IP   = ValidIO(RO(56))
592  val LC57IP   = ValidIO(RO(57))
593  val LC58IP   = ValidIO(RO(58))
594  val LC59IP   = ValidIO(RO(59))
595  val LC60IP   = ValidIO(RO(60))
596  val LC61IP   = ValidIO(RO(61))
597  val LC62IP   = ValidIO(RO(62))
598  val LC63IP   = ValidIO(RO(63))
599
600  val getVS = Seq(VSSIP, VSTIP, VSEIP)
601
602  def getHS = Seq(SSIP, STIP, SEIP)
603
604  def getM = Seq(MSIP, MTIP, MEIP)
605
606  def getNonLocal = Seq(
607    SSIP, VSSIP, MSIP,
608    STIP, VSTIP, MTIP,
609    SEIP, VSEIP, MEIP,
610    SGEIP
611  )
612
613  def getLocal = Seq(
614    LCOFIP, LC14IP, LC15IP,
615    LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP,
616    LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP,
617    LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP,
618    LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP,
619    LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP,
620    LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP,
621  )
622
623  def getAll = getNonLocal ++ getLocal
624
625  def getRW = getAll.filter(_.bits.isRW)
626
627  def getNonRW = getAll.filterNot(_.bits.isRW)
628
629  def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get
630
631  def connectZeroNonRW : this.type = {
632    this.getNonRW.foreach(_.specifyField(
633      _.valid := false.B,
634      _.bits  := DontCare,
635    ))
636    this
637  }
638}
639