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