10b4c00ffSXuan Hupackage xiangshan.backend.fu.NewCSR 20b4c00ffSXuan Hu 30b4c00ffSXuan Huimport chisel3._ 40b4c00ffSXuan Huimport chisel3.util._ 50b4c00ffSXuan Hu 60b4c00ffSXuan Huclass SstcInterruptGen extends Module { 70b4c00ffSXuan Hu val i = IO(Input(new Bundle { 8244b1012SsinceforYy val stime = ValidIO(UInt(64.W)) 9244b1012SsinceforYy val vstime = ValidIO(UInt(64.W)) 10*00514503SZhaoyang You val stimecmp = new Bundle { 11*00514503SZhaoyang You val wen = Bool() 12*00514503SZhaoyang You val rdata = UInt(64.W) 13*00514503SZhaoyang You } 14*00514503SZhaoyang You val vstimecmp = new Bundle { 15*00514503SZhaoyang You val wen = Bool() 16*00514503SZhaoyang You val rdata = UInt(64.W) 17*00514503SZhaoyang You } 18*00514503SZhaoyang You val htimedeltaWen = Bool() 19*00514503SZhaoyang You val menvcfg = new Bundle { 20*00514503SZhaoyang You val wen = Bool() 21*00514503SZhaoyang You val STCE = Bool() 22*00514503SZhaoyang You } 23*00514503SZhaoyang You val henvcfg = new Bundle { 24*00514503SZhaoyang You val wen = Bool() 25*00514503SZhaoyang You val STCE = Bool() 26*00514503SZhaoyang You } 270b4c00ffSXuan Hu })) 280b4c00ffSXuan Hu val o = IO(Output(new Bundle { 290b4c00ffSXuan Hu val STIP = Bool() 300b4c00ffSXuan Hu val VSTIP = Bool() 310b4c00ffSXuan Hu })) 320b4c00ffSXuan Hu 330b4c00ffSXuan Hu // Guard TIP by envcfg.STCE to avoid wrong assertion of time interrupt 34*00514503SZhaoyang You o.STIP := RegEnable(i.stime.bits >= i.stimecmp.rdata && i.menvcfg.STCE, false.B, i.stime.valid || i.stimecmp.wen || i.menvcfg.wen) 35*00514503SZhaoyang You 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) 360b4c00ffSXuan Hu} 37