附录 A. RV64I 基础指令速查表
RV64I 是 RISC-V 64 位基础整数指令集,共 50 条基础指令(不含扩展)。所有指令按功能分组,按指令格式(R/I/S/B/U/J)组织编码。本节是完整速查表,供编程时快速查阅指令的操作语义、funct3 和 funct7 编码。
算术运算(R-type,opcode=0110011)
寄存器-寄存器操作。rs1、rs2 为源寄存器,rd 为目的寄存器。
| 指令 | 操作语义 | funct3 | funct7 |
|---|---|---|---|
add rd, rs1, rs2 | rd = rs1 + rs2 | 000 | 0000000 |
sub rd, rs1, rs2 | rd = rs1 - rs2 | 000 | 0100000 |
sll rd, rs1, rs2 | rd = rs1 << rs2[5:0] | 001 | 0000000 |
slt rd, rs1, rs2 | rd = (rs1 < rs2) ? 1 : 0(有符号) | 010 | 0000000 |
sltu rd, rs1, rs2 | rd = (rs1 < rs2) ? 1 : 0(无符号) | 011 | 0000000 |
xor rd, rs1, rs2 | rd = rs1 ^ rs2 | 100 | 0000000 |
srl rd, rs1, rs2 | rd = rs1 >> rs2[5:0](逻辑右移) | 101 | 0000000 |
sra rd, rs1, rs2 | rd = rs1 >> rs2[5:0](算术右移) | 101 | 0100000 |
or rd, rs1, rs2 | rd = rs1 | rs2 | 110 | 0000000 |
and rd, rs1, rs2 | rd = rs1 & rs2 | 111 | 0000000 |
注意:RV64I 中所有 R-type 算术指令默认为 64 位操作。RV32I 中同样指令操作 32 位数据。
立即数算术运算(I-type,opcode=0010011)
寄存器与 12 位有符号立即数操作。
| 指令 | 操作语义 | funct3 |
|---|---|---|
addi rd, rs1, imm | rd = rs1 + imm(符号扩展) | 000 |
slli rd, rs1, shamt | rd = rs1 << shamt(shamt[5:0],高位移出) | 001 |
slti rd, rs1, imm | rd = (rs1 < imm) ? 1 : 0(有符号) | 010 |
sltiu rd, rs1, imm | rd = (rs1 < imm) ? 1 : 0(无符号) | 011 |
xori rd, rs1, imm | rd = rs1 ^ imm | 100 |
srli rd, rs1, shamt | rd = rs1 >> shamt(逻辑,shamt[5:0]) | 101 |
srai rd, rs1, shamt | rd = rs1 >> shamt(算术,shamt[5:0]) | 101 |
ori rd, rs1, imm | rd = rs1 | imm | 110 |
andi rd, rs1, imm | rd = rs1 & imm | 111 |
移位立即数:slli/srli/srai 的 shamt 取低 6 位(0-63),funct7 用于区分 srli(0000000)和 srai(0100000),汇编器根据指令名自动填入。
RV64I 特有 32 位算术运算(R-type,opcode=0111011)
操作 32 位数据,结果符号扩展至 64 位写入 rd。
| 指令 | 操作语义 | funct3 | funct7 |
|---|---|---|---|
addw rd, rs1, rs2 | rd = sign_extend((rs1 + rs2)[31:0]) | 000 | 0000000 |
subw rd, rs1, rs2 | rd = sign_extend((rs1 - rs2)[31:0]) | 000 | 0100000 |
sllw rd, rs1, rs2 | rd = sign_extend(rs1[31:0] << rs2[4:0]) | 001 | 0000000 |
srlw rd, rs1, rs2 | rd = sign_extend(rs1[31:0] >> rs2[4:0] 逻辑) | 101 | 0000000 |
sraw rd, rs1, rs2 | rd = sign_extend(rs1[31:0] >> rs2[4:0] 算术) | 101 | 0100000 |
RV64I 特有 32 位立即数运算(I-type,opcode=0011011)
| 指令 | 操作语义 | funct3 |
|---|---|---|
addiw rd, rs1, imm | rd = sign_extend((rs1 + imm)[31:0]) | 000 |
slliw rd, rs1, shamt | rd = sign_extend(rs1[31:0] << shamt[4:0]) | 001 |
srliw rd, rs1, shamt | rd = sign_extend(rs1[31:0] >> shamt[4:0] 逻辑) | 101 |
sraiw rd, rs1, shamt | rd = sign_extend(rs1[31:0] >> shamt[4:0] 算术) | 101 |
注意:W 后缀指令的移位量仅取低 5 位(0-31)。slliw/srliw/sraiw 的 funct7 用于区分 srliw(0000000)和 sraiw(0100000)。
Load 指令(I-type,opcode=0000011)
从内存加载数据到寄存器。地址 = rs1 + imm(12 位有符号立即数)。
| 指令 | 位宽 | 符号扩展 | 操作语义 | funct3 |
|---|---|---|---|---|
lb rd, imm(rs1) | 8 | 是 | rd = sign_extend(M[rs1+imm][7:0]) | 000 |
lh rd, imm(rs1) | 16 | 是 | rd = sign_extend(M[rs1+imm][15:0]) | 001 |
lw rd, imm(rs1) | 32 | 是 | rd = sign_extend(M[rs1+imm][31:0]) | 010 |
ld rd, imm(rs1) | 64 | — | rd = M[rs1+imm][63:0] | 011 |
lbu rd, imm(rs1) | 8 | 零扩展 | rd = zero_extend(M[rs1+imm][7:0]) | 100 |
lhu rd, imm(rs1) | 16 | 零扩展 | rd = zero_extend(M[rs1+imm][15:0]) | 101 |
lwu rd, imm(rs1) | 32 | 零扩展 | rd = zero_extend(M[rs1+imm][31:0]) | 110 |
Store 指令(S-type,opcode=0100011)
将寄存器数据写入内存。地址 = rs1 + imm(12 位有符号立即数,inst[31:25] 存放 imm[11:5],inst[11:7] 存放 imm[4:0])。
| 指令 | 位宽 | 操作语义 | funct3 |
|---|---|---|---|
sb rs2, imm(rs1) | 8 | M[rs1+imm][7:0] = rs2[7:0] | 000 |
sh rs2, imm(rs1) | 16 | M[rs1+imm][15:0] = rs2[15:0] | 001 |
sw rs2, imm(rs1) | 32 | M[rs1+imm][31:0] = rs2[31:0] | 010 |
sd rs2, imm(rs1) | 64 | M[rs1+imm][63:0] = rs2[63:0] | 011 |
分支指令(B-type,opcode=1100011)
比较 rs1 与 rs2,条件满足时跳转至 PC + imm(imm 为 13 位有符号立即数,以 2 字节为单位的偏移量)。B-type 编码:inst[31]=imm[12],inst[7]=imm[11],inst[30:25]=imm[10:5],inst[11:8]=imm[4:1]。
| 指令 | 条件 | 说明 | funct3 |
|---|---|---|---|
beq rs1, rs2, label | rs1 == rs2 | 相等则跳转 | 000 |
bne rs1, rs2, label | rs1 != rs2 | 不等则跳转 | 001 |
blt rs1, rs2, label | rs1 < rs2 | 有符号小于 | 100 |
bge rs1, rs2, label | rs1 >= rs2 | 有符号大于等于 | 101 |
bltu rs1, rs2, label | rs1 < rs2 | 无符号小于 | 110 |
bgeu rs1, rs2, label | rs1 >= rs2 | 无符号大于等于 | 111 |
跳转指令
| 指令 | 格式 | 操作语义 |
|---|---|---|
jal rd, label | J-type | rd = PC+4; PC = PC + offset(21 位有符号立即数,2 字节对齐) |
jalr rd, imm(rs1) | I-type | rd = PC+4; PC = (rs1 + imm) & ~1 |
J-type 立即数编码:inst[31]=imm[20],inst[19:12]=imm[19:12],inst[20]=imm[11],inst[30:21]=imm[10:1]。最终跳转偏移 = {imm[20], imm[1], imm[11], imm[19:12], imm[10:5], imm[4:1], 1'b0}。
Load Upper / Add Upper 指令(U-type)
U-type 格式:20 位立即数存放于指令的 [31:12] 位,写入 rd 的高 20 位。
| 指令 | 格式 | 操作语义 | opcode |
|---|---|---|---|
lui rd, imm | U-type | rd = imm << 12(低 12 位填 0) | 0110111 |
auipc rd, imm | U-type | rd = PC + (imm << 12) | 0010111 |
系统指令(I-type,opcode=1110011)
| 指令 | 操作语义 | funct3 | 说明 |
|---|---|---|---|
ecall | 触发环境调用异常 | 000 | 系统调用 / 调试 |
ebreak | 触发断点异常 | 000 | 调试器断点 |
fence iorw, iorw | 内存访问顺序约束 | 001 | 多核/IO 同步 |
fence.i | 指令缓存同步 | 001 | 自修改代码后使用 |
ecall 和 ebreak 的 funct12 字段不同:ecall=000000000000,ebreak=000000000001。
控制状态寄存器(CSR)指令(I-type,opcode=1110011)
| 指令 | 操作语义 | funct3 |
|---|---|---|
csrrw rd, csr, rs1 | rd = CSR; CSR = rs1(原子读写) | 001 |
csrrs rd, csr, rs1 | rd = CSR; CSR = CSR | rs1(原子读后置位) | 010 |
csrrc rd, csr, rs1 | rd = CSR; CSR = CSR & ~rs1(原子读后清除) | 011 |
csrrwi rd, csr, uimm | rd = CSR; CSR = uimm(立即数原子读写) | 101 |
csrrsi rd, csr, uimm | rd = CSR; CSR = CSR | uimm(立即数读后置位) | 110 |
csrrci rd, csr, uimm | rd = CSR; CSR = CSR & ~uimm(立即数读后清除) | 111 |
rs1/uimm 为 x0 时,CSR 不写入(伪读操作)。rd 为 x0 时,CSR 旧值丢弃(伪写操作)。
opcode 速查表
| opcode[6:0] | 指令类型 | 格式 |
|---|---|---|
| 0110111 | lui | U-type |
| 0010111 | auipc | U-type |
| 1101111 | jal | J-type |
| 1100111 | jalr | I-type |
| 1100011 | 分支指令(beq/bne/blt/bge/bltu/bgeu) | B-type |
| 0000011 | Load 指令(lb/lh/lw/ld/lbu/lhu/lwu) | I-type |
| 0100011 | Store 指令(sb/sh/sw/sd) | S-type |
| 0010011 | 立即数算术(addi/slti/sltiu/xori/ori/andi/slli/srli/srai) | I-type |
| 0110011 | 寄存器算术(add/sub/sll/slt/sltu/xor/srl/sra/or/and) | R-type |
| 0011011 | RV64I 32 位立即数算术(addiw/slliw/srliw/sraiw) | I-type |
| 0111011 | RV64I 32 位寄存器算术(addw/subw/sllw/srlw/sraw) | R-type |
| 0001111 | FENCE / FENCE.I | I-type |
| 1110011 | 系统指令(ecall/ebreak/CSR) | I-type |
指令格式位域速查
| 格式 | 位域布局 |
|---|---|
| R-type | funct7[31:25] | rs2[24:20] | rs1[19:15] | funct3[14:12] | rd[11:7] | opcode[6:0] |
| I-type | imm[11:0][31:20] | rs1[19:15] | funct3[14:12] | rd[11:7] | opcode[6:0] |
| S-type | imm[11:5][31:25] | rs2[24:20] | rs1[19:15] | funct3[14:12] | imm[4:0][11:7] | opcode[6:0] |
| B-type | imm[12|10:5][31:25] | rs2[24:20] | rs1[19:15] | funct3[14:12] | imm[4:1|11][11:7] | opcode[6:0] |
| U-type | imm[31:12][31:12] | rd[11:7] | opcode[6:0] |
| J-type | imm[20|10:1|11|19:12][31:12] | rd[11:7] | opcode[6:0] |
指令数统计
| 类别 | 指令数 | 备注 |
|---|---|---|
| 寄存器算术 | 10 | add/sub/sll/slt/sltu/xor/srl/sra/or/and |
| 立即数算术 | 9 | addi/slli/slti/sltiu/xori/srli/srai/ori/andi |
| RV64 W 寄存器算术 | 5 | addw/subw/sllw/srlw/sraw |
| RV64 W 立即数算术 | 4 | addiw/slliw/srliw/sraiw |
| Load | 7 | lb/lh/lw/ld/lbu/lhu/lwu |
| Store | 4 | sb/sh/sw/sd |
| 分支 | 6 | beq/bne/blt/bge/bltu/bgeu |
| 跳转 | 2 | jal/jalr |
| Upper | 2 | lui/auipc |
| 系统 | 4 | ecall/ebreak/fence/fence.i |
| CSR | 6 | csrrw/csrrs/csrrc/csrrwi/csrrsi/csrrci |
| 合计 | 59 |