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