1fe29a7c0SXuan Hupackage xiangshan.backend.decode.isa.bitfield 2fe29a7c0SXuan Hu 3fe29a7c0SXuan Huimport chisel3._ 4*99f369f9Sxiaofeibao-xjtuimport chisel3.util.BitPat 5fe29a7c0SXuan Hu 6fe29a7c0SXuan Huabstract class RiscvInst(bitWidth: Int) extends Bundle { 7fe29a7c0SXuan Hu val inst: UInt = UInt(bitWidth.W) 8fe29a7c0SXuan Hu} 9fe29a7c0SXuan Hu 10fe29a7c0SXuan Huclass Riscv32BitInst extends RiscvInst(32) { 11fe29a7c0SXuan Hu def ALL : UInt = inst 12d408d10eSHaojin Tang def OPCODE : UInt = inst( 6, 0) 13fe29a7c0SXuan Hu def RD : UInt = inst(11, 7) 14fe29a7c0SXuan Hu def FUNCT3 : UInt = inst(14, 12) 15fe29a7c0SXuan Hu def RS1 : UInt = inst(19, 15) 16fe29a7c0SXuan Hu def RS2 : UInt = inst(24, 20) 17fe29a7c0SXuan Hu def FUNCT7 : UInt = inst(31, 25) 18cc1eb70dSXuan Hu def OPCODE5Bit: UInt = inst( 6, 2) 1964523a1dSZiyue Zhang def OPCODE7Bit: UInt = inst( 6, 0) 20*99f369f9Sxiaofeibao-xjtu 21*99f369f9Sxiaofeibao-xjtu // Not handle illegal instr in this function 22*99f369f9Sxiaofeibao-xjtu def isAMOCAS = { 23*99f369f9Sxiaofeibao-xjtu this.OPCODE5Bit === xiangshan.backend.decode.isa.bitfield.OPCODE5Bit.AMO && 24*99f369f9Sxiaofeibao-xjtu this.FUNCT7 === BitPat("b00101??") 25*99f369f9Sxiaofeibao-xjtu } 26fe29a7c0SXuan Hu} 27fe29a7c0SXuan Hu 285c1681d0SXuan Hutrait BitFieldsI { this: Riscv32BitInst => 29fe29a7c0SXuan Hu def IMM12 : UInt = inst(31, 20) 3098cfe81bSxgkiri def SHAMT6 : UInt = inst(25, 20) 3198cfe81bSxgkiri def SHAMT5 : UInt = inst(24, 20) 32fe29a7c0SXuan Hu} 33fe29a7c0SXuan Hu 345c1681d0SXuan Hutrait BitFieldsS { this: Riscv32BitInst => 35fe29a7c0SXuan Hu def IMM5 : UInt = inst(11, 7) 36fe29a7c0SXuan Hu def IMM7 : UInt = inst(31, 25) 37fe29a7c0SXuan Hu} 38fe29a7c0SXuan Hu 395c1681d0SXuan Hutrait BitFieldsCSR { this: Riscv32BitInst => 40fe29a7c0SXuan Hu def CSRIDX : UInt = inst(31, 20) 41fe29a7c0SXuan Hu def CSRIMM : UInt = inst(19, 15) 42fe29a7c0SXuan Hu} 43fe29a7c0SXuan Hu 445c1681d0SXuan Hutrait BitFieldsFp { this: Riscv32BitInst => 45fe29a7c0SXuan Hu def FD : UInt = inst(11, 7) 46fe29a7c0SXuan Hu def FS1 : UInt = inst(19, 15) 47fe29a7c0SXuan Hu def FS2 : UInt = inst(24, 20) 48fe29a7c0SXuan Hu def FS3 : UInt = inst(31, 27) 49fe29a7c0SXuan Hu def RM : UInt = inst(14, 12) // round mode 50fe29a7c0SXuan Hu def CONV_SGN: UInt = inst(24, 20) 5198cfe81bSxgkiri def FMT : UInt = inst(26, 25) 5298cfe81bSxgkiri def TYP : UInt = inst(21, 20) 53fe29a7c0SXuan Hu} 54fe29a7c0SXuan Hu 555c1681d0SXuan Hutrait BitFieldsVec { this: Riscv32BitInst => 56602c81c3SXuan Hu def VCATEGORY : UInt = inst(14, 12) 57fe29a7c0SXuan Hu def NF : UInt = inst(31, 29) 58fe29a7c0SXuan Hu def MEW : UInt = inst(28) 59fe29a7c0SXuan Hu def MOP : UInt = inst(27, 26) 60fe29a7c0SXuan Hu def VM : UInt = inst(25) 61fe29a7c0SXuan Hu def LUMOP : UInt = inst(24, 20) 62fe29a7c0SXuan Hu def SUMOP : UInt = inst(24, 20) 63fe29a7c0SXuan Hu def WIDTH : UInt = inst(14, 12) 64fe29a7c0SXuan Hu def VD : UInt = inst(11, 7) 65fe29a7c0SXuan Hu def VS1 : UInt = inst(19, 15) 66fe29a7c0SXuan Hu def VS2 : UInt = inst(24, 20) 67fe29a7c0SXuan Hu def VS3 : UInt = inst(11, 7) 68fe29a7c0SXuan Hu def FUNCT6 : UInt = inst(31 ,26) 69fe29a7c0SXuan Hu def ZIMM_VSETVLI : UInt = inst(30, 20) 70fe29a7c0SXuan Hu def ZIMM_VSETIVLI : UInt = inst(29, 20) 71fe29a7c0SXuan Hu def UIMM_VSETIVLI : UInt = inst(19, 15) 72fe29a7c0SXuan Hu def IMM5_OPIVI : UInt = inst(19, 15) 73b52d4755SXuan Hu 74b52d4755SXuan Hu def getInstVType : InstVType = { 75b52d4755SXuan Hu val res = Wire(new InstVType) 76b52d4755SXuan Hu res.vlmul := ZIMM_VSETVLI(2, 0) 77b52d4755SXuan Hu res.vsew := ZIMM_VSETVLI(5, 3) 78b52d4755SXuan Hu res.vta := ZIMM_VSETVLI(6) 79b52d4755SXuan Hu res.vma := ZIMM_VSETVLI(7) 80b52d4755SXuan Hu res 81b52d4755SXuan Hu } 82305e657eSXuan Hu 83305e657eSXuan Hu def isVecStore = { 84*99f369f9Sxiaofeibao-xjtu this.OPCODE5Bit === xiangshan.backend.decode.isa.bitfield.OPCODE5Bit.STORE_FP && 85*99f369f9Sxiaofeibao-xjtu (this.WIDTH === 0.U || this.WIDTH(2) === 1.B) 86305e657eSXuan Hu } 8726af847eSgood-circle 8826af847eSgood-circle def isVecLoad = { 89*99f369f9Sxiaofeibao-xjtu this.OPCODE5Bit === xiangshan.backend.decode.isa.bitfield.OPCODE5Bit.LOAD_FP && 90*99f369f9Sxiaofeibao-xjtu (this.WIDTH === 0.U || this.WIDTH(2) === 1.B) 91*99f369f9Sxiaofeibao-xjtu } 92*99f369f9Sxiaofeibao-xjtu 93*99f369f9Sxiaofeibao-xjtu def isVecArith = { 94*99f369f9Sxiaofeibao-xjtu this.OPCODE5Bit === xiangshan.backend.decode.isa.bitfield.OPCODE5Bit.OP_V 9526af847eSgood-circle } 9600cefdffSXuan Hu 9700cefdffSXuan Hu def isOPIVV = { 9800cefdffSXuan Hu this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH && 9900cefdffSXuan Hu this.FUNCT3 === "b000".U 10000cefdffSXuan Hu } 10100cefdffSXuan Hu 10200cefdffSXuan Hu def isOPFVV = { 10300cefdffSXuan Hu this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH && 10400cefdffSXuan Hu this.FUNCT3 === "b001".U 10500cefdffSXuan Hu } 10600cefdffSXuan Hu 10700cefdffSXuan Hu def isOPMVV = { 10800cefdffSXuan Hu this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH && 10900cefdffSXuan Hu this.FUNCT3 === "b010".U 11000cefdffSXuan Hu } 11100cefdffSXuan Hu 11200cefdffSXuan Hu def isOPIVI= { 11300cefdffSXuan Hu this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH && 11400cefdffSXuan Hu this.FUNCT3 === "b011".U 11500cefdffSXuan Hu } 11600cefdffSXuan Hu 11700cefdffSXuan Hu def isOPIVX = { 11800cefdffSXuan Hu this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH && 11900cefdffSXuan Hu this.FUNCT3 === "b100".U 12000cefdffSXuan Hu } 12100cefdffSXuan Hu 12200cefdffSXuan Hu def isOPFVF = { 12300cefdffSXuan Hu this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH && 12400cefdffSXuan Hu this.FUNCT3 === "b101".U 12500cefdffSXuan Hu } 12600cefdffSXuan Hu 12700cefdffSXuan Hu def isOPMVX = { 12800cefdffSXuan Hu this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH && 12900cefdffSXuan Hu this.FUNCT3 === "b110".U 13000cefdffSXuan Hu } 131fe29a7c0SXuan Hu} 132fe29a7c0SXuan Hu 1339c13e962Slin zhidatrait BitFieldsRVK { this: Riscv32BitInst => 1349c13e962Slin zhida def RNUM : UInt = inst(23, 20) 1359c13e962Slin zhida 1369c13e962Slin zhida def isRnumIllegal = { 1379c13e962Slin zhida this.RNUM > 0xA.U 1389c13e962Slin zhida } 1399c13e962Slin zhida} 1409c13e962Slin zhida 1415c1681d0SXuan Huclass XSInstBitFields extends Riscv32BitInst 1425c1681d0SXuan Hu with BitFieldsI 1435c1681d0SXuan Hu with BitFieldsS 1445c1681d0SXuan Hu with BitFieldsCSR 1455c1681d0SXuan Hu with BitFieldsFp 1465c1681d0SXuan Hu with BitFieldsVec 1479c13e962Slin zhida with BitFieldsRVK 1485c1681d0SXuan Hu 149b52d4755SXuan Huclass InstVType extends Bundle { 150e6ac7fe1SZiyue Zhang val reserved = UInt(3.W) 151b52d4755SXuan Hu val vma = Bool() 152b52d4755SXuan Hu val vta = Bool() 153b52d4755SXuan Hu val vsew = UInt(3.W) 154b52d4755SXuan Hu val vlmul = UInt(3.W) 155b52d4755SXuan Hu} 156fe29a7c0SXuan Hu 157cc1eb70dSXuan Huobject OPCODE5Bit { 158cc1eb70dSXuan Hu val LOAD = "b00_000".U 159cc1eb70dSXuan Hu val LOAD_FP = "b00_001".U 160cc1eb70dSXuan Hu val CUSTOM_0 = "b00_010".U 161cc1eb70dSXuan Hu val MSIC_MEM = "b00_011".U 162cc1eb70dSXuan Hu val OP_IMM = "b00_100".U 163cc1eb70dSXuan Hu val AUIPC = "b00_101".U 164cc1eb70dSXuan Hu val OP_IMM_32 = "b00_110".U 165cc1eb70dSXuan Hu val INST48b_0 = "b00_111".U 166cc1eb70dSXuan Hu 167cc1eb70dSXuan Hu val STORE = "b01_000".U 168cc1eb70dSXuan Hu val STORE_FP = "b01_001".U 169cc1eb70dSXuan Hu val CUSTOM_1 = "b01_010".U 170cc1eb70dSXuan Hu val AMO = "b01_011".U 171cc1eb70dSXuan Hu val OP = "b01_100".U 172cc1eb70dSXuan Hu val LUI = "b01_101".U 173cc1eb70dSXuan Hu val OP_32 = "b01_110".U 174cc1eb70dSXuan Hu val INST64b = "b01_111".U 175cc1eb70dSXuan Hu 176cc1eb70dSXuan Hu val MADD = "b10_000".U 177cc1eb70dSXuan Hu val MSUB = "b10_001".U 178cc1eb70dSXuan Hu val NMSUB = "b10_010".U 179cc1eb70dSXuan Hu val NMADD = "b10_011".U 180cc1eb70dSXuan Hu val OP_FP = "b10_100".U 181cc1eb70dSXuan Hu val OP_V = "b10_101".U 182cc1eb70dSXuan Hu val CUSTOM_2 = "b10_110".U 183cc1eb70dSXuan Hu val INST48b_1 = "b10_111".U 184cc1eb70dSXuan Hu 185cc1eb70dSXuan Hu val BRANCH = "b11_000".U 186cc1eb70dSXuan Hu val JALR = "b11_001".U 187cc1eb70dSXuan Hu val RESERVED_0 = "b11_010".U 188cc1eb70dSXuan Hu val JAL = "b11_011".U 189cc1eb70dSXuan Hu val SYSTEM = "b11_100".U 190cc1eb70dSXuan Hu val RESERVED_1 = "b11_101".U 191cc1eb70dSXuan Hu val CUSTOM_3 = "b11_110".U 192cc1eb70dSXuan Hu val INSTge80b = "b11_111".U 193cc1eb70dSXuan Hu} 19464523a1dSZiyue Zhang 19564523a1dSZiyue Zhangobject OPCODE7Bit { 19664523a1dSZiyue Zhang val VECTOR_ARITH = "b1010111".U 19764523a1dSZiyue Zhang} 198