1package xiangshan.backend.fu.NewCSR 2 3import chisel3._ 4import chisel3.util._ 5 6class SstcInterruptGen extends Module { 7 val i = IO(Input(new Bundle { 8 val stime = ValidIO(UInt(64.W)) 9 val vstime = ValidIO(UInt(64.W)) 10 val stimecmp = new Bundle { 11 val wen = Bool() 12 val rdata = UInt(64.W) 13 } 14 val vstimecmp = new Bundle { 15 val wen = Bool() 16 val rdata = UInt(64.W) 17 } 18 val htimedeltaWen = Bool() 19 val menvcfg = new Bundle { 20 val wen = Bool() 21 val STCE = Bool() 22 } 23 val henvcfg = new Bundle { 24 val wen = Bool() 25 val STCE = Bool() 26 } 27 })) 28 val o = IO(Output(new Bundle { 29 val STIP = Bool() 30 val VSTIP = Bool() 31 })) 32 33 // Guard TIP by envcfg.STCE to avoid wrong assertion of time interrupt 34 o.STIP := RegEnable(i.stime.bits >= i.stimecmp.rdata && i.menvcfg.STCE, false.B, i.stime.valid || i.stimecmp.wen || i.menvcfg.wen) 35 o.VSTIP := RegEnable(i.vstime.bits >= i.vstimecmp.rdata && i.henvcfg.STCE, false.B, i.vstime.valid || i.vstimecmp.wen || i.htimedeltaWen || i.menvcfg.wen || i.henvcfg.wen) 36} 37