| // Copyright 2025 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // RiscV 64 bit G instruction decoder for testing assembler. |
| decoder RiscV64X { |
| opcode_enum = "isa64::OpcodeEnum"; |
| includes { |
| #include "mpact/sim/util/asm/test/riscv64x_decoder.h" |
| } |
| namespace mpact::sim::riscv::encoding64; |
| RiscVXInst32; |
| }; |
| |
| format Inst32Format[32] { |
| fields: |
| unsigned bits[25]; |
| unsigned opcode[7]; |
| }; |
| |
| format RType[32] : Inst32Format { |
| fields: |
| unsigned func7[7]; |
| unsigned rs2[5]; |
| unsigned rs1[5]; |
| unsigned func3[3]; |
| unsigned rd[5]; |
| unsigned opcode[7]; |
| overlays: |
| unsigned r_uimm5[5] = rs2; |
| }; |
| |
| // Format for shift immediate for RV64, note 6 bit immediate. |
| format RSType[32] : Inst32Format { |
| fields: |
| unsigned func6[6]; |
| unsigned r_uimm6[6]; |
| unsigned rs1[5]; |
| unsigned func3[3]; |
| unsigned rd[5]; |
| unsigned opcode[7]; |
| }; |
| |
| format IType[32] : Inst32Format { |
| fields: |
| signed imm12[12]; |
| unsigned rs1[5]; |
| unsigned func3[3]; |
| unsigned rd[5]; |
| unsigned opcode[7]; |
| overlays: |
| unsigned u_imm12[12] = imm12; |
| unsigned i_uimm5[5] = rs1; |
| }; |
| |
| format SType[32] : Inst32Format { |
| fields: |
| unsigned imm7[7]; |
| unsigned rs2[5]; |
| unsigned rs1[5]; |
| unsigned func3[3]; |
| unsigned imm5[5]; |
| unsigned opcode[7]; |
| overlays: |
| signed s_imm[12] = imm7, imm5; |
| }; |
| |
| |
| format UType[32] : Inst32Format { |
| fields: |
| unsigned imm20[20]; |
| unsigned rd[5]; |
| unsigned opcode[7]; |
| overlays: |
| unsigned u_imm[32] = imm20, 0b0000'0000'0000; |
| signed s_imm[32] = imm20, 0b0000'0000'0000; |
| }; |
| |
| format JType[32] : Inst32Format { |
| fields: |
| signed imm20[20]; |
| unsigned rd[5]; |
| unsigned opcode[7]; |
| overlays: |
| signed j_imm[21] = imm20[19, 7..0, 8, 18..9], 0b0; |
| }; |
| |
| instruction group RiscVXInst32[32] : Inst32Format { |
| addi : IType : func3 == 0b000, opcode == 0b001'0011; |
| lui : UType : opcode == 0b011'0111; |
| sd : SType : func3 == 0b011, opcode == 0b010'0011; |
| jal : JType : rd != 0, opcode == 0b110'1111; |
| j : JType : rd == 0, opcode == 0b110'1111; |
| slli : RSType : func6 == 0b000'000, func3==0b001, opcode == 0b001'0011; |
| ebreak : Inst32Format : bits == 0b0000'0000'0001'00000'000'00000, opcode == 0b111'0011; |
| srai : RSType : func6 == 0b010'000, func3==0b101, opcode == 0b001'0011; |
| jr : IType : rd == 0, func3 == 0b000, opcode == 0b110'0111; |
| }; |