xref: /XiangShan/src/main/scala/xiangshan/backend/decode/isa/bitfield/RiscvInst.scala (revision dc4fac130426dbec49b49d778b9105d79b4a8eab)
1package xiangshan.backend.decode.isa.bitfield
2
3import chisel3._
4
5abstract class RiscvInst(bitWidth: Int) extends Bundle {
6  val inst: UInt = UInt(bitWidth.W)
7}
8
9class Riscv32BitInst extends RiscvInst(32) {
10  def ALL       : UInt  = inst
11  def OPCODE    : UInt  = inst( 6,  0)
12  def RD        : UInt  = inst(11,  7)
13  def FUNCT3    : UInt  = inst(14, 12)
14  def RS1       : UInt  = inst(19, 15)
15  def RS2       : UInt  = inst(24, 20)
16  def FUNCT7    : UInt  = inst(31, 25)
17  def OPCODE5Bit: UInt  = inst( 6,  2)
18  def OPCODE7Bit: UInt  = inst( 6,  0)
19}
20
21trait BitFieldsI { this: Riscv32BitInst =>
22  def IMM12   : UInt  = inst(31, 20)
23  def SHAMT6  : UInt  = inst(25, 20)
24  def SHAMT5  : UInt  = inst(24, 20)
25}
26
27trait BitFieldsS { this: Riscv32BitInst =>
28  def IMM5    : UInt  = inst(11,  7)
29  def IMM7    : UInt  = inst(31, 25)
30}
31
32trait BitFieldsCSR { this: Riscv32BitInst =>
33  def CSRIDX  : UInt  = inst(31, 20)
34  def CSRIMM  : UInt  = inst(19, 15)
35}
36
37trait BitFieldsFp { this: Riscv32BitInst =>
38  def FD      : UInt  = inst(11,  7)
39  def FS1     : UInt  = inst(19, 15)
40  def FS2     : UInt  = inst(24, 20)
41  def FS3     : UInt  = inst(31, 27)
42  def RM      : UInt  = inst(14, 12) // round mode
43  def CONV_SGN: UInt  = inst(24, 20)
44  def FMT     : UInt  = inst(26, 25)
45  def TYP     : UInt  = inst(21, 20)
46}
47
48trait BitFieldsVec { this: Riscv32BitInst =>
49  def VCATEGORY     : UInt  = inst(14, 12)
50  def NF            : UInt  = inst(31, 29)
51  def MEW           : UInt  = inst(28)
52  def MOP           : UInt  = inst(27, 26)
53  def VM            : UInt  = inst(25)
54  def LUMOP         : UInt  = inst(24, 20)
55  def SUMOP         : UInt  = inst(24, 20)
56  def WIDTH         : UInt  = inst(14, 12)
57  def VD            : UInt  = inst(11,  7)
58  def VS1           : UInt  = inst(19, 15)
59  def VS2           : UInt  = inst(24, 20)
60  def VS3           : UInt  = inst(11,  7)
61  def FUNCT6        : UInt  = inst(31 ,26)
62  def ZIMM_VSETVLI  : UInt  = inst(30, 20)
63  def ZIMM_VSETIVLI : UInt  = inst(29, 20)
64  def UIMM_VSETIVLI : UInt  = inst(19, 15)
65  def IMM5_OPIVI    : UInt  = inst(19, 15)
66
67  def getInstVType : InstVType = {
68    val res = Wire(new InstVType)
69    res.vlmul := ZIMM_VSETVLI(2, 0)
70    res.vsew  := ZIMM_VSETVLI(5, 3)
71    res.vta   := ZIMM_VSETVLI(6)
72    res.vma   := ZIMM_VSETVLI(7)
73    res
74  }
75
76  def isVecStore = {
77    this.OPCODE === "b0100111".U && (this.WIDTH === 0.U || this.WIDTH(2) === 1.B)
78  }
79
80  def isVecLoad = {
81    this.OPCODE === "b0000111".U && (this.WIDTH === 0.U || this.WIDTH(2) === 1.B)
82  }
83
84  def isOPIVV = {
85    this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH &&
86      this.FUNCT3 === "b000".U
87  }
88
89  def isOPFVV = {
90    this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH &&
91      this.FUNCT3 === "b001".U
92  }
93
94  def isOPMVV = {
95    this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH &&
96      this.FUNCT3 === "b010".U
97  }
98
99  def isOPIVI= {
100    this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH &&
101      this.FUNCT3 === "b011".U
102  }
103
104  def isOPIVX = {
105    this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH &&
106      this.FUNCT3 === "b100".U
107  }
108
109  def isOPFVF = {
110    this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH &&
111      this.FUNCT3 === "b101".U
112  }
113
114  def isOPMVX = {
115    this.OPCODE === xiangshan.backend.decode.isa.bitfield.OPCODE7Bit.VECTOR_ARITH &&
116      this.FUNCT3 === "b110".U
117  }
118}
119
120trait BitFieldsRVK { this: Riscv32BitInst =>
121  def RNUM          : UInt = inst(23, 20)
122
123  def isRnumIllegal = {
124    this.RNUM > 0xA.U
125  }
126}
127
128class XSInstBitFields extends Riscv32BitInst
129  with BitFieldsI
130  with BitFieldsS
131  with BitFieldsCSR
132  with BitFieldsFp
133  with BitFieldsVec
134  with BitFieldsRVK
135
136class InstVType extends Bundle {
137  val reserved = UInt(3.W)
138  val vma = Bool()
139  val vta = Bool()
140  val vsew = UInt(3.W)
141  val vlmul = UInt(3.W)
142}
143
144object OPCODE5Bit {
145  val LOAD      = "b00_000".U
146  val LOAD_FP   = "b00_001".U
147  val CUSTOM_0  = "b00_010".U
148  val MSIC_MEM  = "b00_011".U
149  val OP_IMM    = "b00_100".U
150  val AUIPC     = "b00_101".U
151  val OP_IMM_32 = "b00_110".U
152  val INST48b_0 = "b00_111".U
153
154  val STORE     = "b01_000".U
155  val STORE_FP  = "b01_001".U
156  val CUSTOM_1  = "b01_010".U
157  val AMO       = "b01_011".U
158  val OP        = "b01_100".U
159  val LUI       = "b01_101".U
160  val OP_32     = "b01_110".U
161  val INST64b   = "b01_111".U
162
163  val MADD      = "b10_000".U
164  val MSUB      = "b10_001".U
165  val NMSUB     = "b10_010".U
166  val NMADD     = "b10_011".U
167  val OP_FP     = "b10_100".U
168  val OP_V      = "b10_101".U
169  val CUSTOM_2  = "b10_110".U
170  val INST48b_1 = "b10_111".U
171
172  val BRANCH     = "b11_000".U
173  val JALR       = "b11_001".U
174  val RESERVED_0 = "b11_010".U
175  val JAL        = "b11_011".U
176  val SYSTEM     = "b11_100".U
177  val RESERVED_1 = "b11_101".U
178  val CUSTOM_3   = "b11_110".U
179  val INSTge80b  = "b11_111".U
180}
181
182object OPCODE7Bit {
183  val VECTOR_ARITH = "b1010111".U
184}
185