1*b6a21a24SYinan Xupackage device 2*b6a21a24SYinan Xu 3*b6a21a24SYinan Xuimport chisel3._ 4*b6a21a24SYinan Xuimport chisel3.util._ 5*b6a21a24SYinan Xuimport chipsalliance.rocketchip.config.Parameters 6*b6a21a24SYinan Xuimport freechips.rocketchip.diplomacy.AddressSet 7*b6a21a24SYinan Xuimport utils._ 8*b6a21a24SYinan Xu 9*b6a21a24SYinan Xu// we support 256 interrupt bits by default 10*b6a21a24SYinan Xuclass IntrGenIO extends Bundle { 11*b6a21a24SYinan Xu val intrVec = Output(UInt(256.W)) 12*b6a21a24SYinan Xu} 13*b6a21a24SYinan Xu 14*b6a21a24SYinan Xuclass AXI4IntrGenerator 15*b6a21a24SYinan Xu( 16*b6a21a24SYinan Xu address: Seq[AddressSet] 17*b6a21a24SYinan Xu)(implicit p: Parameters) 18*b6a21a24SYinan Xu extends AXI4SlaveModule(address, executable = false, _extra = new IntrGenIO) 19*b6a21a24SYinan Xu{ 20*b6a21a24SYinan Xu 21*b6a21a24SYinan Xu override lazy val module = new AXI4SlaveModuleImp(this){ 22*b6a21a24SYinan Xu 23*b6a21a24SYinan Xu val intrReg = RegInit(VecInit(Seq.fill(8)(0.U(32.W)))) 24*b6a21a24SYinan Xu io.extra.get.intrVec := Cat(intrReg.reverse) 25*b6a21a24SYinan Xu 26*b6a21a24SYinan Xu when (in.w.fire()) { 27*b6a21a24SYinan Xu intrReg(waddr(4, 2)) := in.w.bits.data(31, 0) 28*b6a21a24SYinan Xu } 29*b6a21a24SYinan Xu 30*b6a21a24SYinan Xu in.r.bits.data := intrReg(raddr) 31*b6a21a24SYinan Xu } 32*b6a21a24SYinan Xu} 33