Skip to content

Commit a439de5

Browse files
committed
add risc-v
1 parent 47db426 commit a439de5

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

docs/cs/Hardware/risc5.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
## **Immediate Encoding Variants(立即数编码变体)**
2+
3+
### 什么是立即数?
4+
**立即数**(Immediate)是指令中直接嵌入的一个常数值。例如,在指令 `addi x1, x2, 42` 中,`42` 就是立即数。CPU 执行时,会直接使用这个值进行计算。
5+
6+
---
7+
8+
### 为什么需要不同的编码方式?
9+
RISC-V 的指令长度固定为 **32 位**(基础指令集)。为了在有限的位数内高效存储立即数,RISC-V 设计了多种编码变体,将不同长度的立即数“拆解”到指令的不同位置中。这样既能节省空间,又能支持大范围的数值。
10+
11+
---
12+
13+
### RISC-V 的指令格式
14+
RISC-V 指令分为几种基本类型,每种类型对应不同的立即数编码方式:
15+
1. **I-Type**(立即数型,如 `addi`, `lw`
16+
2. **S-Type**(存储型,如 `sw`
17+
3. **B-Type**(分支型,如 `beq`, `bne`
18+
4. **U-Type**(高位立即数型,如 `lui`, `auipc`
19+
5. **J-Type**(跳转型,如 `jal`
20+
21+
每种类型的指令中,立即数的位置和组合方式不同。
22+
23+
---
24+
25+
### 具体编码方式
26+
#### 1. **I-Type**
27+
- **用途**:算术指令(如 `addi x1, x2, 100`)。
28+
- **立即数位置**:占据指令的 `[31:20]` 位(共 12 位)。
29+
- **符号扩展**:12 位立即数会被符号扩展为 32 位。
30+
- 例如:`100` → 二进制 `0000 0110 0100`(符号位为 0)。
31+
32+
#### 2. **S-Type**
33+
- **用途**:存储指令(如 `sw x1, 80(x2)`)。
34+
- **立即数位置**:被拆分为两部分:
35+
- `[11:5]`(高位)在指令的 `[31:25]` 位。
36+
- `[4:0]`(低位)在指令的 `[11:7]` 位。
37+
- **组合方式**:将高位和低位拼接成 12 位立即数,再符号扩展。
38+
39+
#### 3. **B-Type**
40+
- **用途**:条件分支指令(如 `beq x1, x2, label`)。
41+
- **立即数位置**:被拆分为四部分(共 12 位):
42+
- `[12]`(最高位)在指令的 `[31]` 位。
43+
- `[11]``[7]` 位。
44+
- `[10:5]``[30:25]` 位。
45+
- `[4:1]``[11:8]` 位。
46+
- **组合方式**:拼接后左移 1 位(因为分支目标必须是 2 字节对齐的),再符号扩展为 32 位。
47+
48+
#### 4. **U-Type**
49+
- **用途**:加载高位立即数(如 `lui x1, 0x12345`)。
50+
- **立即数位置**:占据指令的 `[31:12]` 位(共 20 位)。
51+
- **组合方式**:20 位立即数左移 12 位(填充低 12 位为 0),形成 32 位值。
52+
53+
#### 5. **J-Type**
54+
- **用途**:无条件跳转(如 `jal x1, label`)。
55+
- **立即数位置**:被拆分为四部分(共 20 位):
56+
- `[20]`(最高位)在指令的 `[31]` 位。
57+
- `[10:1]``[30:21]` 位。
58+
- `[11]``[20]` 位。
59+
- `[19:12]``[19:12]` 位。
60+
- **组合方式**:拼接后左移 1 位(跳转地址对齐),再符号扩展为 32 位。
61+
62+
---
63+
64+
### 为什么要拆解立即数?
65+
- **空间限制**:指令长度固定为 32 位,需要合理分配操作码、寄存器编号和立即数。
66+
- **灵活性**:通过不同的拆分方式,支持不同范围的立即数(例如,B-Type 支持 ±4KB 范围的分支)。
67+
- **硬件简化**:所有指令类型的高位位置固定(如符号位在 `[31]`),简化了硬件解码逻辑。
68+
69+
---
70+
71+
### 总结
72+
RISC-V 的 **Immediate Encoding Variants** 是一套巧妙的编码规则,将立即数拆解到指令的不同位置中。这种设计既节省了空间,又支持了从短立即数(12 位)到长立即数(20 位)的需求,同时保持了硬件解码的简洁性。对于初学者,记住以下几点即可:
73+
1. 不同指令类型对应不同的立即数编码方式。
74+
2. 立即数会被拆分到指令的特定位置,再组合成完整的值。
75+
3. 符号扩展和左移操作常用于处理大范围数值。

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ nav:
167167
- System 1:
168168
- Combinatorial Logic Design:
169169
- CLA: cs/Hardware/CLA.md
170+
- RISC-V: cs/Hardware/risc5.md
170171
- Verilog:
171172
- Wire:
172173
- Gate: cs/verilog0.md

0 commit comments

Comments
 (0)