【RISC-V设计-03】- RISC-V指令集之基本整数指令
文章目录
1. 基本指令简介
RV32I 是 RISC-V 指令集体系结构的一个基本指令集,其中“RV”代表 RISC-V,“32”表示 32 位,“I”表示整数(Integer)。这是所有 RISC-V 处理器都必须实现的指令集。RV32I 指令集的指令清单可以分为四大类,包括整数操作、加载与存储、控制转移(条件分支跳转和无条件跳转)以及杂项操作等。
2. 立即数运算指令
I型指令:立即数运算指令 | |||||||
---|---|---|---|---|---|---|---|
序号 | 指令 |
31
25
|
24
20
|
19
15
|
14
12
|
11
7
|
6
0
|
1 | ADDI | imm[11:0] | rs | 000 | rd | 0010011 | |
2 | SLTI | imm[11:0] | rs | 001 | rd | 0010011 | |
3 | SLTIU | imm[11:0] | rs | 011 | rd | 0010011 | |
4 | XORI | imm[11:0] | rs | 100 | rd | 0010011 | |
5 | ORI | imm[11:0] | rs | 110 | rd | 0010011 | |
6 | ANDI | imm[11:0] | rs | 111 | rd | 0010011 | |
7 | SLLI | 0000000 | shamt | rs | 001 | rd | 0010011 |
8 | SRLI | 0000000 | shamt | rs | 101 | rd | 0010011 |
9 | SRAI | 0100000 | shamt | rs | 101 | rd | 0010011 |
3. 寄存器运算指令
R型指令:寄存器运算指令 | |||||||
---|---|---|---|---|---|---|---|
序号 | 指令 |
31
25
|
24
20
|
19
15
|
14
12
|
11
7
|
6
0
|
1 | ADD | 0000000 | rs2 | rs1 | 000 | rd | 0110011 |
2 | SUB | 0100000 | rs2 | rs1 | 000 | rd | 0110011 |
3 | SLL | 0000000 | rs2 | rs1 | 001 | rd | 0110011 |
4 | SLT | 0000000 | rs2 | rs1 | 010 | rd | 0110011 |
5 | SLTU | 0000000 | rs2 | rs1 | 011 | rd | 0110011 |
6 | XOR | 0000000 | rs2 | rs1 | 100 | rd | 0110011 |
7 | SRL | 0000000 | rs2 | rs1 | 101 | rd | 0110011 |
8 | SRA | 0100000 | rs2 | rs1 | 101 | rd | 0010011 |
9 | OR | 0000000 | rs2 | rs1 | 110 | rd | 0110011 |
10 | AND | 0000000 | rs2 | rs1 | 111 | rd | 0110011 |
4. 加载与存储指令
I和S型指令:加载与存储指令 | |||||||
---|---|---|---|---|---|---|---|
序号 | 指令 |
31
25
|
24
20
|
19
15
|
14
12
|
11
7
|
6
0
|
1 | LB | imm[11:0] | rs | 000 | rd | 0000011 | |
2 | LBU | imm[11:0] | rs | 100 | rd | 0000011 | |
3 | LH | imm[11:0] | rs | 001 | rd | 0000011 | |
4 | LHU | imm[11:0] | rs | 101 | rd | 0000011 | |
5 | LW | imm[11:0] | rs | 010 | rd | 0000011 | |
6 | SB | imm[11:5] | rs2 | rs1 | 000 | imm[4:0] | 0100011 |
7 | SH | imm[11:5] | rs2 | rs1 | 001 | imm[4:0] | 0100011 |
8 | SW | imm[11:5] | rs2 | rs1 | 010 | imm[4:0] | 0100011 |
5. 无条件长跳转指令
U和UJ型指令:长跳转指令 | ||||||||
---|---|---|---|---|---|---|---|---|
序号 | 指令 | 31 |
30
21
| 20 |
19
15
|
14
12
|
11
7
|
6
0
|
1 | JAL | imm[20] | imm[10:1] | imm[11] | imm[19:12] | rd | 1101111 | |
2 | JALR | imm[11:0] | rs | 000 | rd | 1101111 |
6. 有条件分支指令
SB型指令:条件分支指令 | |||||||||
---|---|---|---|---|---|---|---|---|---|
序号 | 指令 | 31 |
30
25
|
24
20
|
19
15
|
14
12
|
11
8
| 7 |
6
0
|
1 | BEQ | imm[12] | imm[10:5] | rs2 | rs1 | 000 | imm[4:1] | imm[11] | 1100011 |
2 | BNE | imm[12] | imm[10:5] | rs2 | rs1 | 001 | imm[4:1] | imm[11] | 1100011 |
3 | BLT | imm[12] | imm[10:5] | rs2 | rs1 | 100 | imm[4:1] | imm[11] | 1100011 |
4 | BGE | imm[12] | imm[10:5] | rs2 | rs1 | 101 | imm[4:1] | imm[11] | 1100011 |
5 | BLTU | imm[12] | imm[10:5] | rs2 | rs1 | 110 | imm[4:1] | imm[11] | 1100011 |
6 | BGEU | imm[12] | imm[10:5] | rs2 | rs1 | 111 | imm[4:1] | imm[11] | 1100011 |
7. 立即数加载指令
U型指令:长立即数指令 | ||||
---|---|---|---|---|
序号 | 指令 |
31
12
|
11
7
|
6
0
|
1 | LUI | imm[31:12] | rd | 0110111 |
2 | AUIPC | imm[31:12] | rd | 0010111 |
8. 杂项操作指令
特殊型指令:杂项指令 | ||||||||
---|---|---|---|---|---|---|---|---|
序号 | 指令 |
31
28
|
27
24
|
23
20
|
19
15
|
14
12
|
11
7
|
6
0
|
1 | FENCE | 0000 | pred | succ | 00000 | 000 | 00000 | 0001111 |
2 | ECALL | 0000 0000 0000 | 00000 | 000 | 00000 | 1110011 | ||
3 | EBREAK | 0000 0000 0001 | 00000 | 000 | 00000 | 1110011 |
9. 指令集总结
RV32I 是 RISC-V 最为基础的指令。在之前的版本里,涵盖有 CSR 指令以及 Fence.I 指令。然而,在最新的规范当中,它们从 RV32I 中被移除,转而成为独立的 Z 扩展指令,即 Zicsr 和 Zifencei 。这种改变促使设计变得更为灵活。在某些资源受限但对特定功能需求不高的小型嵌入式系统中,开发者可以根据实际应用场景和资源状况,决定是否要引入这两种指令,从而更好地优化系统性能和成本。像一些简单的传感器控制单元,可能就无需强制实现这两个指令,以节省硬件资源和设计复杂度。