1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
// Richard CPU
// Copyright (C) 2026 Richard Qin
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
// File path: rtl/core/include/rv64_pkg.sv
// Description: RISC-V 64-bit base instruction set global definition package
package rv64_pkg;
localparam XLEN = 64;
localparam INST_WIDTH = 32;
// RISC-V Base Opcode Map (inst[6:0])
// Reference: RISC-V Unprivileged ISA V20240411, Table 34
typedef enum logic [6:0] {
// Loads
OPCODE_LOAD = 7'b000_0011, // LB/LH/LW/LD/LBU/LHU/LWU
OPCODE_LOAD_FP = 7'b000_0111, // FLW/FLD
// Misc-Mem
OPCODE_MISC_MEM = 7'b000_1111, // FENCE / FENCE.I (Zifencei)
// Immediate ALU
OPCODE_OP_IMM = 7'b001_0011, // ADDI/SLTI/ANDI/ORI/XORI/SLLI/SRLI/SRAI...
OPCODE_OP_IMM_32 = 7'b001_1011, // ADDIW/SLLIW/SRLIW/SRAIW (RV64 only)
// Upper Immediate
OPCODE_AUIPC = 7'b001_0111, // AUIPC
OPCODE_LUI = 7'b011_0111, // LUI
// Stores
OPCODE_STORE = 7'b010_0011, // SB/SH/SW/SD
OPCODE_STORE_FP = 7'b010_0111, // FSW/FSD
// Atomic (A extension)
OPCODE_AMO = 7'b010_1111, // LR/SC/AMOSWAP/AMOADD/...
// Register ALU
OPCODE_OP = 7'b011_0011, // ADD/SUB/AND/OR/XOR/SLL/SRL/SRA/SLT/SLTU/MUL/DIV...
OPCODE_OP_32 = 7'b011_1011, // ADDW/SUBW/SLLW/SRLW/SRAW/MULW/DIVW... (RV64 only)
// Floating-point fused multiply-add
OPCODE_MADD = 7'b100_0011, // FMADD.S/D
OPCODE_MSUB = 7'b100_0111, // FMSUB.S/D
OPCODE_NMSUB = 7'b100_1011, // FNMSUB.S/D
OPCODE_NMADD = 7'b100_1111, // FNMADD.S/D
// Floating-point arithmetic
OPCODE_OP_FP = 7'b101_0011, // FADD/FSUB/FMUL/FDIV/FSQRT/FCMP/FCVT/FMV/FCLASS...
// Branches
OPCODE_BRANCH = 7'b110_0011, // BEQ/BNE/BLT/BGE/BLTU/BGEU
// Jumps
OPCODE_JALR = 7'b110_0111, // JALR
OPCODE_JAL = 7'b110_1111, // JAL
// System
OPCODE_SYSTEM = 7'b111_0011, // ECALL/EBREAK/CSR*/MRET/SRET/WFI/SFENCE.VMA
// Custom (reserved for extensions)
OPCODE_CUSTOM_0 = 7'b000_1011,
OPCODE_CUSTOM_1 = 7'b010_1011,
OPCODE_CUSTOM_2 = 7'b101_1011,
OPCODE_CUSTOM_3 = 7'b111_1011
} opcode_t;
// ALU Operation Encoding
// Derived from funct3 + funct7[5] of R-type / I-type instructions
typedef enum logic [3:0] {
ALU_ADD = 4'b0000, // Add
ALU_SUB = 4'b1000, // Subtract
ALU_SLL = 4'b0001, // Shift Left Logical
ALU_SLT = 4'b0010, // Set Less Than (signed)
ALU_SLTU = 4'b0011, // Set Less Than (unsigned)
ALU_XOR = 4'b0100, // Exclusive Or
ALU_SRL = 4'b0101, // Shift Right Logical
ALU_SRA = 4'b1101, // Shift Right Arithmetic
ALU_OR = 4'b0110, // Or
ALU_AND = 4'b0111 // And
} alu_op_t;
// Branch Operation Encoding
// Derived from funct3 of B-type instructions
typedef enum logic [2:0] {
BRANCH_EQ = 3'b000, // BEQ: Branch if Equal
BRANCH_NE = 3'b001, // BNE: Branch if Not Equal
BRANCH_LT = 3'b100, // BLT: Branch if Less Than (signed)
BRANCH_GE = 3'b101, // BGE: Branch if Greater Than or Equal (signed)
BRANCH_LTU = 3'b110, // BLTU: Branch if Less Than (unsigned)
BRANCH_GEU = 3'b111 // BGEU: Branch if Greater Than or Equal (unsigned)
} branch_op_t;
endpackage
|