xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/InterruptBundle.scala (revision 1d192ad8d9dcb83e42366079ad2d0c167e213d5d)
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 getNonLocal = Seq(
268    SSIE, VSSIE, MSIE,
269    STIE, VSTIE, MTIE,
270    SEIE, VSEIE, MEIE,
271    SGEIE
272  )
273
274  def getLocal = Seq(
275    LCOFIE,LC14IE,LC15IE,
276    LC16IE,LC17IE,LC18IE,LC19IE,LC20IE,LC21IE,LC22IE,LC23IE,
277    LC24IE,LC25IE,LC26IE,LC27IE,LC28IE,LC29IE,LC30IE,LC31IE,
278    LC32IE,LC33IE,LC34IE,LPRASEIE,LC36IE,LC37IE,LC38IE,LC39IE,
279    LC40IE,LC41IE,LC42IE,HPRASEIE,LC44IE,LC45IE,LC46IE,LC47IE,
280    LC48IE,LC49IE,LC50IE,LC51IE,LC52IE,LC53IE,LC54IE,LC55IE,
281    LC56IE,LC57IE,LC58IE,LC59IE,LC60IE,LC61IE,LC62IE,LC63IE
282  )
283
284  def getALL = getNonLocal ++ getLocal
285
286  def getRW = getALL.filter(_.isRW)
287}
288
289object InterruptNO {
290  // Software Interrupt
291  final val SSI  = 1
292  final val VSSI = 2
293  final val MSI  = 3
294  // Time Interrupt
295  final val STI  = 5
296  final val VSTI = 6
297  final val MTI  = 7
298  // External Interrupt
299  final val SEI  = 9
300  final val VSEI = 10
301  final val MEI  = 11
302  final val SGEI = 12
303  // SoC
304  final val COI = 13
305  final val LPRASEI = 35
306  final val HPRASEI = 43
307
308  val interruptDefaultPrio = Seq(
309    HPRASEI,
310
311    MEI, MSI, MTI,
312    SEI, SSI, STI,
313    SGEI,
314    VSEI, VSSI, VSTI,
315    COI,
316
317    LPRASEI
318  )
319
320  def getPrioIdx(f: this.type => Int): Int = {
321    val idx = this.interruptDefaultPrio.indexOf(f(this))
322    assert(idx != -1)
323    idx
324  }
325}
326
327trait HasIpIeBundle { self: CSRModule[_] =>
328  val mideleg = IO(Input(new MidelegBundle))
329  val mip     = IO(Input(new MipBundle))
330  val mie     = IO(Input(new MieBundle))
331  val mvip    = IO(Input(new MvipBundle))
332  val mvien   = IO(Input(new MvienBundle))
333  val hideleg = IO(Input(new HidelegBundle))
334  val hip     = IO(Input(new HipBundle))
335  val hie     = IO(Input(new HieBundle))
336  val hvien   = IO(Input(new HvienBundle))
337  val hvip    = IO(Input(new HvipBundle))
338  val sip     = IO(Input(new SipBundle))
339  val sie     = IO(Input(new SieBundle))
340  val vsip    = IO(Input(new VSipBundle))
341  val vsie    = IO(Input(new VSieBundle))
342  val hgeip   = IO(Input(new HgeipBundle))
343  val hgeie   = IO(Input(new HgeieBundle))
344  val hstatusVGEIN = IO(Input(HstatusVgeinField()))
345}
346
347trait ToAliasIpLocalPart extends Bundle {
348  val LCOFIP   = ValidIO(RO(13)) // Counter overflow interrupt
349  val LC14IP   = ValidIO(RO(14))
350  val LC15IP   = ValidIO(RO(15))
351  val LC16IP   = ValidIO(RO(16))
352  val LC17IP   = ValidIO(RO(17))
353  val LC18IP   = ValidIO(RO(18))
354  val LC19IP   = ValidIO(RO(19))
355  val LC20IP   = ValidIO(RO(20))
356  val LC21IP   = ValidIO(RO(21))
357  val LC22IP   = ValidIO(RO(22))
358  val LC23IP   = ValidIO(RO(23))
359  val LC24IP   = ValidIO(RO(24))
360  val LC25IP   = ValidIO(RO(25))
361  val LC26IP   = ValidIO(RO(26))
362  val LC27IP   = ValidIO(RO(27))
363  val LC28IP   = ValidIO(RO(28))
364  val LC29IP   = ValidIO(RO(29))
365  val LC30IP   = ValidIO(RO(30))
366  val LC31IP   = ValidIO(RO(31))
367  val LC32IP   = ValidIO(RO(32))
368  val LC33IP   = ValidIO(RO(33))
369  val LC34IP   = ValidIO(RO(34))
370  val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt
371  val LC36IP   = ValidIO(RO(36))
372  val LC37IP   = ValidIO(RO(37))
373  val LC38IP   = ValidIO(RO(38))
374  val LC39IP   = ValidIO(RO(39))
375  val LC40IP   = ValidIO(RO(40))
376  val LC41IP   = ValidIO(RO(41))
377  val LC42IP   = ValidIO(RO(42))
378  val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt
379  val LC44IP   = ValidIO(RO(44))
380  val LC45IP   = ValidIO(RO(45))
381  val LC46IP   = ValidIO(RO(46))
382  val LC47IP   = ValidIO(RO(47))
383  val LC48IP   = ValidIO(RO(48))
384  val LC49IP   = ValidIO(RO(49))
385  val LC50IP   = ValidIO(RO(50))
386  val LC51IP   = ValidIO(RO(51))
387  val LC52IP   = ValidIO(RO(52))
388  val LC53IP   = ValidIO(RO(53))
389  val LC54IP   = ValidIO(RO(54))
390  val LC55IP   = ValidIO(RO(55))
391  val LC56IP   = ValidIO(RO(56))
392  val LC57IP   = ValidIO(RO(57))
393  val LC58IP   = ValidIO(RO(58))
394  val LC59IP   = ValidIO(RO(59))
395  val LC60IP   = ValidIO(RO(60))
396  val LC61IP   = ValidIO(RO(61))
397  val LC62IP   = ValidIO(RO(62))
398  val LC63IP   = ValidIO(RO(63))
399
400  def getLocal = Seq(
401    LCOFIP, LC14IP, LC15IP,
402    LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP,
403    LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP,
404    LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP,
405    LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP,
406    LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP,
407    LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP,
408  )
409}
410
411class IeValidBundle extends Bundle with IgnoreSeqInBundle {
412  val SSIE     = ValidIO(RO( 1))
413  val VSSIE    = ValidIO(RO( 2))
414  val MSIE     = ValidIO(RO( 3))
415  val STIE     = ValidIO(RO( 5))
416  val VSTIE    = ValidIO(RO( 6))
417  val MTIE     = ValidIO(RO( 7))
418  val SEIE     = ValidIO(RO( 9))
419  val VSEIE    = ValidIO(RO(10))
420  val MEIE     = ValidIO(RO(11))
421  val SGEIE    = ValidIO(RO(12))
422
423  val LCOFIE   = ValidIO(RO(13)) // Counter overflow interrupt
424  val LC14IE   = ValidIO(RO(14))
425  val LC15IE   = ValidIO(RO(15))
426  val LC16IE   = ValidIO(RO(16))
427  val LC17IE   = ValidIO(RO(17))
428  val LC18IE   = ValidIO(RO(18))
429  val LC19IE   = ValidIO(RO(19))
430  val LC20IE   = ValidIO(RO(20))
431  val LC21IE   = ValidIO(RO(21))
432  val LC22IE   = ValidIO(RO(22))
433  val LC23IE   = ValidIO(RO(23))
434  val LC24IE   = ValidIO(RO(24))
435  val LC25IE   = ValidIO(RO(25))
436  val LC26IE   = ValidIO(RO(26))
437  val LC27IE   = ValidIO(RO(27))
438  val LC28IE   = ValidIO(RO(28))
439  val LC29IE   = ValidIO(RO(29))
440  val LC30IE   = ValidIO(RO(30))
441  val LC31IE   = ValidIO(RO(31))
442  val LC32IE   = ValidIO(RO(32))
443  val LC33IE   = ValidIO(RO(33))
444  val LC34IE   = ValidIO(RO(34))
445  val LPRASEIE = ValidIO(RO(35)) // Low-priority RAS event interrupt
446  val LC36IE   = ValidIO(RO(36))
447  val LC37IE   = ValidIO(RO(37))
448  val LC38IE   = ValidIO(RO(38))
449  val LC39IE   = ValidIO(RO(39))
450  val LC40IE   = ValidIO(RO(40))
451  val LC41IE   = ValidIO(RO(41))
452  val LC42IE   = ValidIO(RO(42))
453  val HPRASEIE = ValidIO(RO(43)) // High-priority RAS event interrupt
454  val LC44IE   = ValidIO(RO(44))
455  val LC45IE   = ValidIO(RO(45))
456  val LC46IE   = ValidIO(RO(46))
457  val LC47IE   = ValidIO(RO(47))
458  val LC48IE   = ValidIO(RO(48))
459  val LC49IE   = ValidIO(RO(49))
460  val LC50IE   = ValidIO(RO(50))
461  val LC51IE   = ValidIO(RO(51))
462  val LC52IE   = ValidIO(RO(52))
463  val LC53IE   = ValidIO(RO(53))
464  val LC54IE   = ValidIO(RO(54))
465  val LC55IE   = ValidIO(RO(55))
466  val LC56IE   = ValidIO(RO(56))
467  val LC57IE   = ValidIO(RO(57))
468  val LC58IE   = ValidIO(RO(58))
469  val LC59IE   = ValidIO(RO(59))
470  val LC60IE   = ValidIO(RO(60))
471  val LC61IE   = ValidIO(RO(61))
472  val LC62IE   = ValidIO(RO(62))
473  val LC63IE   = ValidIO(RO(63))
474
475  val getVS = Seq(VSSIE, VSTIE, VSEIE)
476
477  def getHS = Seq(SSIE, STIE, SEIE)
478
479  def getM = Seq(MSIE, MTIE, MEIE)
480
481  def getNonLocal = Seq(
482    SSIE, VSSIE, MSIE,
483    STIE, VSTIE, MTIE,
484    SEIE, VSEIE, MEIE,
485    SGEIE
486  )
487
488  def getLocal = Seq(
489    LCOFIE, LC14IE, LC15IE,
490    LC16IE, LC17IE, LC18IE, LC19IE, LC20IE, LC21IE, LC22IE, LC23IE,
491    LC24IE, LC25IE, LC26IE, LC27IE, LC28IE, LC29IE, LC30IE, LC31IE,
492    LC32IE, LC33IE, LC34IE, LPRASEIE, LC36IE, LC37IE, LC38IE, LC39IE,
493    LC40IE, LC41IE, LC42IE, HPRASEIE, LC44IE, LC45IE, LC46IE, LC47IE,
494    LC48IE, LC49IE, LC50IE, LC51IE, LC52IE, LC53IE, LC54IE, LC55IE,
495    LC56IE, LC57IE, LC58IE, LC59IE, LC60IE, LC61IE, LC62IE, LC63IE,
496  )
497
498  def getAll = getNonLocal ++ getLocal
499
500  def getRW = getAll.filter(_.bits.isRW)
501
502  def getNonRW = getAll.filterNot(_.bits.isRW)
503
504  def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get
505
506  def connectZeroNonRW : this.type = {
507    this.getNonRW.foreach(_.specifyField(
508      _.valid := false.B,
509      _.bits  := DontCare
510    ))
511    this
512  }
513}
514
515class IpValidBundle extends Bundle with IgnoreSeqInBundle {
516  val SSIP     = ValidIO(RO( 1))
517  val VSSIP    = ValidIO(RO( 2))
518  val MSIP     = ValidIO(RO( 3))
519  val STIP     = ValidIO(RO( 5))
520  val VSTIP    = ValidIO(RO( 6))
521  val MTIP     = ValidIO(RO( 7))
522  val SEIP     = ValidIO(RO( 9))
523  val VSEIP    = ValidIO(RO(10))
524  val MEIP     = ValidIO(RO(11))
525  val SGEIP    = ValidIO(RO(12))
526
527  val LCOFIP   = ValidIO(RO(13)) // Counter overflow interrupt
528  val LC14IP   = ValidIO(RO(14))
529  val LC15IP   = ValidIO(RO(15))
530  val LC16IP   = ValidIO(RO(16))
531  val LC17IP   = ValidIO(RO(17))
532  val LC18IP   = ValidIO(RO(18))
533  val LC19IP   = ValidIO(RO(19))
534  val LC20IP   = ValidIO(RO(20))
535  val LC21IP   = ValidIO(RO(21))
536  val LC22IP   = ValidIO(RO(22))
537  val LC23IP   = ValidIO(RO(23))
538  val LC24IP   = ValidIO(RO(24))
539  val LC25IP   = ValidIO(RO(25))
540  val LC26IP   = ValidIO(RO(26))
541  val LC27IP   = ValidIO(RO(27))
542  val LC28IP   = ValidIO(RO(28))
543  val LC29IP   = ValidIO(RO(29))
544  val LC30IP   = ValidIO(RO(30))
545  val LC31IP   = ValidIO(RO(31))
546  val LC32IP   = ValidIO(RO(32))
547  val LC33IP   = ValidIO(RO(33))
548  val LC34IP   = ValidIO(RO(34))
549  val LPRASEIP = ValidIO(RO(35)) // Low-priority RAS event interrupt
550  val LC36IP   = ValidIO(RO(36))
551  val LC37IP   = ValidIO(RO(37))
552  val LC38IP   = ValidIO(RO(38))
553  val LC39IP   = ValidIO(RO(39))
554  val LC40IP   = ValidIO(RO(40))
555  val LC41IP   = ValidIO(RO(41))
556  val LC42IP   = ValidIO(RO(42))
557  val HPRASEIP = ValidIO(RO(43)) // High-priority RAS event interrupt
558  val LC44IP   = ValidIO(RO(44))
559  val LC45IP   = ValidIO(RO(45))
560  val LC46IP   = ValidIO(RO(46))
561  val LC47IP   = ValidIO(RO(47))
562  val LC48IP   = ValidIO(RO(48))
563  val LC49IP   = ValidIO(RO(49))
564  val LC50IP   = ValidIO(RO(50))
565  val LC51IP   = ValidIO(RO(51))
566  val LC52IP   = ValidIO(RO(52))
567  val LC53IP   = ValidIO(RO(53))
568  val LC54IP   = ValidIO(RO(54))
569  val LC55IP   = ValidIO(RO(55))
570  val LC56IP   = ValidIO(RO(56))
571  val LC57IP   = ValidIO(RO(57))
572  val LC58IP   = ValidIO(RO(58))
573  val LC59IP   = ValidIO(RO(59))
574  val LC60IP   = ValidIO(RO(60))
575  val LC61IP   = ValidIO(RO(61))
576  val LC62IP   = ValidIO(RO(62))
577  val LC63IP   = ValidIO(RO(63))
578
579  val getVS = Seq(VSSIP, VSTIP, VSEIP)
580
581  def getHS = Seq(SSIP, STIP, SEIP)
582
583  def getM = Seq(MSIP, MTIP, MEIP)
584
585  def getNonLocal = Seq(
586    SSIP, VSSIP, MSIP,
587    STIP, VSTIP, MTIP,
588    SEIP, VSEIP, MEIP,
589    SGEIP
590  )
591
592  def getLocal = Seq(
593    LCOFIP, LC14IP, LC15IP,
594    LC16IP, LC17IP, LC18IP, LC19IP, LC20IP, LC21IP, LC22IP, LC23IP,
595    LC24IP, LC25IP, LC26IP, LC27IP, LC28IP, LC29IP, LC30IP, LC31IP,
596    LC32IP, LC33IP, LC34IP, LPRASEIP, LC36IP, LC37IP, LC38IP, LC39IP,
597    LC40IP, LC41IP, LC42IP, HPRASEIP, LC44IP, LC45IP, LC46IP, LC47IP,
598    LC48IP, LC49IP, LC50IP, LC51IP, LC52IP, LC53IP, LC54IP, LC55IP,
599    LC56IP, LC57IP, LC58IP, LC59IP, LC60IP, LC61IP, LC62IP, LC63IP,
600  )
601
602  def getAll = getNonLocal ++ getLocal
603
604  def getRW = getAll.filter(_.bits.isRW)
605
606  def getNonRW = getAll.filterNot(_.bits.isRW)
607
608  def getByNum(num: Int) = getAll.find(_.bits.lsb == num).get
609
610  def connectZeroNonRW : this.type = {
611    this.getNonRW.foreach(_.specifyField(
612      _.valid := false.B,
613      _.bits  := DontCare,
614    ))
615    this
616  }
617}
618