From 5b10c2c826b1bc228f3ae7c433c3233a2d2cbf76 Mon Sep 17 00:00:00 2001 From: chentianya Date: Mon, 24 Aug 2026 14:43:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E6=96=B0=E5=BB=BA?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E7=BC=96=E7=A0=81.md=E2=80=94=E2=80=94RISC-V?= =?UTF-8?q?=20=E5=BC=8F=20op+func=20=E7=BC=96=E7=A0=81=E5=AE=9A=E6=A1=88?= =?UTF-8?q?=E5=AD=98=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前缀长度组(1/01/001/0001 定 4/8/16/32B)+ op 按组分治 - 字节 1 = [func:4|fmt:4];func 10 组合(宽度×符号+F32/F64)语义随 op - fmt 4 位 9 格式(格式合并作废,CALL/CAL 独立) - 19 类型 → 10 func 编译期映射;BOOL 0/1 编译器强制 - 与 RISC-V 对照表 + 决策历史 --- Doc/isa/指令编码.md | 130 ++++++++++++++++++++++++++++++++++++++++++++ Doc/索引.md | 2 + 2 files changed, 132 insertions(+) create mode 100644 Doc/isa/指令编码.md diff --git a/Doc/isa/指令编码.md b/Doc/isa/指令编码.md new file mode 100644 index 0000000..5432183 --- /dev/null +++ b/Doc/isa/指令编码.md @@ -0,0 +1,130 @@ +# 指令编码(V2:RISC-V 式 op + func) + +> 状态:**定案存档**。本文独立存储 RISC-V 式指令编码设计(opcode 定功能、func 定细节), +> 与 [`指令集优化.md`](指令集优化.md)(格式/数据模型/待确认)配套。 +> 定案日期:2026-08-24。 + +## 1. 设计原则(RISC-V 式) + +```text +RISC-V: opcode 决定指令的"功能族"(LOAD/STORE/OP/BRANCH…) + funct3/funct7 决定"功能细节"(宽度/符号/变体) + lb 与 lbu 同一 opcode,funct3 区分符号 + +本方案: op 决定指令的"功能"(MOVE/LOAD/ADD…) + func 决定"功能的细节"(宽度/符号/浮点/变体) + func 的语义由 op 决定(随 op 变,不是全局统一表) +``` + +- **opcode 只决定指令的功能**;func 决定功能的细节 +- **func 语义随 op 变**:MOVE 的 func = 宽度;LOAD 的 func = 宽度×符号;ADD 的 func = 宽度×符号+浮点 + +## 2. 指令字结构(头两字节 + 操作数区) + +```text +指令 = 字节0 + 字节1 + 操作数区(rd/rs/slot/off…,按 fmt 与长度组) + +字节 0 字节 1 +[前缀 | op] [func:4 | fmt:4] + ↑ ↑ ↑ + 长度+主操作码 功能细节 操作数形态 +``` + +### 2.1 字节 0:长度前缀 + 主操作码(前缀编码,UTF-8/RISC-V 式) + +| 前缀(从最高位开始比对) | 指令长度 | op 位宽 | op 空间 | +|---|---|---|---| +| `1` | 4 字节 | 7 位 | 128 | +| `01` | 8 字节 | 6 位 | 64 | +| `001` | 16 字节 | 5 位 | 32 | +| `0001` | 32 字节(预留) | 4 位 | 16 | + +- **长度自描述**:前缀本身即长度,未来 64B 可续 `00001`(无限延伸) +- **op 按组分治**:各长度组的 opcode 独立编号(4B 的 MOVE=0 与 8B 的 LOAD=0 不冲突,前缀已区分) +- 取指:读字节 0 → 前缀判定长度 → 搬整条 + +### 2.2 字节 1:func + fmt(各 4 位) + +```text +[func:4 | fmt:4] + 高 4 位 = func 功能细节(宽度/符号/浮点) + 低 4 位 = fmt 操作数形态 +``` + +## 3. func 位段(4 位,16 种) + +| func | 语义 | 覆盖类型(编译期映射) | +|---|---|---| +| 0 | 1 字节、无符号 | BOOL、BYTE、USINT | +| 1 | 1 字节、有符号 | SINT | +| 2 | 2 字节、无符号 | WORD、UINT | +| 3 | 2 字节、有符号 | INT | +| 4 | 4 字节、无符号 | DWORD、UDINT、DATE | +| 5 | 4 字节、有符号 | DINT | +| 6 | 8 字节、无符号 | LWORD、ULINT、DT、TOD | +| 7 | 8 字节、有符号 | LINT、TIME | +| 8 | F32 | REAL | +| 9 | F64 | LREAL | +| 10..15 | 预留 | | + +- **func 语义随 op**: + - MOVE:只表达**宽度**(1/2/4/8B 搬运),不管符号/浮点 + - LOAD/STORE:宽度×符号(读几字节 + 符号/零扩展) + - ADD/SUB/MUL/DIV:宽度×符号(整数饱和)+ F32/F64(浮点 IEEE) + - 逻辑(AND/OR/NOT/位运算):宽度(BOOL 情况由编译器保证 0/1 输入) + - 跳转/调用/CAL/无类型指令:func 不使用(保留 0) +- **VM 只认 func**(10 种数据语义),无类型概念;类型语义全在编译层 + +## 4. fmt 位段(4 位,9 种格式 + 7 预留) + +| fmt | 形态 | 说明 | +|---|---|---| +| 0 | RR | rd, rs(MOVE/NOT/浮点单目) | +| 1 | RRR | rd, ra, rb(算术/比较/位运算) | +| 2 | IMM | rd, 32 位立即数(LOADK/CALL) | +| 3 | SLOT | rd, slot32(LOAD/STORE/CAL) | +| 4 | JMP | off32 | +| 5 | JC | rd, off(JT/JF) | +| 6 | CALL | fn_id(独立格式,未合并) | +| 7 | CAL | fb_id, slot(独立格式,未合并) | +| 8 | NONE | 无操作数(RET/NOP) | +| 9..15 | 预留 | | + +- **格式不合并**:fmt 4 位足够,CALL/CAL 保持独立格式(U1 闭合为"不合并") + +## 5. 长度组 × 格式族(操作数区) + +| 长度组 | 格式族 | 操作数区 | +|---|---|---| +| 4B | NONE / RR | rd + rs1(各 1B) | +| 8B | RRR / IMM / SLOT / JMP / JC / CALL / CAL | + rs2 + slot32/fn_id32/const_id32/off32 | +| 16B | SLOT+off(字段访问)/ IMM64 | + slot32 + off32/imm64 | +| 32B | 预留(JTBL/复杂字符串) | — | + +## 6. 类型系统(编译期)→ func 映射 + +- **编译期**:19 种 IEC 基础类型(BOOL/BYTE/WORD/DWORD/LWORD/SINT/INT/DINT/LINT/USINT/UINT/UDINT/ULINT/TIME/REAL/LREAL/DATE/TOD/DT),类型检查**严格比对**——类型不匹配编译期报错,不进 VM +- **BOOL 约束**:编译器限制 BOOL 只能填 0/1(TRUE/FALSE),其他值编译期报错;VM 无 BOOL 特例 +- **运行时**:VM 只认 func 的 10 种"宽度+符号+浮点"组合,机械执行 +- 位串(BYTE/WORD/…)与无符号整数同 func——运算语义由 **op** 区分(SHL 是位运算指令、ADD 是算术指令) +- TIME 用 8B 有符号 func(毫秒语义在编译层) +- 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释(A2 定案不变) + +## 7. 与 RISC-V 的对照 + +| | RISC-V | 本方案 | +|---|---|---| +| 主功能 | opcode[6:0] | 前缀 + op(按长度组分治) | +| 细节 | funct3(3 位)/ funct7 | func(4 位,10 组合) | +| 形态 | rd/rs1/rs2/imm 固定位置 | fmt(4 位,9 形态) | +| 宽度×符号 | lb/lbu/lh/lhu/lw/lwu/ld | func 0..9 全矩阵 | +| 指令长 | 定长 32 位(+RVC 压缩 16 位) | 变长 4/8/16/32B(前缀编码) | + +## 8. 决策历史 + +- 用户提出 RISC-V 式:opcode 只决定功能,func 决定细节(例:MOVE 按 func 分搬运宽度) +- func 4 位(16 种)够用;10 组合实际使用 +- MOVE 只搬宽度不管符号/浮点(例为示意,宽度按 func 全矩阵 1/2/4/8B) +- 19 类型 → 10 func 由编译器映射;类型检查严格,不匹配编译期报错 +- BOOL 编译器强制 0/1,越界报错 +- 字节 1 = [func:4 | fmt:4] → fmt 4 位 → **格式合并作废**(CALL/CAL 独立格式) diff --git a/Doc/索引.md b/Doc/索引.md index 4f3982a..3d4cd32 100644 --- a/Doc/索引.md +++ b/Doc/索引.md @@ -11,6 +11,7 @@ doc/ isa/指令配置.md isa/指令集优化.md isa/指令集清单.md + isa/指令编码.md compiler/编译管线.md compiler/STCompiler使用说明.md compiler/词法.md @@ -32,6 +33,7 @@ doc/ | [`isa/指令配置.md`](isa/指令配置.md) | ops.txt:指令登记唯一事实来源、OpTable、屏蔽机制 | | [`isa/指令集优化.md`](isa/指令集优化.md) | **V2 草案**:变长指令、槽表/值区、IEC 类型扩展、待确认问题 | | [`isa/指令集清单.md`](isa/指令集清单.md) | **V2 草案**:全功能指令清单(10 类 ~55 条,核心/扩展/预留) | +| [`isa/指令编码.md`](isa/指令编码.md) | **V2 定案**:RISC-V 式 op + func 编码(前缀长度组 / func 10 组合 / 19 类型映射) | | [`compiler/编译管线.md`](compiler/编译管线.md) | 编译器边界与管线 | | [`compiler/STCompiler使用说明.md`](compiler/STCompiler使用说明.md) | 构建、用法、工程文件、ST 子集、错误类别 | | [`compiler/词法.md`](compiler/词法.md) | 12.4 词法:关键字表、token、大小写、TIME 字面量 |