1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 17be25371aSYikeZhoupackage xiangshan.backend.decode 18be25371aSYikeZhou 192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters 20be25371aSYikeZhouimport chisel3._ 21be25371aSYikeZhouimport chisel3.util._ 223b739f49SXuan Huimport freechips.rocketchip.rocket.Instructions._ 236ab6918fSYinan Xuimport freechips.rocketchip.util.uintToBitPat 243c02ee8fSwakafaimport utility._ 253b739f49SXuan Huimport utils._ 266ab6918fSYinan Xuimport xiangshan.ExceptionNO.illegalInstr 276ab6918fSYinan Xuimport xiangshan._ 28730cfbc0SXuan Huimport xiangshan.backend.fu.FuType 29730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DecodedInst, DynInst, StaticInst} 305c1681d0SXuan Huimport xiangshan.backend.decode.isa.bitfield.{InstVType, XSInstBitFields} 3142475509SXuan Huimport xiangshan.backend.fu.vector.Bundles.{Category, VType} 32be25371aSYikeZhou 33be25371aSYikeZhou/** 34be25371aSYikeZhou * Abstract trait giving defaults and other relevant values to different Decode constants/ 35be25371aSYikeZhou */ 36be25371aSYikeZhouabstract trait DecodeConstants { 37361e6d51SJiuyang Liu // This X should be used only in 1-bit signal. Otherwise, use BitPat("b???") to align with the width of UInt. 3857a10886SXuan Hu def X = BitPat("b0") 394d24c305SYikeZhou def N = BitPat("b0") 404d24c305SYikeZhou def Y = BitPat("b1") 4157a10886SXuan Hu def T = true 4257a10886SXuan Hu def F = false 434d24c305SYikeZhou 44c2a8ae00SYikeZhou def decodeDefault: List[BitPat] = // illegal instruction 4520e31bd1SYinan Xu // srcType(0) srcType(1) srcType(2) fuType fuOpType rfWen 464d24c305SYikeZhou // | | | | | | fpWen 4757a10886SXuan Hu // | | | | | | | vecWen 4857a10886SXuan Hu // | | | | | | | | isXSTrap 4957a10886SXuan Hu // | | | | | | | | | noSpecExec 5057a10886SXuan Hu // | | | | | | | | | | blockBackward 5157a10886SXuan Hu // | | | | | | | | | | | flushPipe 52*89cc69c1STang Haojin // | | | | | | | | | | | | canRobCompress 53*89cc69c1STang Haojin // | | | | | | | | | | | | | uopSplitType 54*89cc69c1STang Haojin // | | | | | | | | | | | | | | selImm 55*89cc69c1STang Haojin List(SrcType.X, SrcType.X, SrcType.X, FuType.X, FuOpType.X, N, N, N, N, N, N, N, N, UopSplitType.X, SelImm.INVALID_INSTR) // Use SelImm to indicate invalid instr 564d24c305SYikeZhou 5757a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] 5857a10886SXuan Hu final def table: Array[(BitPat, List[BitPat])] = decodeArray.map(x => (x._1, x._2.generate())) 59be25371aSYikeZhou} 60be25371aSYikeZhou 61c2a8ae00SYikeZhoutrait DecodeUnitConstants 624d24c305SYikeZhou{ 634d24c305SYikeZhou // abstract out instruction decode magic numbers 644d24c305SYikeZhou val RD_MSB = 11 654d24c305SYikeZhou val RD_LSB = 7 664d24c305SYikeZhou val RS1_MSB = 19 674d24c305SYikeZhou val RS1_LSB = 15 684d24c305SYikeZhou val RS2_MSB = 24 694d24c305SYikeZhou val RS2_LSB = 20 704d24c305SYikeZhou val RS3_MSB = 31 714d24c305SYikeZhou val RS3_LSB = 27 724d24c305SYikeZhou} 734d24c305SYikeZhou 74be25371aSYikeZhou/** 75be25371aSYikeZhou * Decoded control signals 764d24c305SYikeZhou * See xiangshan/package.scala, xiangshan/backend/package.scala, Bundle.scala 77be25371aSYikeZhou */ 78c2a8ae00SYikeZhou 7957a10886SXuan Huabstract class XSDecodeBase { 8057a10886SXuan Hu def X = BitPat("b?") 8157a10886SXuan Hu def N = BitPat("b0") 8257a10886SXuan Hu def Y = BitPat("b1") 8357a10886SXuan Hu def T = true 8457a10886SXuan Hu def F = false 8557a10886SXuan Hu def generate() : List[BitPat] 8657a10886SXuan Hu} 8757a10886SXuan Hu 8857a10886SXuan Hucase class XSDecode( 8957a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 903b739f49SXuan Hu fu: Int, fuOp: BitPat, selImm: BitPat, 91e2695e90SzhanglyGit uopSplitType: BitPat = UopSplitType.X, 9257a10886SXuan Hu xWen: Boolean = false, 9357a10886SXuan Hu fWen: Boolean = false, 9457a10886SXuan Hu vWen: Boolean = false, 9557a10886SXuan Hu mWen: Boolean = false, 9657a10886SXuan Hu xsTrap: Boolean = false, 9757a10886SXuan Hu noSpec: Boolean = false, 9857a10886SXuan Hu blockBack: Boolean = false, 9957a10886SXuan Hu flushPipe: Boolean = false, 100*89cc69c1STang Haojin canRobCompress: Boolean = false, 10157a10886SXuan Hu) extends XSDecodeBase { 10257a10886SXuan Hu def generate() : List[BitPat] = { 103*89cc69c1STang Haojin List (src1, src2, src3, BitPat(fu.U(FuType.num.W)), fuOp, xWen.B, fWen.B, (vWen || mWen).B, xsTrap.B, noSpec.B, blockBack.B, flushPipe.B, canRobCompress.B, uopSplitType, selImm) 10457a10886SXuan Hu } 10557a10886SXuan Hu} 10657a10886SXuan Hu 10757a10886SXuan Hucase class FDecode( 10857a10886SXuan Hu src1: BitPat, src2: BitPat, src3: BitPat, 1093b739f49SXuan Hu fu: Int, fuOp: BitPat, selImm: BitPat = SelImm.X, 11017ec87f2SXuan Hu uopSplitType: BitPat = UopSplitType.X, 11157a10886SXuan Hu xWen: Boolean = false, 11257a10886SXuan Hu fWen: Boolean = false, 11357a10886SXuan Hu vWen: Boolean = false, 11457a10886SXuan Hu mWen: Boolean = false, 11557a10886SXuan Hu xsTrap: Boolean = false, 11657a10886SXuan Hu noSpec: Boolean = false, 11757a10886SXuan Hu blockBack: Boolean = false, 11857a10886SXuan Hu flushPipe: Boolean = false, 119*89cc69c1STang Haojin canRobCompress: Boolean = false, 12057a10886SXuan Hu) extends XSDecodeBase { 12157a10886SXuan Hu def generate() : List[BitPat] = { 122*89cc69c1STang Haojin XSDecode(src1, src2, src3, fu, fuOp, selImm, uopSplitType, xWen, fWen, vWen, mWen, xsTrap, noSpec, blockBack, flushPipe, canRobCompress).generate() 12357a10886SXuan Hu } 12457a10886SXuan Hu} 12557a10886SXuan Hu 126be25371aSYikeZhou/** 127be25371aSYikeZhou * Decode constants for RV64 128be25371aSYikeZhou */ 129be25371aSYikeZhouobject X64Decode extends DecodeConstants { 13057a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 13157a10886SXuan Hu LD -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld , SelImm.IMM_I, xWen = T), 13257a10886SXuan Hu LWU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lwu , SelImm.IMM_I, xWen = T), 13357a10886SXuan Hu SD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sd , SelImm.IMM_S ), 1344d24c305SYikeZhou 135*89cc69c1STang Haojin SLLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.IMM_I, xWen = T, canRobCompress = T), 136*89cc69c1STang Haojin SRLI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.IMM_I, xWen = T, canRobCompress = T), 137*89cc69c1STang Haojin SRAI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.IMM_I, xWen = T, canRobCompress = T), 1384d24c305SYikeZhou 139*89cc69c1STang Haojin ADDIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.IMM_I, xWen = T, canRobCompress = T), 140*89cc69c1STang Haojin SLLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.IMM_I, xWen = T, canRobCompress = T), 141*89cc69c1STang Haojin SRAIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.IMM_I, xWen = T, canRobCompress = T), 142*89cc69c1STang Haojin SRLIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.IMM_I, xWen = T, canRobCompress = T), 1434d24c305SYikeZhou 144*89cc69c1STang Haojin ADDW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.addw, SelImm.X , xWen = T, canRobCompress = T), 145*89cc69c1STang Haojin SUBW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.subw, SelImm.X , xWen = T, canRobCompress = T), 146*89cc69c1STang Haojin SLLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sllw, SelImm.X , xWen = T, canRobCompress = T), 147*89cc69c1STang Haojin SRAW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sraw, SelImm.X , xWen = T, canRobCompress = T), 148*89cc69c1STang Haojin SRLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srlw, SelImm.X , xWen = T, canRobCompress = T), 149ee8ff153Szfw 150*89cc69c1STang Haojin RORW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rorw, SelImm.X , xWen = T, canRobCompress = T), 151*89cc69c1STang Haojin RORIW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.rorw, SelImm.IMM_I, xWen = T, canRobCompress = T), 152*89cc69c1STang Haojin ROLW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rolw, SelImm.X , xWen = T, canRobCompress = T), 1534d24c305SYikeZhou ) 154be25371aSYikeZhou} 155be25371aSYikeZhou 156be25371aSYikeZhou/** 157be25371aSYikeZhou * Overall Decode constants 158be25371aSYikeZhou */ 159be25371aSYikeZhouobject XDecode extends DecodeConstants { 16057a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 16157a10886SXuan Hu LW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw , SelImm.IMM_I, xWen = T), 16257a10886SXuan Hu LH -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lh , SelImm.IMM_I, xWen = T), 16357a10886SXuan Hu LHU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lhu , SelImm.IMM_I, xWen = T), 16457a10886SXuan Hu LB -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lb , SelImm.IMM_I, xWen = T), 16557a10886SXuan Hu LBU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lbu , SelImm.IMM_I, xWen = T), 16657a10886SXuan Hu SW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sw , SelImm.IMM_S ), 16757a10886SXuan Hu SH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sh , SelImm.IMM_S ), 16857a10886SXuan Hu SB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.stu, LSUOpType.sb , SelImm.IMM_S ), 169*89cc69c1STang Haojin LUI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_U, xWen = T, canRobCompress = T), 170*89cc69c1STang Haojin ADDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add , SelImm.IMM_I, xWen = T, canRobCompress = T), 171*89cc69c1STang Haojin ANDI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.and , SelImm.IMM_I, xWen = T, canRobCompress = T), 172*89cc69c1STang Haojin ORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.or , SelImm.IMM_I, xWen = T, canRobCompress = T), 173*89cc69c1STang Haojin XORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.IMM_I, xWen = T, canRobCompress = T), 174*89cc69c1STang Haojin SLTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.IMM_I, xWen = T, canRobCompress = T), 175*89cc69c1STang Haojin SLTIU -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.IMM_I, xWen = T, canRobCompress = T), 176*89cc69c1STang Haojin SLL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sll , SelImm.X , xWen = T, canRobCompress = T), 177*89cc69c1STang Haojin ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.add , SelImm.X , xWen = T, canRobCompress = T), 178*89cc69c1STang Haojin SUB -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sub , SelImm.X , xWen = T, canRobCompress = T), 179*89cc69c1STang Haojin SLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.slt , SelImm.X , xWen = T, canRobCompress = T), 180*89cc69c1STang Haojin SLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sltu, SelImm.X , xWen = T, canRobCompress = T), 181*89cc69c1STang Haojin AND -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.and , SelImm.X , xWen = T, canRobCompress = T), 182*89cc69c1STang Haojin OR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.or , SelImm.X , xWen = T, canRobCompress = T), 183*89cc69c1STang Haojin XOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xor , SelImm.X , xWen = T, canRobCompress = T), 184*89cc69c1STang Haojin SRA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sra , SelImm.X , xWen = T, canRobCompress = T), 185*89cc69c1STang Haojin SRL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.srl , SelImm.X , xWen = T, canRobCompress = T), 1864d24c305SYikeZhou 187*89cc69c1STang Haojin MUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mul , SelImm.X, xWen = T, canRobCompress = T), 188*89cc69c1STang Haojin MULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulh , SelImm.X, xWen = T, canRobCompress = T), 189*89cc69c1STang Haojin MULHU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhu , SelImm.X, xWen = T, canRobCompress = T), 190*89cc69c1STang Haojin MULHSU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulhsu, SelImm.X, xWen = T, canRobCompress = T), 191*89cc69c1STang Haojin MULW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mul, MDUOpType.mulw , SelImm.X, xWen = T, canRobCompress = T), 1924d24c305SYikeZhou 193*89cc69c1STang Haojin DIV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.div , SelImm.X, xWen = T, canRobCompress = T), 194*89cc69c1STang Haojin DIVU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divu , SelImm.X, xWen = T, canRobCompress = T), 195*89cc69c1STang Haojin REM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.rem , SelImm.X, xWen = T, canRobCompress = T), 196*89cc69c1STang Haojin REMU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remu , SelImm.X, xWen = T, canRobCompress = T), 197*89cc69c1STang Haojin DIVW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divw , SelImm.X, xWen = T, canRobCompress = T), 198*89cc69c1STang Haojin DIVUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.divuw , SelImm.X, xWen = T, canRobCompress = T), 199*89cc69c1STang Haojin REMW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remw , SelImm.X, xWen = T, canRobCompress = T), 200*89cc69c1STang Haojin REMUW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.div, MDUOpType.remuw , SelImm.X, xWen = T, canRobCompress = T), 2014d24c305SYikeZhou 20257a10886SXuan Hu AUIPC -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.auipc, SelImm.IMM_U , xWen = T), 20357a10886SXuan Hu JAL -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jal , SelImm.IMM_UJ, xWen = T), 204e2695e90SzhanglyGit JALR -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.jmp, JumpOpType.jalr , SelImm.IMM_I , uopSplitType = UopSplitType.SCA_SIM, xWen = T), 2053b739f49SXuan Hu BEQ -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.beq , SelImm.IMM_SB ), 2063b739f49SXuan Hu BNE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bne , SelImm.IMM_SB ), 2073b739f49SXuan Hu BGE -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bge , SelImm.IMM_SB ), 2083b739f49SXuan Hu BGEU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bgeu , SelImm.IMM_SB ), 2093b739f49SXuan Hu BLT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.blt , SelImm.IMM_SB ), 2103b739f49SXuan Hu BLTU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.brh, BRUOpType.bltu , SelImm.IMM_SB ), 2114d24c305SYikeZhou 2123b739f49SXuan Hu // I-type, the immediate12 holds the CSR register. 21357a10886SXuan Hu CSRRW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrt , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21457a10886SXuan Hu CSRRS -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.set , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 21557a10886SXuan Hu CSRRC -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clr , SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 2164d24c305SYikeZhou 21757a10886SXuan Hu CSRRWI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.wrti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21857a10886SXuan Hu CSRRSI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.seti, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 21957a10886SXuan Hu CSRRCI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.clri, SelImm.IMM_Z, xWen = T, noSpec = T, blockBack = T), 2204d24c305SYikeZhou 22157a10886SXuan Hu EBREAK -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22257a10886SXuan Hu ECALL -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22357a10886SXuan Hu SRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22457a10886SXuan Hu MRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22557a10886SXuan Hu DRET -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.csr, CSROpType.jmp, SelImm.IMM_I, xWen = T, noSpec = T, blockBack = T), 22657a10886SXuan Hu WFI -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.csr, CSROpType.wfi, SelImm.X , xWen = T, noSpec = T, blockBack = T), 2274d24c305SYikeZhou 22857a10886SXuan Hu SFENCE_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 22957a10886SXuan Hu FENCE_I -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fencei, SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 23057a10886SXuan Hu FENCE -> XSDecode(SrcType.pc , SrcType.imm, SrcType.X, FuType.fence, FenceOpType.fence , SelImm.X, noSpec = T, blockBack = T, flushPipe = T), 2314d24c305SYikeZhou 2324d24c305SYikeZhou // A-type 23357a10886SXuan Hu AMOADD_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23457a10886SXuan Hu AMOXOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23557a10886SXuan Hu AMOSWAP_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 23657a10886SXuan Hu AMOAND_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23757a10886SXuan Hu AMOOR_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23857a10886SXuan Hu AMOMIN_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 23957a10886SXuan Hu AMOMINU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24057a10886SXuan Hu AMOMAX_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_w , SelImm.X, xWen = T, noSpec = T, blockBack = T), 24157a10886SXuan Hu AMOMAXU_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2424d24c305SYikeZhou 24357a10886SXuan Hu AMOADD_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoadd_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24457a10886SXuan Hu AMOXOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoxor_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24557a10886SXuan Hu AMOSWAP_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoswap_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24657a10886SXuan Hu AMOAND_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoand_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24757a10886SXuan Hu AMOOR_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amoor_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24857a10886SXuan Hu AMOMIN_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomin_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 24957a10886SXuan Hu AMOMINU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amominu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25057a10886SXuan Hu AMOMAX_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomax_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25157a10886SXuan Hu AMOMAXU_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.amomaxu_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 2524d24c305SYikeZhou 25357a10886SXuan Hu LR_W -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25457a10886SXuan Hu LR_D -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.mou, LSUOpType.lr_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25557a10886SXuan Hu SC_W -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_w, SelImm.X, xWen = T, noSpec = T, blockBack = T), 25657a10886SXuan Hu SC_D -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.mou, LSUOpType.sc_d, SelImm.X, xWen = T, noSpec = T, blockBack = T), 257ee8ff153Szfw 258*89cc69c1STang Haojin ANDN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.andn, SelImm.X, xWen = T, canRobCompress = T), 259*89cc69c1STang Haojin ORN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.orn , SelImm.X, xWen = T, canRobCompress = T), 260*89cc69c1STang Haojin XNOR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.xnor, SelImm.X, xWen = T, canRobCompress = T), 261*89cc69c1STang Haojin ORC_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.orcb, SelImm.X, xWen = T, canRobCompress = T), 262ee8ff153Szfw 263*89cc69c1STang Haojin MIN -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.min , SelImm.X, xWen = T, canRobCompress = T), 264*89cc69c1STang Haojin MINU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.minu, SelImm.X, xWen = T, canRobCompress = T), 265*89cc69c1STang Haojin MAX -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.max , SelImm.X, xWen = T, canRobCompress = T), 266*89cc69c1STang Haojin MAXU -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.maxu, SelImm.X, xWen = T, canRobCompress = T), 267ee8ff153Szfw 268*89cc69c1STang Haojin SEXT_B -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sextb, SelImm.X, xWen = T, canRobCompress = T), 269*89cc69c1STang Haojin PACKH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packh, SelImm.X, xWen = T, canRobCompress = T), 270*89cc69c1STang Haojin SEXT_H -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.sexth, SelImm.X, xWen = T, canRobCompress = T), 271*89cc69c1STang Haojin PACKW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.packw, SelImm.X, xWen = T, canRobCompress = T), 272*89cc69c1STang Haojin BREV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.revb , SelImm.X, xWen = T, canRobCompress = T), 273*89cc69c1STang Haojin REV8 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.alu, ALUOpType.rev8 , SelImm.X, xWen = T, canRobCompress = T), 274*89cc69c1STang Haojin PACK -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.pack , SelImm.X, xWen = T, canRobCompress = T), 275ee8ff153Szfw 276*89cc69c1STang Haojin BSET -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bset, SelImm.X , xWen = T, canRobCompress = T), 277*89cc69c1STang Haojin BSETI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bset, SelImm.IMM_I, xWen = T, canRobCompress = T), 278*89cc69c1STang Haojin BCLR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bclr, SelImm.X , xWen = T, canRobCompress = T), 279*89cc69c1STang Haojin BCLRI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bclr, SelImm.IMM_I, xWen = T, canRobCompress = T), 280*89cc69c1STang Haojin BINV -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.binv, SelImm.X , xWen = T, canRobCompress = T), 281*89cc69c1STang Haojin BINVI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.binv, SelImm.IMM_I, xWen = T, canRobCompress = T), 282*89cc69c1STang Haojin BEXT -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.bext, SelImm.X , xWen = T, canRobCompress = T), 283*89cc69c1STang Haojin BEXTI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.bext, SelImm.IMM_I, xWen = T, canRobCompress = T), 284ee8ff153Szfw 285*89cc69c1STang Haojin ROR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.ror, SelImm.X , xWen = T, canRobCompress = T), 286*89cc69c1STang Haojin RORI -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.ror, SelImm.IMM_I , xWen = T, canRobCompress = T), 287*89cc69c1STang Haojin ROL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.rol, SelImm.X , xWen = T, canRobCompress = T), 288ee8ff153Szfw 289*89cc69c1STang Haojin SH1ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1add , SelImm.X , xWen = T, canRobCompress = T), 290*89cc69c1STang Haojin SH2ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2add , SelImm.X , xWen = T, canRobCompress = T), 291*89cc69c1STang Haojin SH3ADD -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3add , SelImm.X , xWen = T, canRobCompress = T), 292*89cc69c1STang Haojin SH1ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh1adduw, SelImm.X , xWen = T, canRobCompress = T), 293*89cc69c1STang Haojin SH2ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh2adduw, SelImm.X , xWen = T, canRobCompress = T), 294*89cc69c1STang Haojin SH3ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.sh3adduw, SelImm.X , xWen = T, canRobCompress = T), 295*89cc69c1STang Haojin ADD_UW -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.alu, ALUOpType.adduw , SelImm.X , xWen = T, canRobCompress = T), 296*89cc69c1STang Haojin SLLI_UW -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.slliuw , SelImm.IMM_I, xWen = T, canRobCompress = T), 2974d24c305SYikeZhou ) 298be25371aSYikeZhou} 299be25371aSYikeZhou 300be25371aSYikeZhou/** 301be25371aSYikeZhou * FP Decode constants 302be25371aSYikeZhou */ 30357a10886SXuan Huobject FpDecode extends DecodeConstants{ 30457a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 30557a10886SXuan Hu FLW -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.lw, selImm = SelImm.IMM_I, fWen = T), 30657a10886SXuan Hu FLD -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.ldu, LSUOpType.ld, selImm = SelImm.IMM_I, fWen = T), 30757a10886SXuan Hu FSW -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sw, selImm = SelImm.IMM_S ), 30857a10886SXuan Hu FSD -> FDecode(SrcType.reg, SrcType.fp, SrcType.X, FuType.stu, LSUOpType.sd, selImm = SelImm.IMM_S ), 3094d24c305SYikeZhou 310*89cc69c1STang Haojin FCLASS_S-> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 311*89cc69c1STang Haojin FCLASS_D-> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 3124d24c305SYikeZhou 313*89cc69c1STang Haojin FMV_X_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 314*89cc69c1STang Haojin FMV_X_W -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 3154d24c305SYikeZhou 316*89cc69c1STang Haojin FMV_D_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 317*89cc69c1STang Haojin FMV_W_X -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 318c2a8ae00SYikeZhou 319*89cc69c1STang Haojin FSGNJ_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 320*89cc69c1STang Haojin FSGNJ_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 321*89cc69c1STang Haojin FSGNJX_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 322*89cc69c1STang Haojin FSGNJX_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 323*89cc69c1STang Haojin FSGNJN_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 324*89cc69c1STang Haojin FSGNJN_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 3254d24c305SYikeZhou 3264d24c305SYikeZhou // FP to FP 327*89cc69c1STang Haojin FCVT_S_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 328*89cc69c1STang Haojin FCVT_D_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 3294d24c305SYikeZhou 3304d24c305SYikeZhou // Int to FP 331*89cc69c1STang Haojin FCVT_S_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 332*89cc69c1STang Haojin FCVT_S_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 333*89cc69c1STang Haojin FCVT_S_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 334*89cc69c1STang Haojin FCVT_S_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 3354d24c305SYikeZhou 336*89cc69c1STang Haojin FCVT_D_W -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 337*89cc69c1STang Haojin FCVT_D_WU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 338*89cc69c1STang Haojin FCVT_D_L -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 339*89cc69c1STang Haojin FCVT_D_LU -> FDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.i2f, FuOpType.X, fWen = T, canRobCompress = T), 3404d24c305SYikeZhou 3414d24c305SYikeZhou // FP to Int 342*89cc69c1STang Haojin FCVT_W_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 343*89cc69c1STang Haojin FCVT_WU_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 344*89cc69c1STang Haojin FCVT_L_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 345*89cc69c1STang Haojin FCVT_LU_S -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 3464d24c305SYikeZhou 347*89cc69c1STang Haojin FCVT_W_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 348*89cc69c1STang Haojin FCVT_WU_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 349*89cc69c1STang Haojin FCVT_L_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 350*89cc69c1STang Haojin FCVT_LU_D -> FDecode(SrcType.fp , SrcType.imm, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 3514d24c305SYikeZhou 352*89cc69c1STang Haojin FEQ_S -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 353*89cc69c1STang Haojin FLT_S -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 354*89cc69c1STang Haojin FLE_S -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 3554d24c305SYikeZhou 356*89cc69c1STang Haojin FEQ_D -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 357*89cc69c1STang Haojin FLT_D -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 358*89cc69c1STang Haojin FLE_D -> FDecode(SrcType.fp , SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, xWen = T, canRobCompress = T), 3594d24c305SYikeZhou 360*89cc69c1STang Haojin FMIN_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 361*89cc69c1STang Haojin FMAX_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 362*89cc69c1STang Haojin FMIN_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 363*89cc69c1STang Haojin FMAX_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmisc, FuOpType.X, fWen = T, canRobCompress = T), 3644d24c305SYikeZhou 365*89cc69c1STang Haojin FADD_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 366*89cc69c1STang Haojin FSUB_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 367*89cc69c1STang Haojin FMUL_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 368*89cc69c1STang Haojin FADD_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 369*89cc69c1STang Haojin FSUB_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 370*89cc69c1STang Haojin FMUL_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 3714d24c305SYikeZhou 372*89cc69c1STang Haojin FMADD_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 373*89cc69c1STang Haojin FMSUB_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 374*89cc69c1STang Haojin FNMADD_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 375*89cc69c1STang Haojin FNMSUB_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 376*89cc69c1STang Haojin FMADD_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 377*89cc69c1STang Haojin FMSUB_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 378*89cc69c1STang Haojin FNMADD_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 379*89cc69c1STang Haojin FNMSUB_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.fp, FuType.fmac, FuOpType.X, fWen = T, canRobCompress = T), 3804d24c305SYikeZhou ) 381be25371aSYikeZhou} 382be25371aSYikeZhou 383be25371aSYikeZhou/** 384ee8ff153Szfw * Bit Manipulation Decode 385ee8ff153Szfw */ 386ee8ff153Szfwobject BDecode extends DecodeConstants{ 38757a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 388ee8ff153Szfw // Basic bit manipulation 389*89cc69c1STang Haojin CLZ -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.clz, SelImm.X, xWen = T, canRobCompress = T), 390*89cc69c1STang Haojin CTZ -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.ctz, SelImm.X, xWen = T, canRobCompress = T), 391*89cc69c1STang Haojin CPOP -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpop, SelImm.X, xWen = T, canRobCompress = T), 392*89cc69c1STang Haojin XPERM8 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermb, SelImm.X, xWen = T, canRobCompress = T), 393*89cc69c1STang Haojin XPERM4 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.xpermn, SelImm.X, xWen = T, canRobCompress = T), 39407596dc6Szfw 395*89cc69c1STang Haojin CLZW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.clzw, SelImm.X, xWen = T, canRobCompress = T), 396*89cc69c1STang Haojin CTZW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.ctzw, SelImm.X, xWen = T, canRobCompress = T), 397*89cc69c1STang Haojin CPOPW -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.cpopw, SelImm.X, xWen = T, canRobCompress = T), 398ee8ff153Szfw 399*89cc69c1STang Haojin CLMUL -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmul, SelImm.X, xWen = T, canRobCompress = T), 400*89cc69c1STang Haojin CLMULH -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulh, SelImm.X, xWen = T, canRobCompress = T), 401*89cc69c1STang Haojin CLMULR -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.clmulr, SelImm.X, xWen = T, canRobCompress = T), 4023feeca58Szfw 403*89cc69c1STang Haojin AES64ES -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64es, SelImm.X , xWen = T, canRobCompress = T), 404*89cc69c1STang Haojin AES64ESM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64esm, SelImm.X , xWen = T, canRobCompress = T), 405*89cc69c1STang Haojin AES64DS -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ds, SelImm.X , xWen = T, canRobCompress = T), 406*89cc69c1STang Haojin AES64DSM -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64dsm, SelImm.X , xWen = T, canRobCompress = T), 407*89cc69c1STang Haojin AES64IM -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.aes64im, SelImm.X , xWen = T, canRobCompress = T), 408*89cc69c1STang Haojin AES64KS1I -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.bku, BKUOpType.aes64ks1i, SelImm.IMM_I, xWen = T, canRobCompress = T), 409*89cc69c1STang Haojin AES64KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.aes64ks2, SelImm.X , xWen = T, canRobCompress = T), 410*89cc69c1STang Haojin SHA256SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum0, SelImm.X , xWen = T, canRobCompress = T), 411*89cc69c1STang Haojin SHA256SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sum1, SelImm.X , xWen = T, canRobCompress = T), 412*89cc69c1STang Haojin SHA256SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig0, SelImm.X , xWen = T, canRobCompress = T), 413*89cc69c1STang Haojin SHA256SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha256sig1, SelImm.X , xWen = T, canRobCompress = T), 414*89cc69c1STang Haojin SHA512SUM0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum0, SelImm.X , xWen = T, canRobCompress = T), 415*89cc69c1STang Haojin SHA512SUM1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sum1, SelImm.X , xWen = T, canRobCompress = T), 416*89cc69c1STang Haojin SHA512SIG0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig0, SelImm.X , xWen = T, canRobCompress = T), 417*89cc69c1STang Haojin SHA512SIG1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sha512sig1, SelImm.X , xWen = T, canRobCompress = T), 418*89cc69c1STang Haojin SM3P0 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p0, SelImm.X , xWen = T, canRobCompress = T), 419*89cc69c1STang Haojin SM3P1 -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.bku, BKUOpType.sm3p1, SelImm.X , xWen = T, canRobCompress = T), 420*89cc69c1STang Haojin SM4KS0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks0, SelImm.X , xWen = T, canRobCompress = T), 421*89cc69c1STang Haojin SM4KS1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks1, SelImm.X , xWen = T, canRobCompress = T), 422*89cc69c1STang Haojin SM4KS2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks2, SelImm.X , xWen = T, canRobCompress = T), 423*89cc69c1STang Haojin SM4KS3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ks3, SelImm.X , xWen = T, canRobCompress = T), 424*89cc69c1STang Haojin SM4ED0 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed0, SelImm.X , xWen = T, canRobCompress = T), 425*89cc69c1STang Haojin SM4ED1 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed1, SelImm.X , xWen = T, canRobCompress = T), 426*89cc69c1STang Haojin SM4ED2 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed2, SelImm.X , xWen = T, canRobCompress = T), 427*89cc69c1STang Haojin SM4ED3 -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.bku, BKUOpType.sm4ed3, SelImm.X , xWen = T, canRobCompress = T), 428ee8ff153Szfw ) 429ee8ff153Szfw} 430ee8ff153Szfw 431ee8ff153Szfw/** 432be25371aSYikeZhou * FP Divide SquareRoot Constants 433be25371aSYikeZhou */ 434be25371aSYikeZhouobject FDivSqrtDecode extends DecodeConstants { 43557a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 436*89cc69c1STang Haojin FDIV_S -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 437*89cc69c1STang Haojin FDIV_D -> FDecode(SrcType.fp, SrcType.fp, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 438*89cc69c1STang Haojin FSQRT_S -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 439*89cc69c1STang Haojin FSQRT_D -> FDecode(SrcType.fp, SrcType.imm, SrcType.X, FuType.fDivSqrt, FuOpType.X, fWen = T, canRobCompress = T), 4404d24c305SYikeZhou ) 441be25371aSYikeZhou} 442be25371aSYikeZhou 4434d24c305SYikeZhou/** 444af2f7849Shappy-lx * Svinval extension Constants 445af2f7849Shappy-lx */ 446af2f7849Shappy-lxobject SvinvalDecode extends DecodeConstants { 44757a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 448af2f7849Shappy-lx /* sinval_vma is like sfence.vma , but sinval_vma can be dispatched and issued like normal instructions while sfence.vma 449af2f7849Shappy-lx * must assure it is the ONLY instrucion executing in backend. 450af2f7849Shappy-lx */ 45157a10886SXuan Hu SINVAL_VMA -> XSDecode(SrcType.reg, SrcType.reg, SrcType.X, FuType.fence, FenceOpType.sfence, SelImm.X), 452af2f7849Shappy-lx /* sfecne.w.inval is the begin instrucion of a TLB flush which set *noSpecExec* and *blockBackward* signals 453af2f7849Shappy-lx * so when it comes to dispatch , it will block all instruction after itself until all instrucions ahead of it in rob commit 454af2f7849Shappy-lx * then dispatch and issue this instrucion to flush sbuffer to dcache 455af2f7849Shappy-lx * after this instrucion commits , issue following sinval_vma instructions (out of order) to flush TLB 456af2f7849Shappy-lx */ 45757a10886SXuan Hu SFENCE_W_INVAL -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T), 458af2f7849Shappy-lx /* sfecne.inval.ir is the end instrucion of a TLB flush which set *noSpecExec* *blockBackward* and *flushPipe* signals 459af2f7849Shappy-lx * so when it comes to dispatch , it will wait until all sinval_vma ahead of it in rob commit 460af2f7849Shappy-lx * then dispatch and issue this instrucion 461af2f7849Shappy-lx * when it commit at the head of rob , flush the pipeline since some instrucions have been fetched to ibuffer using old TLB map 462af2f7849Shappy-lx */ 46357a10886SXuan Hu SFENCE_INVAL_IR -> XSDecode(SrcType.DC, SrcType.DC, SrcType.X, FuType.fence, FenceOpType.nofence, SelImm.X, noSpec = T, blockBack = T, flushPipe = T) 464af2f7849Shappy-lx /* what is Svinval extension ? 465af2f7849Shappy-lx * -----> sfecne.w.inval 466af2f7849Shappy-lx * sfence.vma vpn1 -----> sinval_vma vpn1 467af2f7849Shappy-lx * sfence.vma vpn2 -----> sinval_vma vpn2 468af2f7849Shappy-lx * -----> sfecne.inval.ir 469af2f7849Shappy-lx * 470af2f7849Shappy-lx * sfence.vma should be executed in-order and it flushes the pipeline after committing 471af2f7849Shappy-lx * we can parallel sfence instrucions with this extension 472af2f7849Shappy-lx */ 473af2f7849Shappy-lx ) 474af2f7849Shappy-lx} 47557a10886SXuan Hu 476af2f7849Shappy-lx/* 477ca18a0b4SWilliam Wang * CBO decode 478ca18a0b4SWilliam Wang */ 479ca18a0b4SWilliam Wangobject CBODecode extends DecodeConstants { 48057a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 48157a10886SXuan Hu CBO_ZERO -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_zero , SelImm.IMM_S), 48257a10886SXuan Hu CBO_CLEAN -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_clean, SelImm.IMM_S), 48357a10886SXuan Hu CBO_FLUSH -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_flush, SelImm.IMM_S), 48457a10886SXuan Hu CBO_INVAL -> XSDecode(SrcType.reg, SrcType.DC, SrcType.X, FuType.stu, LSUOpType.cbo_inval, SelImm.IMM_S) 485ca18a0b4SWilliam Wang ) 486ca18a0b4SWilliam Wang} 487ca18a0b4SWilliam Wang 488ca18a0b4SWilliam Wang/** 4894d24c305SYikeZhou * XiangShan Trap Decode constants 4904d24c305SYikeZhou */ 4914d24c305SYikeZhouobject XSTrapDecode extends DecodeConstants { 492361e6d51SJiuyang Liu def TRAP = BitPat("b000000000000?????000000001101011") 49357a10886SXuan Hu val decodeArray: Array[(BitPat, XSDecodeBase)] = Array( 49457a10886SXuan Hu TRAP -> XSDecode(SrcType.reg, SrcType.imm, SrcType.X, FuType.alu, ALUOpType.add, SelImm.IMM_I, xWen = T, xsTrap = T, noSpec = T, blockBack = T) 4954d24c305SYikeZhou ) 4964d24c305SYikeZhou} 497be25371aSYikeZhou 498b0ae3ac4SLinJiaweiabstract class Imm(val len: Int) extends Bundle { 499b0ae3ac4SLinJiawei def toImm32(minBits: UInt): UInt = do_toImm32(minBits(len - 1, 0)) 500b0ae3ac4SLinJiawei def do_toImm32(minBits: UInt): UInt 501b0ae3ac4SLinJiawei def minBitsFromInstr(instr: UInt): UInt 502b0ae3ac4SLinJiawei} 503b0ae3ac4SLinJiawei 504b0ae3ac4SLinJiaweicase class Imm_I() extends Imm(12) { 505fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = SignExt(minBits(len - 1, 0), 32) 506b0ae3ac4SLinJiawei 507b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 508b0ae3ac4SLinJiawei Cat(instr(31, 20)) 509b0ae3ac4SLinJiawei} 510b0ae3ac4SLinJiawei 511b0ae3ac4SLinJiaweicase class Imm_S() extends Imm(12) { 512b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 513b0ae3ac4SLinJiawei 514b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 515b0ae3ac4SLinJiawei Cat(instr(31, 25), instr(11, 7)) 516b0ae3ac4SLinJiawei} 517b0ae3ac4SLinJiawei 518b0ae3ac4SLinJiaweicase class Imm_B() extends Imm(12) { 519b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 520b0ae3ac4SLinJiawei 521b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = 522b0ae3ac4SLinJiawei Cat(instr(31), instr(7), instr(30, 25), instr(11, 8)) 523b0ae3ac4SLinJiawei} 524b0ae3ac4SLinJiawei 525b0ae3ac4SLinJiaweicase class Imm_U() extends Imm(20){ 526fd7603d9SYinan Xu override def do_toImm32(minBits: UInt): UInt = Cat(minBits(len - 1, 0), 0.U(12.W)) 527b0ae3ac4SLinJiawei 528b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 529b0ae3ac4SLinJiawei instr(31, 12) 530c2a8ae00SYikeZhou } 531c2a8ae00SYikeZhou} 532c2a8ae00SYikeZhou 533b0ae3ac4SLinJiaweicase class Imm_J() extends Imm(20){ 534b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = SignExt(Cat(minBits, 0.U(1.W)), 32) 535b0ae3ac4SLinJiawei 536b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 537b0ae3ac4SLinJiawei Cat(instr(31), instr(19, 12), instr(20), instr(30, 25), instr(24, 21)) 538b0ae3ac4SLinJiawei } 539b0ae3ac4SLinJiawei} 540b0ae3ac4SLinJiawei 541b0ae3ac4SLinJiaweicase class Imm_Z() extends Imm(12 + 5){ 542b0ae3ac4SLinJiawei override def do_toImm32(minBits: UInt): UInt = minBits 543b0ae3ac4SLinJiawei 544b0ae3ac4SLinJiawei override def minBitsFromInstr(instr: UInt): UInt = { 545b0ae3ac4SLinJiawei Cat(instr(19, 15), instr(31, 20)) 546b0ae3ac4SLinJiawei } 547b0ae3ac4SLinJiawei} 548b0ae3ac4SLinJiawei 549ee8ff153Szfwcase class Imm_B6() extends Imm(6){ 550ee8ff153Szfw override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 551ee8ff153Szfw 552ee8ff153Szfw override def minBitsFromInstr(instr: UInt): UInt = { 553ee8ff153Szfw instr(25, 20) 554ee8ff153Szfw } 555ee8ff153Szfw} 556ee8ff153Szfw 55758c35d23Shuxuan0307case class Imm_OPIVIS() extends Imm(5){ 55858c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 55958c35d23Shuxuan0307 56058c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 56158c35d23Shuxuan0307 instr(19, 15) 56258c35d23Shuxuan0307 } 56358c35d23Shuxuan0307} 564b52d4755SXuan Hu 56558c35d23Shuxuan0307case class Imm_OPIVIU() extends Imm(5){ 56658c35d23Shuxuan0307 override def do_toImm32(minBits: UInt): UInt = ZeroExt(minBits, 32) 56758c35d23Shuxuan0307 56858c35d23Shuxuan0307 override def minBitsFromInstr(instr: UInt): UInt = { 56958c35d23Shuxuan0307 instr(19, 15) 57058c35d23Shuxuan0307 } 57158c35d23Shuxuan0307} 572b52d4755SXuan Hu 5734aa9ed34Sfdycase class Imm_VSETVLI() extends Imm(11){ 5744aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 5754aa9ed34Sfdy 5764aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 5774aa9ed34Sfdy instr(30, 20) 5784aa9ed34Sfdy } 5794aa9ed34Sfdy} 580b52d4755SXuan Hu 581b52d4755SXuan Hucase class Imm_VSETIVLI() extends Imm(13){ 5824aa9ed34Sfdy override def do_toImm32(minBits: UInt): UInt = SignExt(minBits, 32) 5834aa9ed34Sfdy 5844aa9ed34Sfdy override def minBitsFromInstr(instr: UInt): UInt = { 5855c1681d0SXuan Hu val rvInst: XSInstBitFields = instr.asTypeOf(new XSInstBitFields) 586b52d4755SXuan Hu val uimm5 = rvInst.UIMM_VSETIVLI 587b52d4755SXuan Hu val vtype8 = rvInst.ZIMM_VTYPE 588b52d4755SXuan Hu Cat(uimm5, vtype8) 589b52d4755SXuan Hu } 590b52d4755SXuan Hu /** 591b52d4755SXuan Hu * get VType from extended imm 592b52d4755SXuan Hu * @param extedImm 593b52d4755SXuan Hu * @return VType 594b52d4755SXuan Hu */ 595b52d4755SXuan Hu def getVType(extedImm: UInt): InstVType = { 596b52d4755SXuan Hu val vtype = Wire(new InstVType) 597b52d4755SXuan Hu vtype := extedImm(7, 0).asTypeOf(new InstVType) 598b52d4755SXuan Hu vtype 599b52d4755SXuan Hu } 600b52d4755SXuan Hu 601b52d4755SXuan Hu def getAvl(extedImm: UInt): UInt = { 602b52d4755SXuan Hu extedImm(12, 8) 6034aa9ed34Sfdy } 6044aa9ed34Sfdy} 605b0ae3ac4SLinJiaweiobject ImmUnion { 606b0ae3ac4SLinJiawei val I = Imm_I() 607b0ae3ac4SLinJiawei val S = Imm_S() 608b0ae3ac4SLinJiawei val B = Imm_B() 609b0ae3ac4SLinJiawei val U = Imm_U() 610b0ae3ac4SLinJiawei val J = Imm_J() 611b0ae3ac4SLinJiawei val Z = Imm_Z() 612ee8ff153Szfw val B6 = Imm_B6() 61358c35d23Shuxuan0307 val OPIVIS = Imm_OPIVIS() 61458c35d23Shuxuan0307 val OPIVIU = Imm_OPIVIU() 6154aa9ed34Sfdy val VSETVLI = Imm_VSETVLI() 6164aa9ed34Sfdy val VSETIVLI = Imm_VSETIVLI() 6174aa9ed34Sfdy 6184aa9ed34Sfdy val imms = Seq(I, S, B, U, J, Z, B6, OPIVIS, OPIVIU, VSETVLI, VSETIVLI) 619b0ae3ac4SLinJiawei val maxLen = imms.maxBy(_.len).len 620b0ae3ac4SLinJiawei val immSelMap = Seq( 621b0ae3ac4SLinJiawei SelImm.IMM_I, 622b0ae3ac4SLinJiawei SelImm.IMM_S, 623b0ae3ac4SLinJiawei SelImm.IMM_SB, 624b0ae3ac4SLinJiawei SelImm.IMM_U, 625b0ae3ac4SLinJiawei SelImm.IMM_UJ, 626ee8ff153Szfw SelImm.IMM_Z, 62758c35d23Shuxuan0307 SelImm.IMM_B6, 62858c35d23Shuxuan0307 SelImm.IMM_OPIVIS, 6294aa9ed34Sfdy SelImm.IMM_OPIVIU, 6304aa9ed34Sfdy SelImm.IMM_VSETVLI, 6314aa9ed34Sfdy SelImm.IMM_VSETIVLI 632b0ae3ac4SLinJiawei ).zip(imms) 633b0ae3ac4SLinJiawei println(s"ImmUnion max len: $maxLen") 634b0ae3ac4SLinJiawei} 635b0ae3ac4SLinJiawei 636fd7603d9SYinan Xucase class Imm_LUI_LOAD() { 637fd7603d9SYinan Xu def immFromLuiLoad(lui_imm: UInt, load_imm: UInt): UInt = { 638fd7603d9SYinan Xu val loadImm = load_imm(Imm_I().len - 1, 0) 639fd7603d9SYinan Xu Cat(lui_imm(Imm_U().len - loadImm.getWidth - 1, 0), loadImm) 640fd7603d9SYinan Xu } 6413b739f49SXuan Hu def getLuiImm(uop: DynInst): UInt = { 642fd7603d9SYinan Xu val loadImmLen = Imm_I().len 6433b739f49SXuan Hu val imm_u = Cat(uop.psrc(1), uop.psrc(0), uop.imm(ImmUnion.maxLen - 1, loadImmLen)) 644fd7603d9SYinan Xu Imm_U().do_toImm32(imm_u) 645fd7603d9SYinan Xu } 646fd7603d9SYinan Xu} 647b0ae3ac4SLinJiawei 648be25371aSYikeZhou/** 649be25371aSYikeZhou * IO bundle for the Decode unit 650be25371aSYikeZhou */ 6512225d46eSJiawei Linclass DecodeUnitIO(implicit p: Parameters) extends XSBundle { 6523b739f49SXuan Hu val enq = new Bundle { 6533b739f49SXuan Hu val ctrlFlow = Input(new StaticInst) 654d91483a6Sfdy val vtype = Input(new VType) 6554aa9ed34Sfdy } 6563b739f49SXuan Hu// val vconfig = Input(UInt(XLEN.W)) 6573b739f49SXuan Hu val deq = new Bundle { 658d91483a6Sfdy val decodedInst = Output(new DecodedInst) 659d91483a6Sfdy val isComplex = Output(Bool()) 6607f9f0a79SzhanglyGit val uopInfo = Output(new UopInfo) 6613b739f49SXuan Hu } 662af2f7849Shappy-lx val csrCtrl = Input(new CustomCSRCtrlIO) 663be25371aSYikeZhou} 664be25371aSYikeZhou 665be25371aSYikeZhou/** 666be25371aSYikeZhou * Decode unit that takes in a single CtrlFlow and generates a CfCtrl. 667be25371aSYikeZhou */ 6682225d46eSJiawei Linclass DecodeUnit(implicit p: Parameters) extends XSModule with DecodeUnitConstants { 669be25371aSYikeZhou val io = IO(new DecodeUnitIO) 670be25371aSYikeZhou 6713b739f49SXuan Hu val ctrl_flow = io.enq.ctrlFlow // input with RVC Expanded 672be25371aSYikeZhou 67375e2c883SXuan Hu private val inst: XSInstBitFields = io.enq.ctrlFlow.instr.asTypeOf(new XSInstBitFields) 67475e2c883SXuan Hu 67557a10886SXuan Hu val decode_table: Array[(BitPat, List[BitPat])] = XDecode.table ++ 67657a10886SXuan Hu FpDecode.table ++ 677a19215ddSYinan Xu FDivSqrtDecode.table ++ 678a19215ddSYinan Xu X64Decode.table ++ 679a19215ddSYinan Xu XSTrapDecode.table ++ 680a19215ddSYinan Xu BDecode.table ++ 681a19215ddSYinan Xu CBODecode.table ++ 682b65b9ebaSXuan Hu SvinvalDecode.table ++ 683b65b9ebaSXuan Hu VecDecoder.table 684b65b9ebaSXuan Hu 685*89cc69c1STang Haojin require(decode_table.map(_._2.length == 15).reduce(_ && _), "Decode tables have different column size") 686a19215ddSYinan Xu // assertion for LUI: only LUI should be assigned `selImm === SelImm.IMM_U && fuType === FuType.alu` 6873b739f49SXuan Hu val luiMatch = (t: Seq[BitPat]) => t(3).value == FuType.alu && t.reverse.head.value == SelImm.IMM_U.litValue 688a19215ddSYinan Xu val luiTable = decode_table.filter(t => luiMatch(t._2)).map(_._1).distinct 689a19215ddSYinan Xu assert(luiTable.length == 1 && luiTable.head == LUI, "Conflicts: LUI is determined by FuType and SelImm in Dispatch") 690be25371aSYikeZhou 6914d24c305SYikeZhou // output 6923b739f49SXuan Hu val decodedInst: DecodedInst = Wire(new DecodedInst()).decode(ctrl_flow.instr, decode_table) 693be25371aSYikeZhou 6942ce29ed6SLinJiawei val fpDecoder = Module(new FPDecoder) 6957ceedf30SLinJiawei fpDecoder.io.instr := ctrl_flow.instr 6963b739f49SXuan Hu decodedInst.fpu := fpDecoder.io.fpCtrl 6971a1319cbSLinJiawei 6983b739f49SXuan Hu decodedInst.connectStaticInst(io.enq.ctrlFlow) 6993b739f49SXuan Hu 700a8db15d8Sfdy decodedInst.uopIdx := 0.U 701d91483a6Sfdy decodedInst.firstUop := true.B 702d91483a6Sfdy decodedInst.lastUop := true.B 703f1e8fcb2SXuan Hu decodedInst.numUops := 1.U 704deb6421eSHaojin Tang 70573c4359eSYikeZhou val isMove = BitPat("b000000000000_?????_000_?????_0010011") === ctrl_flow.instr 70698cfe81bSxgkiri decodedInst.isMove := isMove && inst.RD =/= 0.U 70773c4359eSYikeZhou 708996aacc9SXuan Hu private val v0Idx = 0 709996aacc9SXuan Hu private val vconfigIdx = VCONFIG_IDX 710996aacc9SXuan Hu 711178dd38cSYikeZhou // read src1~3 location 71298cfe81bSxgkiri decodedInst.lsrc(0) := inst.RS1 71398cfe81bSxgkiri decodedInst.lsrc(1) := inst.RS2 71498cfe81bSxgkiri decodedInst.lsrc(2) := inst.FS3 715996aacc9SXuan Hu decodedInst.lsrc(3) := v0Idx.U 716996aacc9SXuan Hu decodedInst.lsrc(4) := vconfigIdx.U 717996aacc9SXuan Hu decodedInst.srcType(3) := Mux(inst.VM.asBool, SrcType.DC, SrcType.vp) // mask src 718996aacc9SXuan Hu decodedInst.srcType(4) := SrcType.vp // vconfig 719b6b11f60SXuan Hu 7203f6c8c2cSXuan Hu // cs.lsrc(2) := Mux(FuType.isVecExu(cs.fuType), ctrl_flow.instr(RD_MSB, RD_LSB), ctrl_flow.instr(RS3_MSB, RS3_LSB)) 721178dd38cSYikeZhou // read dest location 72298cfe81bSxgkiri decodedInst.ldest := inst.RD 7234d24c305SYikeZhou 724c2a8ae00SYikeZhou // fill in exception vector 725567f0269Ssinsanction val vecException = Module(new VecExceptionGen) 726567f0269Ssinsanction vecException.io.inst := io.enq.ctrlFlow.instr 727567f0269Ssinsanction vecException.io.decodedInst := decodedInst 728567f0269Ssinsanction vecException.io.vtype := io.enq.vtype 729567f0269Ssinsanction 730567f0269Ssinsanction decodedInst.exceptionVec(illegalInstr) := decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst 7314d24c305SYikeZhou 732af2f7849Shappy-lx when (!io.csrCtrl.svinval_enable) { 733567f0269Ssinsanction val base_ii = decodedInst.selImm === SelImm.INVALID_INSTR || vecException.io.illegalInst 734af2f7849Shappy-lx val sinval = BitPat("b0001011_?????_?????_000_00000_1110011") === ctrl_flow.instr 735af2f7849Shappy-lx val w_inval = BitPat("b0001100_00000_00000_000_00000_1110011") === ctrl_flow.instr 736af2f7849Shappy-lx val inval_ir = BitPat("b0001100_00001_00000_000_00000_1110011") === ctrl_flow.instr 737af2f7849Shappy-lx val svinval_ii = sinval || w_inval || inval_ir 7383b739f49SXuan Hu decodedInst.exceptionVec(illegalInstr) := base_ii || svinval_ii 7393b739f49SXuan Hu decodedInst.flushPipe := false.B 740af2f7849Shappy-lx } 741af2f7849Shappy-lx 742c2a8ae00SYikeZhou // fix frflags 743c2a8ae00SYikeZhou // fflags zero csrrs rd csr 744c2a8ae00SYikeZhou val isFrflags = BitPat("b000000000001_00000_010_?????_1110011") === ctrl_flow.instr 7453b739f49SXuan Hu when (decodedInst.fuType === FuType.csr.U && isFrflags) { 7463b739f49SXuan Hu decodedInst.blockBackward := false.B 747c2a8ae00SYikeZhou } 748c2a8ae00SYikeZhou 7493b739f49SXuan Hu decodedInst.imm := LookupTree(decodedInst.selImm, ImmUnion.immSelMap.map( 750b0ae3ac4SLinJiawei x => { 7517ceedf30SLinJiawei val minBits = x._2.minBitsFromInstr(ctrl_flow.instr) 752b0ae3ac4SLinJiawei require(minBits.getWidth == x._2.len) 753b0ae3ac4SLinJiawei x._1 -> minBits 754b0ae3ac4SLinJiawei } 755b0ae3ac4SLinJiawei )) 756aac4464eSYinan Xu 7573b739f49SXuan Hu decodedInst.commitType := 0.U // Todo: remove it 75875e2c883SXuan Hu 75975e2c883SXuan Hu decodedInst.isVset := FuType.isVset(decodedInst.fuType) 760be25371aSYikeZhou 76139c388b5SXuan Hu private val needReverseInsts = Seq(VRSUB_VI, VRSUB_VX, VREM_VV, VREM_VX, VREMU_VV, VFRDIV_VF, VFRSUB_VF) 76239c388b5SXuan Hu private val vextInsts = Seq(VZEXT_VF2, VZEXT_VF4, VZEXT_VF8, VSEXT_VF2, VSEXT_VF4, VSEXT_VF8) 76339c388b5SXuan Hu private val narrowInsts = Seq( 76439c388b5SXuan Hu VNSRA_WV, VNSRA_WX, VNSRA_WI, VNSRL_WV, VNSRL_WX, VNSRL_WI, 76539c388b5SXuan Hu VNCLIP_WV, VNCLIP_WX, VNCLIP_WI, VNCLIPU_WV, VNCLIPU_WX, VNCLIPU_WI, 76639c388b5SXuan Hu ) 76739c388b5SXuan Hu private val maskDstInsts = Seq( 76839c388b5SXuan Hu VMADC_VV, VMADC_VX, VMADC_VI, VMADC_VVM, VMADC_VXM, VMADC_VIM, 76939c388b5SXuan Hu VMSBC_VV, VMSBC_VX, VMSBC_VVM, VMSBC_VXM, 77039c388b5SXuan Hu VMAND_MM, VMNAND_MM, VMANDN_MM, VMXOR_MM, VMOR_MM, VMNOR_MM, VMORN_MM, VMXNOR_MM, 7719eaaa75dSXuan Hu VMSEQ_VV, VMSEQ_VX, VMSEQ_VI, VMSNE_VV, VMSNE_VX, VMSNE_VI, 7729eaaa75dSXuan Hu VMSLE_VV, VMSLE_VX, VMSLE_VI, VMSLEU_VV, VMSLEU_VX, VMSLEU_VI, 7739eaaa75dSXuan Hu VMSLT_VV, VMSLT_VX, VMSLTU_VV, VMSLTU_VX, 7749eaaa75dSXuan Hu VMSGT_VX, VMSGT_VI, VMSGTU_VX, VMSGTU_VI, 775f06d6d60Sxiaofeibao-xjtu VMFEQ_VV, VMFEQ_VF, VMFNE_VV, VMFNE_VF, VMFLT_VV, VMFLT_VF, VMFLE_VV, VMFLE_VF, VMFGT_VF, VMFGE_VF, 77639c388b5SXuan Hu ) 77739c388b5SXuan Hu 7783b739f49SXuan Hu decodedInst.vpu := 0.U.asTypeOf(decodedInst.vpu) // Todo: Connect vpu decoder 77975e2c883SXuan Hu decodedInst.vpu.vill := io.enq.vtype.illegal 78075e2c883SXuan Hu decodedInst.vpu.vma := io.enq.vtype.vma 78175e2c883SXuan Hu decodedInst.vpu.vta := io.enq.vtype.vta 78275e2c883SXuan Hu decodedInst.vpu.vsew := io.enq.vtype.vsew 78375e2c883SXuan Hu decodedInst.vpu.vlmul := io.enq.vtype.vlmul 78475e2c883SXuan Hu decodedInst.vpu.vm := inst.VM 78575e2c883SXuan Hu decodedInst.vpu.nf := inst.NF 78642475509SXuan Hu decodedInst.vpu.needScalaSrc := Category.needScalaSrc(inst.VCATEGORY) 787ad22c988SZiyue Zhang decodedInst.vpu.permImmTruncate := Category.permImmTruncate(inst.VCATEGORY) 78894e7468cSXuan Hu decodedInst.vpu.isReverse := needReverseInsts.map(_ === inst.ALL).reduce(_ || _) 78939c388b5SXuan Hu decodedInst.vpu.isExt := vextInsts.map(_ === inst.ALL).reduce(_ || _) 79039c388b5SXuan Hu decodedInst.vpu.isNarrow := narrowInsts.map(_ === inst.ALL).reduce(_ || _) 79139c388b5SXuan Hu decodedInst.vpu.isDstMask := maskDstInsts.map(_ === inst.ALL).reduce(_ || _) 79275e2c883SXuan Hu 7937f9f0a79SzhanglyGit val uopInfoGen = Module(new UopInfoGen) 79487dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.typeOfSplit := decodedInst.uopSplitType 79587dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vsew := decodedInst.vpu.vsew 79687dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vlmul := decodedInst.vpu.vlmul 79787dd4e0dSzhanglyGit uopInfoGen.io.in.preInfo.vwidth := inst.RM 7987f9f0a79SzhanglyGit io.deq.isComplex := uopInfoGen.io.out.isComplex 7997f9f0a79SzhanglyGit io.deq.uopInfo.numOfUop := uopInfoGen.io.out.uopInfo.numOfUop 8007f9f0a79SzhanglyGit io.deq.uopInfo.lmul := uopInfoGen.io.out.uopInfo.lmul 8017f9f0a79SzhanglyGit 80275e2c883SXuan Hu io.deq.decodedInst := decodedInst 8034aa9ed34Sfdy 804be25371aSYikeZhou //------------------------------------------------------------- 805be25371aSYikeZhou // Debug Info 8063b739f49SXuan Hu// XSDebug("in: instr=%x pc=%x excepVec=%b crossPageIPFFix=%d\n", 8073b739f49SXuan Hu// io.enq.ctrl_flow.instr, io.enq.ctrl_flow.pc, io.enq.ctrl_flow.exceptionVec.asUInt, 8083b739f49SXuan Hu// io.enq.ctrl_flow.crossPageIPFFix) 8093b739f49SXuan Hu// XSDebug("out: srcType(0)=%b srcType(1)=%b srcType(2)=%b lsrc(0)=%d lsrc(1)=%d lsrc(2)=%d ldest=%d fuType=%b fuOpType=%b\n", 8103b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.srcType(0), io.deq.cf_ctrl.ctrl.srcType(1), io.deq.cf_ctrl.ctrl.srcType(2), 8113b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.lsrc(0), io.deq.cf_ctrl.ctrl.lsrc(1), io.deq.cf_ctrl.ctrl.lsrc(2), 8123b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.ldest, io.deq.cf_ctrl.ctrl.fuType, io.deq.cf_ctrl.ctrl.fuOpType) 8133b739f49SXuan Hu// XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d imm=%x\n", 8143b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.rfWen, io.deq.cf_ctrl.ctrl.fpWen, io.deq.cf_ctrl.ctrl.isXSTrap, 8153b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.noSpecExec, io.deq.cf_ctrl.ctrl.blockBackward, io.deq.cf_ctrl.ctrl.flushPipe, 8163b739f49SXuan Hu// io.deq.cf_ctrl.ctrl.imm) 8173b739f49SXuan Hu// XSDebug("out: excepVec=%b\n", io.deq.cf_ctrl.cf.exceptionVec.asUInt) 818be25371aSYikeZhou} 819