1be25371aSYikeZhoupackage xiangshan.backend.decode 2be25371aSYikeZhou 3be25371aSYikeZhouimport chisel3._ 4be25371aSYikeZhouimport chisel3.util._ 5be25371aSYikeZhou 6*4d24c305SYikeZhouimport freechips.rocketchip.config.Parameters 7*4d24c305SYikeZhouimport freechips.rocketchip.rocket.{RVCDecoder, ExpandedInstruction} 8*4d24c305SYikeZhouimport freechips.rocketchip.rocket.{CSR,Causes} 9*4d24c305SYikeZhouimport freechips.rocketchip.util.{uintToBitPat,UIntIsOneOf} 10*4d24c305SYikeZhou 11be25371aSYikeZhouimport xiangshan._ 12be25371aSYikeZhouimport utils._ 13be25371aSYikeZhouimport xiangshan.backend._ 14*4d24c305SYikeZhouimport xiangshan.backend.decode.AltInstructions._ 15*4d24c305SYikeZhouimport xiangshan.backend.fu.fpu.FPUOpType 16*4d24c305SYikeZhouimport freechips.rocketchip.tile.RocketTile 17be25371aSYikeZhou 18be25371aSYikeZhou/** 19be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 20be25371aSYikeZhou */ 21be25371aSYikeZhouabstract trait DecodeConstants { 22*4d24c305SYikeZhou // TODO move these constants to somewhere else? 23*4d24c305SYikeZhou def X = BitPat("b?") 24*4d24c305SYikeZhou def N = BitPat("b0") 25*4d24c305SYikeZhou def Y = BitPat("b1") 26*4d24c305SYikeZhou 27be25371aSYikeZhou def decodeDefault: List[BitPat] = 28*4d24c305SYikeZhou // src1Type src2Type src3Type fuType fuOpType rfWen 29*4d24c305SYikeZhou // | | | | | | fpWen 30*4d24c305SYikeZhou // | | | | | | | isXSTrap 31*4d24c305SYikeZhou // | | | | | | | | noSpecExec 32*4d24c305SYikeZhou // | | | | | | | | | blockBackward 33*4d24c305SYikeZhou // | | | | | | | | | | flushPipe 34*4d24c305SYikeZhou // | | | | | | | | | | | isRVF 35*4d24c305SYikeZhou // | | | | | | | | | | | | 36*4d24c305SYikeZhou List(SrcType.reg, SrcType.reg, SrcType.reg, FuType.alu, ALUOpType.sll, N, N, N, N, N, N, N) 37*4d24c305SYikeZhou 38be25371aSYikeZhou val table: Array[(BitPat, List[BitPat])] 39be25371aSYikeZhou} 40be25371aSYikeZhou 41*4d24c305SYikeZhoutrait RISCVConstants 42*4d24c305SYikeZhou{ 43*4d24c305SYikeZhou // abstract out instruction decode magic numbers 44*4d24c305SYikeZhou val RD_MSB = 11 45*4d24c305SYikeZhou val RD_LSB = 7 46*4d24c305SYikeZhou val RS1_MSB = 19 47*4d24c305SYikeZhou val RS1_LSB = 15 48*4d24c305SYikeZhou val RS2_MSB = 24 49*4d24c305SYikeZhou val RS2_LSB = 20 50*4d24c305SYikeZhou val RS3_MSB = 31 51*4d24c305SYikeZhou val RS3_LSB = 27 52*4d24c305SYikeZhou 53*4d24c305SYikeZhou // TODO move constants above to somewhere better and remove useless constants below 54*4d24c305SYikeZhou 55*4d24c305SYikeZhou val CSR_ADDR_MSB = 31 56*4d24c305SYikeZhou val CSR_ADDR_LSB = 20 57*4d24c305SYikeZhou val CSR_ADDR_SZ = 12 58*4d24c305SYikeZhou 59*4d24c305SYikeZhou // location of the fifth bit in the shamt (for checking for illegal ops for SRAIW,etc.) 60*4d24c305SYikeZhou val SHAMT_5_BIT = 25 61*4d24c305SYikeZhou val LONGEST_IMM_SZ = 20 62*4d24c305SYikeZhou val X0 = 0.U 63*4d24c305SYikeZhou val RA = 1.U // return address register 64*4d24c305SYikeZhou 65*4d24c305SYikeZhou // memory consistency model 66*4d24c305SYikeZhou // The C/C++ atomics MCM requires that two loads to the same address maintain program order. 67*4d24c305SYikeZhou // The Cortex A9 does NOT enforce load/load ordering (which leads to buggy behavior). 68*4d24c305SYikeZhou val MCM_ORDER_DEPENDENT_LOADS = true 69*4d24c305SYikeZhou 70*4d24c305SYikeZhou val jal_opc = (0x6f).U 71*4d24c305SYikeZhou val jalr_opc = (0x67).U 72*4d24c305SYikeZhou 73*4d24c305SYikeZhou def GetUop(inst: UInt): UInt = inst(6,0) 74*4d24c305SYikeZhou def GetRd (inst: UInt): UInt = inst(RD_MSB,RD_LSB) 75*4d24c305SYikeZhou def GetRs1(inst: UInt): UInt = inst(RS1_MSB,RS1_LSB) 76*4d24c305SYikeZhou 77*4d24c305SYikeZhou // Note: Accepts only EXPANDED rvc instructions 78*4d24c305SYikeZhou def ComputeBranchTarget(pc: UInt, inst: UInt, xlen: Int)(implicit p: Parameters): UInt = { 79*4d24c305SYikeZhou val b_imm32 = Cat(Fill(20,inst(31)), inst(7), inst(30,25), inst(11,8), 0.U(1.W)) 80*4d24c305SYikeZhou ((pc.asSInt + b_imm32.asSInt).asSInt & (-2).S).asUInt 81*4d24c305SYikeZhou } 82*4d24c305SYikeZhou 83*4d24c305SYikeZhou // Note: Accepts only EXPANDED rvc instructions 84*4d24c305SYikeZhou def ComputeJALTarget(pc: UInt, inst: UInt, xlen: Int)(implicit p: Parameters): UInt = { 85*4d24c305SYikeZhou val j_imm32 = Cat(Fill(12,inst(31)), inst(19,12), inst(20), inst(30,25), inst(24,21), 0.U(1.W)) 86*4d24c305SYikeZhou ((pc.asSInt + j_imm32.asSInt).asSInt & (-2).S).asUInt 87*4d24c305SYikeZhou } 88*4d24c305SYikeZhou} 89*4d24c305SYikeZhou 90be25371aSYikeZhou/** 91be25371aSYikeZhou * Decoded control signals 92*4d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 93be25371aSYikeZhou */ 94*4d24c305SYikeZhou// FIXME Check sig from isXSTrap to isRVF 95be25371aSYikeZhou/** 96be25371aSYikeZhou * Decode constants for RV64 97be25371aSYikeZhou */ 98be25371aSYikeZhouobject X64Decode extends DecodeConstants { 99*4d24c305SYikeZhou val table: Array[(BitPat, List[BitPat])] = Array( 100*4d24c305SYikeZhou LD -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.ld, Y, N, N, N, N, N, N), 101*4d24c305SYikeZhou LWU -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lwu, Y, N, N, N, N, N, N), 102*4d24c305SYikeZhou SD -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.stu, LSUOpType.sd, N, N, N, N, N, N, N), 103*4d24c305SYikeZhou 104*4d24c305SYikeZhou SLLI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sll, Y, N, N, N, N, N, N), 105*4d24c305SYikeZhou SRLI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.srl, Y, N, N, N, N, N, N), 106*4d24c305SYikeZhou SRAI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sra, Y, N, N, N, N, N, N), 107*4d24c305SYikeZhou 108*4d24c305SYikeZhou ADDIW -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.addw, Y, N, N, N, N, N, N), 109*4d24c305SYikeZhou SLLIW -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sllw, Y, N, N, N, N, N, N), 110*4d24c305SYikeZhou SRAIW -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sraw, Y, N, N, N, N, N, N), 111*4d24c305SYikeZhou SRLIW -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.srlw, Y, N, N, N, N, N, N), 112*4d24c305SYikeZhou 113*4d24c305SYikeZhou ADDW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.addw, Y, N, N, N, N, N, N), 114*4d24c305SYikeZhou SUBW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.subw, Y, N, N, N, N, N, N), 115*4d24c305SYikeZhou SLLW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sllw, Y, N, N, N, N, N, N), 116*4d24c305SYikeZhou SRAW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sraw, Y, N, N, N, N, N, N), 117*4d24c305SYikeZhou SRLW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.srlw, Y, N, N, N, N, N, N) 118*4d24c305SYikeZhou ) 119be25371aSYikeZhou} 120be25371aSYikeZhou 121be25371aSYikeZhou/** 122be25371aSYikeZhou * Overall Decode constants 123be25371aSYikeZhou */ 124be25371aSYikeZhouobject XDecode extends DecodeConstants { 125*4d24c305SYikeZhou val table: Array[(BitPat, List[BitPat])] = Array( 126*4d24c305SYikeZhou LW -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lw, Y, N, N, N, N, N, N), 127*4d24c305SYikeZhou LH -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lh, Y, N, N, N, N, N, N), 128*4d24c305SYikeZhou LHU -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lhu, Y, N, N, N, N, N, N), 129*4d24c305SYikeZhou LB -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lb, Y, N, N, N, N, N, N), 130*4d24c305SYikeZhou LBU -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.lbu, Y, N, N, N, N, N, N), 131*4d24c305SYikeZhou 132*4d24c305SYikeZhou SW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.stu, LSUOpType.sw, N, N, N, N, N, N, N), 133*4d24c305SYikeZhou SH -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.stu, LSUOpType.sh, N, N, N, N, N, N, N), 134*4d24c305SYikeZhou SB -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.stu, LSUOpType.sb, N, N, N, N, N, N, N), 135*4d24c305SYikeZhou 136*4d24c305SYikeZhou LUI -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.add, Y, N, N, N, N, N, N), 137*4d24c305SYikeZhou 138*4d24c305SYikeZhou ADDI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.add, Y, N, N, N, N, N, N), 139*4d24c305SYikeZhou ANDI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.and, Y, N, N, N, N, N, N), 140*4d24c305SYikeZhou ORI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.or, Y, N, N, N, N, N, N), 141*4d24c305SYikeZhou XORI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.xor, Y, N, N, N, N, N, N), 142*4d24c305SYikeZhou SLTI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.slt, Y, N, N, N, N, N, N), 143*4d24c305SYikeZhou SLTIU -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sltu, Y, N, N, N, N, N, N), 144*4d24c305SYikeZhou 145*4d24c305SYikeZhou SLL -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sll, Y, N, N, N, N, N, N), 146*4d24c305SYikeZhou ADD -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.add, Y, N, N, N, N, N, N), 147*4d24c305SYikeZhou SUB -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sub, Y, N, N, N, N, N, N), 148*4d24c305SYikeZhou SLT -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.slt, Y, N, N, N, N, N, N), 149*4d24c305SYikeZhou SLTU -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sltu, Y, N, N, N, N, N, N), 150*4d24c305SYikeZhou AND -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.and, Y, N, N, N, N, N, N), 151*4d24c305SYikeZhou OR -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.or, Y, N, N, N, N, N, N), 152*4d24c305SYikeZhou XOR -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.xor, Y, N, N, N, N, N, N), 153*4d24c305SYikeZhou SRA -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.sra, Y, N, N, N, N, N, N), 154*4d24c305SYikeZhou SRL -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.srl, Y, N, N, N, N, N, N), 155*4d24c305SYikeZhou 156*4d24c305SYikeZhou MUL -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mul, Y, N, N, N, N, N, N), 157*4d24c305SYikeZhou MULH -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mulh, Y, N, N, N, N, N, N), 158*4d24c305SYikeZhou MULHU -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mulhu, Y, N, N, N, N, N, N), 159*4d24c305SYikeZhou MULHSU -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mulhsu, Y, N, N, N, N, N, N), 160*4d24c305SYikeZhou MULW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mul, MDUOpType.mulw, Y, N, N, N, N, N, N), 161*4d24c305SYikeZhou 162*4d24c305SYikeZhou DIV -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.div, Y, N, N, N, N, N, N), 163*4d24c305SYikeZhou DIVU -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.divu, Y, N, N, N, N, N, N), 164*4d24c305SYikeZhou REM -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.rem, Y, N, N, N, N, N, N), 165*4d24c305SYikeZhou REMU -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.remu, Y, N, N, N, N, N, N), 166*4d24c305SYikeZhou DIVW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.divw, Y, N, N, N, N, N, N), 167*4d24c305SYikeZhou DIVUW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.divuw, Y, N, N, N, N, N, N), 168*4d24c305SYikeZhou REMW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.remw, Y, N, N, N, N, N, N), 169*4d24c305SYikeZhou REMUW -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.div, MDUOpType.remuw, Y, N, N, N, N, N, N), 170*4d24c305SYikeZhou 171*4d24c305SYikeZhou AUIPC -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.add, Y, N, N, N, N, N, N), 172*4d24c305SYikeZhou JAL -> List(SrcType.pc , SrcType.imm, SrcType.DC, FuType.jmp, JumpOpType.jal, Y, N, N, N, N, N, N), 173*4d24c305SYikeZhou JALR -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.jmp, JumpOpType.jalr, Y, N, N, N, N, N, N), 174*4d24c305SYikeZhou BEQ -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.beq, N, N, N, N, N, N, N), 175*4d24c305SYikeZhou BNE -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.bne, N, N, N, N, N, N, N), 176*4d24c305SYikeZhou BGE -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.bge, N, N, N, N, N, N, N), 177*4d24c305SYikeZhou BGEU -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.bgeu, N, N, N, N, N, N, N), 178*4d24c305SYikeZhou BLT -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.blt, N, N, N, N, N, N, N), 179*4d24c305SYikeZhou BLTU -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.alu, ALUOpType.bltu, N, N, N, N, N, N, N), 180*4d24c305SYikeZhou 181*4d24c305SYikeZhou // I-type, the immediate12 holds the CSR register. 182*4d24c305SYikeZhou CSRRW -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.wrt, N, N, N, N, N, N, N), 183*4d24c305SYikeZhou CSRRS -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.set, N, N, N, N, N, N, N), 184*4d24c305SYikeZhou CSRRC -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.clr, N, N, N, N, N, N, N), 185*4d24c305SYikeZhou 186*4d24c305SYikeZhou CSRRWI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.wrti, N, N, N, N, N, N, N), 187*4d24c305SYikeZhou CSRRSI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.seti, N, N, N, N, N, N, N), 188*4d24c305SYikeZhou CSRRCI -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.clri, N, N, N, N, N, N, N), 189*4d24c305SYikeZhou 190*4d24c305SYikeZhou SFENCE_VMA->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.fence, FenceOpType.sfence, N, N, N, N, N, N, N), 191*4d24c305SYikeZhou SCALL -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.jmp, N, N, N, N, N, N, N), // same as ECALL 192*4d24c305SYikeZhou SRET -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.jmp, N, N, N, N, N, N, N), 193*4d24c305SYikeZhou MRET -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.csr, CSROpType.jmp, N, N, N, N, N, N, N), 194*4d24c305SYikeZhou 195*4d24c305SYikeZhou WFI -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.sll, N, N, N, N, N, N, N), 196*4d24c305SYikeZhou 197*4d24c305SYikeZhou FENCE_I -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.fence, FenceOpType.fencei, N, N, N, N, N, N, N), 198*4d24c305SYikeZhou FENCE -> List(SrcType.pc, SrcType.imm, SrcType.DC, FuType.fence, FenceOpType.fence, N, N, N, N, N, N, N), 199*4d24c305SYikeZhou 200*4d24c305SYikeZhou // A-type 201*4d24c305SYikeZhou AMOADD_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoadd_w, N, N, N, N, N, N, N), 202*4d24c305SYikeZhou AMOXOR_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoxor_w, N, N, N, N, N, N, N), 203*4d24c305SYikeZhou AMOSWAP_W->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoswap_w, N, N, N, N, N, N, N), 204*4d24c305SYikeZhou AMOAND_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoand_w, N, N, N, N, N, N, N), 205*4d24c305SYikeZhou AMOOR_W -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoor_w, N, N, N, N, N, N, N), 206*4d24c305SYikeZhou AMOMIN_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomin_w, N, N, N, N, N, N, N), 207*4d24c305SYikeZhou AMOMINU_W->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amominu_w, N, N, N, N, N, N, N), 208*4d24c305SYikeZhou AMOMAX_W-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomax_w, N, N, N, N, N, N, N), 209*4d24c305SYikeZhou AMOMAXU_W->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomaxu_w, N, N, N, N, N, N, N), 210*4d24c305SYikeZhou 211*4d24c305SYikeZhou AMOADD_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoadd_d, N, N, N, N, N, N, N), 212*4d24c305SYikeZhou AMOXOR_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoxor_d, N, N, N, N, N, N, N), 213*4d24c305SYikeZhou AMOSWAP_D->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoswap_d, N, N, N, N, N, N, N), 214*4d24c305SYikeZhou AMOAND_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoand_d, N, N, N, N, N, N, N), 215*4d24c305SYikeZhou AMOOR_D -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amoor_d, N, N, N, N, N, N, N), 216*4d24c305SYikeZhou AMOMIN_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomin_d, N, N, N, N, N, N, N), 217*4d24c305SYikeZhou AMOMINU_D->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amominu_d, N, N, N, N, N, N, N), 218*4d24c305SYikeZhou AMOMAX_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomax_d, N, N, N, N, N, N, N), 219*4d24c305SYikeZhou AMOMAXU_D->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.amomaxu_d, N, N, N, N, N, N, N), 220*4d24c305SYikeZhou 221*4d24c305SYikeZhou LR_W -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.mou, LSUOpType.lr_w, N, N, N, N, N, N, N), 222*4d24c305SYikeZhou LR_D -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.mou, LSUOpType.lr_d, N, N, N, N, N, N, N), 223*4d24c305SYikeZhou SC_W -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.sc_w, N, N, N, N, N, N, N), 224*4d24c305SYikeZhou SC_D -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.mou, LSUOpType.sc_d, N, N, N, N, N, N, N) 225*4d24c305SYikeZhou ) 226be25371aSYikeZhou} 227be25371aSYikeZhou 228be25371aSYikeZhou/** 229be25371aSYikeZhou * FP Decode constants 230be25371aSYikeZhou */ 231be25371aSYikeZhouobject FDecode extends DecodeConstants{ 232*4d24c305SYikeZhou val table: Array[(BitPat, List[BitPat])] = Array( 233*4d24c305SYikeZhou // FIXME check Src3type below 234*4d24c305SYikeZhou FLW -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.flw, N, N, N, N, N, N, N), 235*4d24c305SYikeZhou FLD -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.ldu, LSUOpType.ld, N, N, N, N, N, N, N), 236*4d24c305SYikeZhou FSW -> List(SrcType.reg, SrcType.fp, SrcType.DC, FuType.stu, LSUOpType.sw, N, N, N, N, N, N, N), // sort of a lie; broken into two micro-ops 237*4d24c305SYikeZhou FSD -> List(SrcType.reg, SrcType.fp, SrcType.DC, FuType.stu, LSUOpType.sd, N, N, N, N, N, N, N), 238*4d24c305SYikeZhou 239*4d24c305SYikeZhou FCLASS_S-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fclass, N, N, N, N, N, N, N), 240*4d24c305SYikeZhou FCLASS_D-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fclass, N, N, N, N, N, N, N), 241*4d24c305SYikeZhou 242*4d24c305SYikeZhou FMV_D_X -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.fmv_i2f, N, N, N, N, N, N, N), 243*4d24c305SYikeZhou FMV_X_D -> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fmv_f2i, N, N, N, N, N, N, N), 244*4d24c305SYikeZhou FMV_X_W -> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fmv_f2i, N, N, N, N, N, N, N), 245*4d24c305SYikeZhou FMV_W_X -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.fmv_i2f, N, N, N, N, N, N, N), 246*4d24c305SYikeZhou 247*4d24c305SYikeZhou FSGNJ_S -> List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fsgnj, N, N, N, N, N, N, N), 248*4d24c305SYikeZhou FSGNJ_D -> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fsgnj, N, N, N, N, N, N, N), 249*4d24c305SYikeZhou FSGNJX_S-> List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fsgnjx, N, N, N, N, N, N, N), 250*4d24c305SYikeZhou FSGNJX_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fsgnjx, N, N, N, N, N, N, N), 251*4d24c305SYikeZhou FSGNJN_S-> List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fsgnjn, N, N, N, N, N, N, N), 252*4d24c305SYikeZhou FSGNJN_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fsgnjn, N, N, N, N, N, N, N), 253*4d24c305SYikeZhou 254*4d24c305SYikeZhou // FP to FP 255*4d24c305SYikeZhou FCVT_S_D-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.d2s, N, N, N, N, N, N, N), 256*4d24c305SYikeZhou FCVT_D_S-> List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.s2d, N, N, N, N, N, N, N), 257*4d24c305SYikeZhou 258*4d24c305SYikeZhou // Int to FP 259*4d24c305SYikeZhou FCVT_S_W-> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.w2f, N, N, N, N, N, N, N), 260*4d24c305SYikeZhou FCVT_S_WU->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.wu2f, N, N, N, N, N, N, N), 261*4d24c305SYikeZhou FCVT_S_L-> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.l2f, N, N, N, N, N, N, N), 262*4d24c305SYikeZhou FCVT_S_LU->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.lu2f, N, N, N, N, N, N, N), 263*4d24c305SYikeZhou 264*4d24c305SYikeZhou FCVT_D_W-> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.w2f, N, N, N, N, N, N, N), 265*4d24c305SYikeZhou FCVT_D_WU->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.wu2f, N, N, N, N, N, N, N), 266*4d24c305SYikeZhou FCVT_D_L-> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.l2f, N, N, N, N, N, N, N), 267*4d24c305SYikeZhou FCVT_D_LU->List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.i2f, FPUOpType.lu2f, N, N, N, N, N, N, N), 268*4d24c305SYikeZhou 269*4d24c305SYikeZhou // FP to Int 270*4d24c305SYikeZhou FCVT_W_S-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2w, N, N, N, N, N, N, N), 271*4d24c305SYikeZhou FCVT_WU_S->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2wu, N, N, N, N, N, N, N), 272*4d24c305SYikeZhou FCVT_L_S-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2l, N, N, N, N, N, N, N), 273*4d24c305SYikeZhou FCVT_LU_S->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2lu, N, N, N, N, N, N, N), 274*4d24c305SYikeZhou 275*4d24c305SYikeZhou FCVT_W_D-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2w, N, N, N, N, N, N, N), 276*4d24c305SYikeZhou FCVT_WU_D->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2wu, N, N, N, N, N, N, N), 277*4d24c305SYikeZhou FCVT_L_D-> List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2l, N, N, N, N, N, N, N), 278*4d24c305SYikeZhou FCVT_LU_D->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.f2lu, N, N, N, N, N, N, N), 279*4d24c305SYikeZhou 280*4d24c305SYikeZhou // "fp_single" is used for wb_data formatting (and debugging) 281*4d24c305SYikeZhou FEQ_S ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.feq, N, N, N, N, N, N, N), 282*4d24c305SYikeZhou FLT_S ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.flt, N, N, N, N, N, N, N), 283*4d24c305SYikeZhou FLE_S ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fle, N, N, N, N, N, N, N), 284*4d24c305SYikeZhou 285*4d24c305SYikeZhou FEQ_D ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.feq, N, N, N, N, N, N, N), 286*4d24c305SYikeZhou FLT_D ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.flt, N, N, N, N, N, N, N), 287*4d24c305SYikeZhou FLE_D ->List(SrcType.fp , SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fle, N, N, N, N, N, N, N), 288*4d24c305SYikeZhou 289*4d24c305SYikeZhou FMIN_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fmin, N, N, N, N, N, N, N), 290*4d24c305SYikeZhou FMAX_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fmax, N, N, N, N, N, N, N), 291*4d24c305SYikeZhou FMIN_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fmin, N, N, N, N, N, N, N), 292*4d24c305SYikeZhou FMAX_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fmax, N, N, N, N, N, N, N), 293*4d24c305SYikeZhou 294*4d24c305SYikeZhou FADD_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fadd, N, N, N, N, N, N, N), 295*4d24c305SYikeZhou FSUB_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fsub, N, N, N, N, N, N, N), 296*4d24c305SYikeZhou FMUL_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fmul, N, N, N, N, N, N, N), 297*4d24c305SYikeZhou FADD_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fadd, N, N, N, N, N, N, N), 298*4d24c305SYikeZhou FSUB_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fsub, N, N, N, N, N, N, N), 299*4d24c305SYikeZhou FMUL_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fmul, N, N, N, N, N, N, N), 300*4d24c305SYikeZhou 301*4d24c305SYikeZhou FMADD_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fmadd, N, N, N, N, N, N, N), 302*4d24c305SYikeZhou FMSUB_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fmsub, N, N, N, N, N, N, N), 303*4d24c305SYikeZhou FNMADD_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fnmadd, N, N, N, N, N, N, N), 304*4d24c305SYikeZhou FNMSUB_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmac, FPUOpType.fnmsub, N, N, N, N, N, N, N), 305*4d24c305SYikeZhou FMADD_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fmadd, N, N, N, N, N, N, N), 306*4d24c305SYikeZhou FMSUB_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fmsub, N, N, N, N, N, N, N), 307*4d24c305SYikeZhou FNMADD_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fnmadd, N, N, N, N, N, N, N), 308*4d24c305SYikeZhou FNMSUB_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmac, FPUOpType.fnmsub, N, N, N, N, N, N, N) 309*4d24c305SYikeZhou 310*4d24c305SYikeZhou ) 311be25371aSYikeZhou} 312be25371aSYikeZhou 313be25371aSYikeZhou/** 314be25371aSYikeZhou * FP Divide SquareRoot Constants 315be25371aSYikeZhou */ 316be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 317*4d24c305SYikeZhou val table: Array[(BitPat, List[BitPat])] = Array( 318*4d24c305SYikeZhou FDIV_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fdiv, N, N, N, N, N, N, N), 319*4d24c305SYikeZhou FDIV_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fdiv, N, N, N, N, N, N, N), 320*4d24c305SYikeZhou FSQRT_S ->List(SrcType.fp, SrcType.fp, SrcType.DC, FuType.fmisc, FPUOpType.fsqrt, N, N, N, N, N, N, N), 321*4d24c305SYikeZhou FSQRT_D ->List(SrcType.reg, SrcType.reg, SrcType.DC, FuType.fmisc, FPUOpType.fsqrt, N, N, N, N, N, N, N) 322*4d24c305SYikeZhou 323*4d24c305SYikeZhou ) 324be25371aSYikeZhou} 325be25371aSYikeZhou 326*4d24c305SYikeZhou/** 327*4d24c305SYikeZhou * XiangShan Trap Decode constants 328*4d24c305SYikeZhou */ 329*4d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 330*4d24c305SYikeZhou // calculate as ADDI => addi zero, a0, 0 331*4d24c305SYikeZhou // replace rs '?????' with '01010'(a0) in decode stage 332*4d24c305SYikeZhou def lsrc1 = "b01010".U // $a0 333*4d24c305SYikeZhou val table: Array[(BitPat, List[BitPat])] = Array( 334*4d24c305SYikeZhou TRAP -> List(SrcType.reg, SrcType.imm, SrcType.DC, FuType.alu, ALUOpType.add, N, N, N, N, N, N, N) 335*4d24c305SYikeZhou ) 336*4d24c305SYikeZhou} 337be25371aSYikeZhou 338*4d24c305SYikeZhouclass RVCExpander extends XSModule { 339*4d24c305SYikeZhou val io = IO(new Bundle { 340*4d24c305SYikeZhou val in = Input(UInt(32.W)) 341*4d24c305SYikeZhou val out = Output(new ExpandedInstruction) 342*4d24c305SYikeZhou val rvc = Output(Bool()) 343*4d24c305SYikeZhou }) 344be25371aSYikeZhou 345*4d24c305SYikeZhou if (HasCExtension) { 346*4d24c305SYikeZhou io.rvc := io.in(1,0) =/= 3.U 347*4d24c305SYikeZhou io.out := new RVCDecoder(io.in, XLEN).decode 348*4d24c305SYikeZhou } else { 349*4d24c305SYikeZhou io.rvc := false.B 350*4d24c305SYikeZhou io.out := new RVCDecoder(io.in, XLEN).passthrough 351*4d24c305SYikeZhou } 352*4d24c305SYikeZhou} 353be25371aSYikeZhou 354be25371aSYikeZhou/** 355be25371aSYikeZhou * IO bundle for the Decode unit 356be25371aSYikeZhou */ 357be25371aSYikeZhouclass DecodeUnitIO extends XSBundle { 358be25371aSYikeZhou val enq = new Bundle { val ctrl_flow = Input(new CtrlFlow) } 359be25371aSYikeZhou val deq = new Bundle { val cf_ctrl = Output(new CfCtrl) } 360be25371aSYikeZhou} 361be25371aSYikeZhou 362be25371aSYikeZhou/** 363be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 364be25371aSYikeZhou */ 365*4d24c305SYikeZhouclass DecodeUnit extends XSModule with RISCVConstants { 366be25371aSYikeZhou val io = IO(new DecodeUnitIO) 367be25371aSYikeZhou 368*4d24c305SYikeZhou val ctrl_flow = Wire(new CtrlFlow) // input with RVC Expanded 369*4d24c305SYikeZhou val cf_ctrl = Wire(new CfCtrl) 370*4d24c305SYikeZhou 371*4d24c305SYikeZhou // FIXME add expander 372*4d24c305SYikeZhou val exp = Module(new RVCExpander()) // FIXME Is empty really worked here? 373*4d24c305SYikeZhou exp.io.in := io.enq.ctrl_flow.instr 374be25371aSYikeZhou ctrl_flow := io.enq.ctrl_flow 375*4d24c305SYikeZhou when (exp.io.rvc) { 376*4d24c305SYikeZhou ctrl_flow.instr := exp.io.out.bits 377*4d24c305SYikeZhou } 378be25371aSYikeZhou 379*4d24c305SYikeZhou // save rvc decode info 380*4d24c305SYikeZhou val rvc_info = Wire(new ExpandedInstruction()) 381*4d24c305SYikeZhou val is_rvc = Wire(Bool()) 382*4d24c305SYikeZhou rvc_info := exp.io.out 383*4d24c305SYikeZhou is_rvc := exp.io.rvc 384be25371aSYikeZhou 385*4d24c305SYikeZhou var decode_table = XDecode.table ++ FDecode.table ++ FDivSqrtDecode.table ++ X64Decode.table ++ XSTrapDecode.table 386be25371aSYikeZhou 387*4d24c305SYikeZhou // output 388*4d24c305SYikeZhou cf_ctrl.cf := ctrl_flow 389*4d24c305SYikeZhou cf_ctrl.brTag := DontCare 390*4d24c305SYikeZhou val cs = Wire(new CtrlSignals()).decode(ctrl_flow.instr, decode_table) 391be25371aSYikeZhou 392*4d24c305SYikeZhou when (is_rvc) { 393*4d24c305SYikeZhou cs.lsrc1 := rvc_info.rs1 394*4d24c305SYikeZhou cs.lsrc2 := rvc_info.rs2 395*4d24c305SYikeZhou cs.lsrc3 := rvc_info.rs3 396be25371aSYikeZhou 397*4d24c305SYikeZhou cs.ldest := rvc_info.rd 398*4d24c305SYikeZhou 399*4d24c305SYikeZhou } .otherwise { 400*4d24c305SYikeZhou cs.lsrc1 := ctrl_flow.instr(RS1_MSB,RS1_LSB) 401*4d24c305SYikeZhou cs.lsrc2 := ctrl_flow.instr(RS2_MSB,RS2_LSB) 402*4d24c305SYikeZhou cs.lsrc3 := ctrl_flow.instr(RS3_MSB,RS3_LSB) 403*4d24c305SYikeZhou 404*4d24c305SYikeZhou cs.ldest := ctrl_flow.instr(RD_MSB,RD_LSB) 405*4d24c305SYikeZhou } 406*4d24c305SYikeZhou 407*4d24c305SYikeZhou // TODO fill exp, intr Vec in CtrlFlow 408*4d24c305SYikeZhou io.deq.cf_ctrl.cf.exceptionVec := io.enq.ctrl_flow.exceptionVec 409*4d24c305SYikeZhou io.deq.cf_ctrl.cf.intrVec := io.enq.ctrl_flow.intrVec 410*4d24c305SYikeZhou 411*4d24c305SYikeZhou // TODO fill imm 412*4d24c305SYikeZhou cs.imm := DontCare 413*4d24c305SYikeZhou 414*4d24c305SYikeZhou cf_ctrl.ctrl := cs 415*4d24c305SYikeZhou io.deq.cf_ctrl := cf_ctrl 416be25371aSYikeZhou 417be25371aSYikeZhou //------------------------------------------------------------- 418be25371aSYikeZhou // Debug Info 419*4d24c305SYikeZhou XSDebug("in: instr=%x pc=%x excepVec=%b intrVec=%b crossPageIPFFix=%d\n", 420*4d24c305SYikeZhou io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 421*4d24c305SYikeZhou io.enq.ctrl_flow.intrVec.asUInt, io.enq.ctrl_flow.crossPageIPFFix) 422*4d24c305SYikeZhou XSDebug("out: src1Type=%b src2Type=%b src3Type=%b lsrc1=%d lsrc2=%d lsrc3=%d ldest=%d fuType=%b fuOpType=%b\n", 423*4d24c305SYikeZhou io.deq.cf_ctrl.ctrl.src1Type, io.deq.cf_ctrl.ctrl.src2Type, io.deq.cf_ctrl.ctrl.src3Type, 424*4d24c305SYikeZhou io.deq.cf_ctrl.ctrl.lsrc1, io.deq.cf_ctrl.ctrl.lsrc2, io.deq.cf_ctrl.ctrl.lsrc3, 425*4d24c305SYikeZhou io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 426*4d24c305SYikeZhou XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d isRVF=%d imm=%x\n", 427*4d24c305SYikeZhou io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 428*4d24c305SYikeZhou io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 429*4d24c305SYikeZhou io.deq.cf_ctrl.ctrl.isRVF, io.deq.cf_ctrl.ctrl.imm) 430be25371aSYikeZhou} 431