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