xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/SstcInterruptGen.scala (revision 0051450372ae5a03ce9d36afdbdd34b9a19f4785)
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