xref: /XiangShan/src/main/scala/xiangshan/backend/fu/NewCSR/TrapInstMod.scala (revision 5860cb7027869d595fd8baf1ca3b2fb2b937e2a4)
192c61038SXuan Hupackage xiangshan.backend.fu.NewCSR
292c61038SXuan Hu
392c61038SXuan Huimport chisel3._
492c61038SXuan Huimport chisel3.util._
592c61038SXuan Huimport org.chipsalliance.cde.config.Parameters
6eec4ee3aSXuan Huimport utility.{HasCircularQueuePtrHelper, XSError}
792c61038SXuan Huimport xiangshan._
892c61038SXuan Huimport xiangshan.backend.Bundles.TrapInstInfo
992c61038SXuan Huimport xiangshan.backend.decode.Imm_Z
1092c61038SXuan Huimport xiangshan.frontend.FtqPtr
1192c61038SXuan Huimport xiangshan.backend.decode.isa.bitfield.OPCODE5Bit
1292c61038SXuan Hu
1392c61038SXuan Huclass FtqInfo(implicit p: Parameters) extends XSBundle {
1492c61038SXuan Hu  val ftqPtr = new FtqPtr()
1592c61038SXuan Hu  val ftqOffset = UInt(log2Up(PredictWidth).W)
1692c61038SXuan Hu}
1792c61038SXuan Hu
18eec4ee3aSXuan Huclass TrapInstMod(implicit p: Parameters) extends Module with HasCircularQueuePtrHelper {
1992c61038SXuan Hu  val io = IO(new Bundle {
2092c61038SXuan Hu    val fromDecode = Input(new Bundle {
2192c61038SXuan Hu      val trapInstInfo = ValidIO(new TrapInstInfo)
2292c61038SXuan Hu    })
2392c61038SXuan Hu
2492c61038SXuan Hu    val fromRob = Input(new Bundle {
2592c61038SXuan Hu      val flush = ValidIO(new FtqInfo)
2692c61038SXuan Hu    })
2792c61038SXuan Hu
2892c61038SXuan Hu    val faultCsrUop = Input(ValidIO(new Bundle {
2992c61038SXuan Hu      val fuOpType = FuOpType()
3092c61038SXuan Hu      val imm      = UInt(Imm_Z().len.W)
31cbff1a51SXuan Hu      val ftqInfo  = new FtqInfo
3292c61038SXuan Hu    }))
3392c61038SXuan Hu
3492c61038SXuan Hu    val readClear = Input(Bool())
3592c61038SXuan Hu    val currentTrapInst = Output(ValidIO(UInt(32.W)))
3692c61038SXuan Hu  })
3792c61038SXuan Hu
3892c61038SXuan Hu  // alias
3992c61038SXuan Hu  val flush = io.fromRob.flush
4092c61038SXuan Hu  val newTrapInstInfo = io.fromDecode.trapInstInfo
4192c61038SXuan Hu
4292c61038SXuan Hu  val valid = RegInit(false.B)
4392c61038SXuan Hu  val trapInstInfo = Reg(new TrapInstInfo)
4492c61038SXuan Hu
4592c61038SXuan Hu  val csrAddr = Imm_Z().getCSRAddr(io.faultCsrUop.bits.imm)
4692c61038SXuan Hu  val rs1 = Imm_Z().getRS1(io.faultCsrUop.bits.imm)
4792c61038SXuan Hu  val rd = Imm_Z().getRD(io.faultCsrUop.bits.imm)
4892c61038SXuan Hu  val func3 = CSROpType.getFunc3(io.faultCsrUop.bits.fuOpType)
4992c61038SXuan Hu
5092c61038SXuan Hu  val csrInst = Cat(csrAddr, rs1, func3, rd, OPCODE5Bit.SYSTEM, "b11".U)
5192c61038SXuan Hu  require(csrInst.getWidth == 32)
5292c61038SXuan Hu
5392c61038SXuan Hu  val newCSRInstValid = io.faultCsrUop.valid
5492c61038SXuan Hu  val newCSRInst = WireInit(0.U.asTypeOf(new TrapInstInfo))
5592c61038SXuan Hu  newCSRInst.instr := csrInst
56cbff1a51SXuan Hu  newCSRInst.ftqPtr := io.faultCsrUop.bits.ftqInfo.ftqPtr
57cbff1a51SXuan Hu  newCSRInst.ftqOffset := io.faultCsrUop.bits.ftqInfo.ftqOffset
5892c61038SXuan Hu
5992c61038SXuan Hu  when (flush.valid && valid && trapInstInfo.needFlush(flush.bits.ftqPtr, flush.bits.ftqOffset)) {
6092c61038SXuan Hu    valid := false.B
6192c61038SXuan Hu  }.elsewhen(io.readClear) {
6292c61038SXuan Hu    valid := false.B
63eec4ee3aSXuan Hu  }.elsewhen(newCSRInstValid) {
64eec4ee3aSXuan Hu    valid := true.B
65*5860cb70SZhaoyang You    when (!valid) {
66eec4ee3aSXuan Hu      trapInstInfo := newCSRInst
67*5860cb70SZhaoyang You    }.elsewhen(valid &&
68*5860cb70SZhaoyang You      (newCSRInst.ftqPtr === trapInstInfo.ftqPtr && newCSRInst.ftqOffset < trapInstInfo.ftqOffset ||
69*5860cb70SZhaoyang You      newCSRInst.ftqPtr < trapInstInfo.ftqPtr)
70*5860cb70SZhaoyang You    ) {
71*5860cb70SZhaoyang You      trapInstInfo := newCSRInst
72*5860cb70SZhaoyang You    }
7392c61038SXuan Hu  }.elsewhen(newTrapInstInfo.valid && !valid) {
7492c61038SXuan Hu    valid := true.B
7592c61038SXuan Hu    trapInstInfo := newTrapInstInfo.bits
7684ff1b75SXuan Hu    trapInstInfo.instr := Mux(
7784ff1b75SXuan Hu      newTrapInstInfo.bits.instr(1, 0) === "b11".U,
7884ff1b75SXuan Hu      newTrapInstInfo.bits.instr,
7984ff1b75SXuan Hu      newTrapInstInfo.bits.instr(15, 0)
8084ff1b75SXuan Hu    )
8192c61038SXuan Hu  }
8292c61038SXuan Hu
8392c61038SXuan Hu  io.currentTrapInst.valid := valid
8492c61038SXuan Hu  io.currentTrapInst.bits := trapInstInfo.instr
8592c61038SXuan Hu}
86