From fda4f7a3ec798da305825ec4cab990cd07b131a0 Mon Sep 17 00:00:00 2001 From: chentianya Date: Mon, 24 Aug 2026 15:01:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=87=E4=BB=A4=E9=9B=86=E6=B8=85=E5=8D=95?= =?UTF-8?q?=EF=BC=9A=E6=96=B0=E5=A2=9E=20=C2=A71=20fmt=20=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E4=B8=8E=E5=AD=97=E6=AE=B5=E4=BD=8D=E5=8F=B7=EF=BC=88?= =?UTF-8?q?opcode/func/imm/rs1/rs2/rd=20=E9=80=90=E4=BD=8D=E6=A0=87?= =?UTF-8?q?=E6=B3=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 1.1 通用头部位号表(长度前缀/opcode/func/fmt) - 1.2 fmt 位号总表(11 形态 + 预留,操作数区 bit16 起) - 1.3 各位图:RR/RRR/IMM/SLOT/JMP/JC/CALL/CAL/NONE/SLOT+off/IMM64 逐位标注(含 pad 填充位);32B 预留格式待定 - 16B 形态分配 fmt 9(SLOT+off)/10(IMM64);指令编码.md 同步 - 原指令章节顺延为 2..12 --- Doc/isa/指令编码.md | 5 +- Doc/isa/指令集清单.md | 151 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 144 insertions(+), 12 deletions(-) diff --git a/Doc/isa/指令编码.md b/Doc/isa/指令编码.md index 5432183..33d85f6 100644 --- a/Doc/isa/指令编码.md +++ b/Doc/isa/指令编码.md @@ -88,9 +88,12 @@ RISC-V: opcode 决定指令的"功能族"(LOAD/STORE/OP/BRANCH…) | 6 | CALL | fn_id(独立格式,未合并) | | 7 | CAL | fb_id, slot(独立格式,未合并) | | 8 | NONE | 无操作数(RET/NOP) | -| 9..15 | 预留 | | +| 9 | SLOT+off | rd, slot, off(16B:结构体/FB 字段访问) | +| 10 | IMM64 | rd, imm64(16B:64 位立即数内嵌) | +| 11..15 | 预留 | | - **格式不合并**:fmt 4 位足够,CALL/CAL 保持独立格式(U1 闭合为"不合并") +- **16B 形态分配 fmt 9/10**:SLOT+off(字段访问)、IMM64(立即数内嵌)——fmt 4 位 16 空间:0..10 用 + 11..15 预留 ## 5. 长度组 × 格式族(操作数区) diff --git a/Doc/isa/指令集清单.md b/Doc/isa/指令集清单.md index 2590d98..e430e6c 100644 --- a/Doc/isa/指令集清单.md +++ b/Doc/isa/指令集清单.md @@ -13,7 +13,136 @@ - disasm 按 func 显示类型后缀(A7 定案):func=3 → `LOAD.I16 r5, s3` - 无类型指令(跳转/调用/RET/NOP/CAL)func 编码为 0(不使用) -## 1. 数据搬运 + + + +## 1. fmt 格式与字段位号 + +### 1.1 通用头部(字节 0 + 字节 1,所有指令相同) + +| 字段 | 位号 | 说明 | +|---|---|---| +| 长度前缀 | 4B: bit7 / 8B: bit7..6 / 16B: bit7..5 / 32B: bit7..4 | `1` / `01` / `001` / `0001` | +| opcode | 4B: bit6..0 / 8B: bit5..0 / 16B: bit4..0 / 32B: bit3..0 | 组内独立编号(0 起) | +| func | bit15..12 | 功能细节(宽度×符号/浮点),语义随 op | +| fmt | bit11..8 | 操作数形态(下表) | + +### 1.2 fmt 位号总表(操作数区 = bit16 起;pad = 对齐填充,编码固定 0) + +| fmt | 形态 | 长度组 | 操作数区字段位号 | +|---|---|---|---| +| 0 | RR | 4B | rd=23..16、rs=31..24 | +| 1 | RRR | 8B | rd=23..16、rs1=31..24、rs2=39..32、pad=63..40 | +| 2 | IMM | 8B | rd=23..16、imm32=55..24、pad=63..56 | +| 3 | SLOT | 8B | rd=23..16、slot32=55..24、pad=63..56 | +| 4 | JMP | 8B | off32=47..16、pad=63..48 | +| 5 | JC | 8B | rd=23..16、off32=55..24、pad=63..56 | +| 6 | CALL | 8B | fn_id32=47..16、pad=63..48 | +| 7 | CAL | 8B | fb_id16=31..16、slot32=63..32 | +| 8 | NONE | 4B | pad=31..16 | +| 9 | SLOT+off | 16B | rd=23..16、slot32=55..24、off32=87..56、pad=127..88 | +| 10 | IMM64 | 16B | rd=23..16、imm64=87..24、pad=127..88 | +| 11..15 | 预留 | 32B | 操作数区 30B(bit 240..16),格式待定 | + +### 1.3 各位图(bit 从左(高)到右(低);小端字节序:字节 0 = bit0..7 在右端) + +**fmt=0 RR(4B = bit31..0)** +```text +bit31 24 bit23 16 bit15 12 bit11 8 bit7 0 +┌────────────────┬────────────────┬───────────┬─────────┬───────────┐ +│ rs:8 (31..24) │ rd:8 (23..16) │ func:4 │ fmt:4 │ 前缀1+op:7 │ +└────────────────┴────────────────┴───────────┴─────────┴───────────┘ +``` + +**fmt=1 RRR(8B = bit63..0)** +```text +bit63 40 bit39 32 bit31 24 bit23 16 bit15 12 bit11 8 bit7 0 +┌─────────────────┬──────────┬──────────┬──────────┬─────────┬───────┬──────────┐ +│ pad:24 (63..40) │ rs2:8 │ rs1:8 │ rd:8 │ func:4 │ fmt:4 │ 前缀01+op6│ +│ │ (39..32) │ (31..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │ +└─────────────────┴──────────┴──────────┴──────────┴─────────┴───────┴──────────┘ +``` + +**fmt=2 IMM(8B = bit63..0)** +```text +bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0 +┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐ +│ pad:8 (63..56)│ imm32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │ 前缀01+op6│ +└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=3 SLOT(8B = bit63..0)** +```text +bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0 +┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐ +│ pad:8 (63..56)│ slot32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │前缀01+op6│ +└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=4 JMP(8B = bit63..0)** +```text +bit63 48 bit47 16 bit15 12 bit11 8 bit7 0 +┌──────────────┬─────────────┬─────────┬───────┬──────────┐ +│ pad:16 │ off32 (47..16)│ func:4 │ fmt:4 │前缀01+op6│ +│ (63..48) │ │ (15..12)│(11..8)│ (7..0) │ +└──────────────┴─────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=5 JC(8B = bit63..0)** +```text +bit63 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0 +┌───────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐ +│ pad:8 (63..56)│ off32 (55..24)│ rd:8 (23..16)│ func:4 │ fmt:4 │ 前缀01+op6│ +└───────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=6 CALL(8B = bit63..0)** +```text +bit63 48 bit47 16 bit15 12 bit11 8 bit7 0 +┌──────────────┬─────────────┬─────────┬───────┬──────────┐ +│ pad:16 │ fn_id32 │ func:4 │ fmt:4 │前缀01+op6│ +│ (63..48) │ (47..16) │ (15..12)│(11..8)│ (7..0) │ +└──────────────┴─────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=7 CAL(8B = bit63..0)** +```text +bit63 32 bit31 16 bit15 12 bit11 8 bit7 0 +┌────────────────┬──────────────┬─────────┬───────┬──────────┐ +│ slot32 (63..32)│ fb_id16 │ func:4 │ fmt:4 │ 前缀01+op6│ +│ │ (31..16) │ (15..12)│(11..8)│ (7..0) │ +└────────────────┴──────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=8 NONE(4B = bit31..0)** +```text +bit31 16 bit15 12 bit11 8 bit7 0 +┌──────────────────┬─────────┬───────┬──────────┐ +│ pad:16 (31..16) │ func:4 │ fmt:4 │ 前缀1+op7 │ +└──────────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=9 SLOT+off(16B = bit127..0)** +```text +bit127 88 bit87 56 bit55 24 bit23 16 bit15 12 bit11 8 bit7 0 +┌─────────────────┬──────────────┬──────────────┬──────────────┬─────────┬───────┬──────────┐ +│ pad:40 │ off32 │ slot32 │ rd:8 │ func:4 │ fmt:4 │ 前缀001+op5│ +│ (127..88) │ (87..56) │ (55..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │ +└─────────────────┴──────────────┴──────────────┴──────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=10 IMM64(16B = bit127..0)** +```text +bit127 88 bit87 24 bit23 16 bit15 12 bit11 8 bit7 0 +┌─────────────────┬────────────┬──────────────┬─────────┬───────┬──────────┐ +│ pad:40 │ imm64 │ rd:8 │ func:4 │ fmt:4 │ 前缀001+op5│ +│ (127..88) │ (87..24) │ (23..16) │ (15..12)│(11..8)│ (7..0) │ +└─────────────────┴────────────┴──────────────┴─────────┴───────┴──────────┘ +``` + +**fmt=11..15 预留(32B)**:操作数区 30B(bit 240..16),格式待实现时定稿。 + +## 2. 数据搬运 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| @@ -25,7 +154,7 @@ | STORE_OFF | 16B | `00100001` | SLOT+off | 全矩阵 0..9 | slot, off, rs | 字段写 | 核心 | | LOADK64 | 16B | `00100010` | IMM64 | 全矩阵 0..9 | rd, imm64 | 64 位立即数内嵌(免查表) | 预留 | -## 2. 逻辑与位运算 +## 3. 逻辑与位运算 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| @@ -47,7 +176,7 @@ > 注:SETBIT/CLRBIT/TOGBIT 的"目标可槽"形式(`slot, bit`)后续可在 16B 组扩展(op 预留)。 -## 3. 算术 +## 4. 算术 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| @@ -76,7 +205,7 @@ | FLOOR | 4B | `10010100` | RR(0) | 浮点 8/9 | rd, rs | 向下取整 | 扩展 | | CEIL | 4B | `10010101` | RR(0) | 浮点 8/9 | rd, rs | 向上取整 | 扩展 | -## 4. 比较 +## 5. 比较 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| @@ -87,13 +216,13 @@ | CMP_GT | 8B | `01010100` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 大于 | 核心 | | CMP_GE | 8B | `01010101` | RRR(1) | 全矩阵 0..9 | rd, ra, rb | 大于等于 | 核心 | -## 5. 转换 +## 6. 转换 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| | CONV | 4B | `10010110` | RR(0) | **目标类型** 0..9 | rd, rs | 类型转换(src 值已在寄存器,按目标 func 截断/扩展/舍入;舍入模式随目标为浮点→整数时取 TRUNC 语义) | 扩展 | -## 6. 控制流 +## 7. 控制流 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| @@ -105,7 +234,7 @@ | CAL | 8B | `01011110` | CAL(7) | — | fb_id, slot | 内建 FB 调用(fb_id 查 [[fb]] 表) | 核心 | | JTBL | 32B | `00010000` | 预留 | — | rd, slot, n | CASE 跳转表 | 预留 | -## 7. 内建 FB(CAL + fb_id,[[fb]] 表) +## 8. 内建 FB(CAL + fb_id,[[fb]] 表) | fb_id | FB | 字段(类型化) | 状态 | |---|---|---|---| @@ -124,7 +253,7 @@ | 12 | PWM | in/pt/q… | 扩展 | | 13 | RTC | 日期时钟字段 | 扩展 | -## 8. 字符串(未来,元数据段 + 16/32B) +## 9. 字符串(未来,元数据段 + 16/32B) | 指令 | 组 | 字节0 编码 | fmt | 语义 | 状态 | |---|---|---|---|---|---| @@ -138,7 +267,7 @@ | STR_FIND | 32B | `00010001` | 预留 | 查找 | 预留 | | STR_REPLACE | 32B | `00010010` | 预留 | 替换 | 预留 | -## 9. 数组(未来) +## 10. 数组(未来) | 指令 | 组 | 字节0 编码 | fmt | 语义 | 状态 | |---|---|---|---|---|---| @@ -146,13 +275,13 @@ | ARR_LOAD | 32B | `00010100` | 预留 | 索引读(基槽+index) | 预留 | | ARR_STORE | 32B | `00010101` | 预留 | 索引写 | 预留 | -## 10. 系统 +## 11. 系统 | 指令 | 组 | 字节0 编码 | fmt | func | 操作数 | 语义 | 状态 | |---|---|---|---|---|---|---|---| | NOP | 4B | `10000001` | NONE(8) | — | — | 空操作(占位/对齐) | 核心 | -## 11. op 预算核对(前缀编码按组分治) +## 12. op 预算核对(前缀编码按组分治) | 组 | op 空间 | 已分配 | 指令 | 余量 | |---|---|---|---|---|