xref: /XiangShan/src/main/scala/xiangshan/backend/decode/isa/bitfield/RiscvInst.scala (revision 99f369f9af5e6460594190dced390d936b62b309)
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