xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/TrapTvalMod.scala (revision c1b28b66879239a5b3a44741376f3b002e8ac834)
1*c1b28b66STang Haojinpackage xiangshan.backend.fu.NewCSR
2*c1b28b66STang Haojin
3*c1b28b66STang Haojinimport chisel3._
4*c1b28b66STang Haojinimport chisel3.util._
5*c1b28b66STang Haojinimport org.chipsalliance.cde.config.Parameters
6*c1b28b66STang Haojinimport utility.HasCircularQueuePtrHelper
7*c1b28b66STang Haojinimport xiangshan._
8*c1b28b66STang Haojinimport xiangshan.backend.fu.NewCSR.CSREvents.TargetPCBundle
9*c1b28b66STang Haojinimport xiangshan.backend.rob.RobPtr
10*c1b28b66STang Haojin
11*c1b28b66STang Haojinclass TrapTvalMod(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelper {
12*c1b28b66STang Haojin  val io = IO(new Bundle {
13*c1b28b66STang Haojin    val fromCtrlBlock = Input(new Bundle {
14*c1b28b66STang Haojin      val flush = ValidIO(new Redirect)
15*c1b28b66STang Haojin      val robDeqPtr = Input(new RobPtr)
16*c1b28b66STang Haojin    })
17*c1b28b66STang Haojin
18*c1b28b66STang Haojin    val targetPc = Input(ValidIO(new TargetPCBundle))
19*c1b28b66STang Haojin    val clear = Input(Bool())
20*c1b28b66STang Haojin    val tval = Output(UInt(XLEN.W))
21*c1b28b66STang Haojin  })
22*c1b28b66STang Haojin
23*c1b28b66STang Haojin  private val valid = RegInit(false.B)
24*c1b28b66STang Haojin  private val tval = Reg(UInt(XLEN.W))
25*c1b28b66STang Haojin  private val robIdx = Reg(new RobPtr)
26*c1b28b66STang Haojin
27*c1b28b66STang Haojin  private val updateFromFlush = io.fromCtrlBlock.flush.valid && io.fromCtrlBlock.flush.bits.cfiUpdate.hasBackendFault
28*c1b28b66STang Haojin  private val clearFromFlush = io.fromCtrlBlock.flush.valid && !io.fromCtrlBlock.flush.bits.cfiUpdate.hasBackendFault
29*c1b28b66STang Haojin
30*c1b28b66STang Haojin  when(io.targetPc.valid && io.targetPc.bits.raiseFault) {
31*c1b28b66STang Haojin    valid := true.B
32*c1b28b66STang Haojin    tval := io.targetPc.bits.pc
33*c1b28b66STang Haojin    robIdx := io.fromCtrlBlock.robDeqPtr
34*c1b28b66STang Haojin  }.elsewhen(valid) {
35*c1b28b66STang Haojin    when(updateFromFlush && isBefore(io.fromCtrlBlock.flush.bits.robIdx, robIdx)) {
36*c1b28b66STang Haojin      valid := true.B
37*c1b28b66STang Haojin      tval := io.fromCtrlBlock.flush.bits.fullTarget
38*c1b28b66STang Haojin      robIdx := io.fromCtrlBlock.flush.bits.robIdx
39*c1b28b66STang Haojin    }.elsewhen(clearFromFlush && isBefore(io.fromCtrlBlock.flush.bits.robIdx, robIdx) || io.clear) {
40*c1b28b66STang Haojin      valid := false.B
41*c1b28b66STang Haojin    }
42*c1b28b66STang Haojin  }.otherwise {
43*c1b28b66STang Haojin    when(updateFromFlush) {
44*c1b28b66STang Haojin      valid := true.B
45*c1b28b66STang Haojin      tval := io.fromCtrlBlock.flush.bits.fullTarget
46*c1b28b66STang Haojin      robIdx := io.fromCtrlBlock.flush.bits.robIdx
47*c1b28b66STang Haojin    }
48*c1b28b66STang Haojin  }
49*c1b28b66STang Haojin
50*c1b28b66STang Haojin  io.tval := tval
51*c1b28b66STang Haojin
52*c1b28b66STang Haojin  when(io.clear) { assert(valid) }
53*c1b28b66STang Haojin}
54