RISC-V RVA23 指令集调研:从可组合 ISA 到可部署应用基线

由 riscv-rva23-research.md 生成

RISC-V RVA23 指令集调研:从可组合 ISA 到可部署应用基线

本文由 AI 生成,生成时间:2026-09-07;规范内容已对照 RISC-V 官方 RVA23 v1.0 文档与 riscv-profiles 源码核实。
项目内容
密级公开
目标读者RISC-V CPU、编译器、Linux 与性能工程师
审核状态技术调研,待硬件实测补充
调研目的解释 RVA23 的软件契约、实现代价与采用条件
覆盖范围RVA23U64 / RVA23S64、工具链、内核与公开 IP;不含微架构跑分

版本历史

日期版本描述作者
2026-09-07v1.0初版:规范、机制、工具链与落地评估AI

术语说明

术语含义出处
RVARISC-V Application Profile,面向富操作系统应用的 ISA 特性集合RISC-V Profiles
RVA23U6464 位用户态应用基线RVA23 v1.0
RVA23S64含 supervisor 特权架构要求的 64 位系统基线RVA23 v1.0
VLEN矢量寄存器位宽;RVA23 不规定具体数值RISC-V V v1.0
PMAPhysical Memory Attributes,物理内存属性RISC-V Privileged ISA

可靠性标注约定

标注含义
C本地规范/源码或官方一手页面逐条核实
C*规范级稳定知识,基于官方规范解释
S单一公开来源,未完成独立交叉核验
P预测或工程推断
?未核实,禁止以估计替代

1. 核心判断(TL;DR)

  1. RVA23 不是一条新 CPU 指令,而是 64 位应用可假定的 ISA 合同。它把 RV64I 之外的 33 项扩展固定为 RVA23U64 必选项;软件首次可以默认存在 V、缓存块管理和条件操作,而不必逐芯片枚举能力。C
  2. 最大变化是 V 从 RVA22 的可选项升为必选项。但 VLEN 未固定,源码必须保持向量长度无关;有 RVV 不等于可假定 128/256 bit 寄存器。C
  3. RVA23U64 与 RVA23S64 必须分开看。前者定义用户态基线;后者才额外要求 Sv39、Sstc、Svinval 和 Sha 增强 Hypervisor。把 RVA23 必选 Hypervisor 泛化到 U64 是错误表述。C
  4. 工具链前端已形成 profile 名称接口,硬件仍处在过渡期。LLVM 在 2024-10 将 RVA23 profile 标为非实验;GCC/Binutils 的 2025 补丁已出现;Tenstorrent Ascalon 官方宣称合规。量产平台覆盖率没有统一公开统计。C / S / ?
  5. RVA23 解决的是二进制目标碎片化,不自动保证性能。可移植性来自固定能力集;性能仍受 VLEN、向量执行宽度、cache、内存和编译器调度支配,不能由 profile 名称推断。C*

2. RVA Profile 解决的是什么问题

RISC-V 的扩展自由组合带来二进制目标选择问题。仅写 rv64gc 会遗漏向量、CBO 或 Zicond;逐个写扩展又难与芯片、发行版和编译器保持一致。RVA profile 将这件事改为版本化契约。C

官方源码明确写出目标:让处理器厂商对齐某一代 ISA 特性,让软件供应商能够针对该代发布二进制。profile 不是 ABI,也不描述流水线、缓存容量或频率。C

工程含义:CPU 团队的交付物从支持一串扩展变为声明符合 RVA23U64/S64;发行版与性能库可据此减少 feature gate。但二进制仍要区分应用目标、系统目标与可选扩展。

2.1 U64、S64 与实现声明

层次RVA23U64RVA23S64适用对象
RV64I 基础与 33 项必选扩展必选必选应用与系统
用户态 V、Zvfhmin、Zvbb、Zvkt必选必选应用 SIMD/向量库
Sv39、Svpbmt、Svinval、Sstc不在 U64 定义内必选Linux / supervisor
Sha 增强 Hypervisor不在 U64 定义内必选虚拟化平台
Sv48 / Sv57不在 U64 定义内扩展选项更大虚拟地址空间

表中区分来自 rva23-src/src/rva23-profile.adoc:70-135, 215-332。C

工程含义:应用构建使用 -march=rva23u64;做 Linux、KVM 或固件验收时,必须额外检查 S64 的特权扩展,不能以 U64 合规替代系统合规。


3. 这份合同具体固定了什么

RVA23U64 有 RV64I 基础 ISA,及 33 项必选扩展。它们分为已有应用能力、从可选升格为基线的能力,以及为后续版本预留的可选能力。图 1 的数量来自规范逐项归类,非性能权重。C

图 1:RVA23U64 必选扩展分布
图 1:RVA23U64 必选扩展分布

图 1 显示,新增能力不是单一向量开关。整数/基础类仍占最大部分,因为 profile 同时固定了 CSR、计数器、PMA、失配访问和 reservation 语义;这让通用软件敢于假定行为一致。C

范畴必选扩展软件可直接假定的能力
基础整数与内存M、A、B、Zicsr、Zicntr、Zihpm、Ziccif、Ziccrse、Ziccamoa、Zicclsm、Za64rs乘除、原子、位操作、计数器、主存失配访问与 reservation 约束
浮点与压缩F、D、C、Zfhmin、Zfa、Zcb、ZcmopFP64、最小 FP16、额外 FP/压缩编码
向量V、Zvfhmin、Zvbb、ZvktRVV、向量最小 FP16、向量位操作、数据独立延迟
cache 与同步Zic64b、Zicbom、Zicbop、Zicboz、Zawrs64 B cache block、CBO、等待 reservation
选择与提示Zicond、Zihintpause、Zihintntl、Zimop无分支条件置零、暂停和 non-temporal hint
安全Zkt、Supm数据独立延迟语义、用户态指针掩码

列表与定义来自 rva23-profile.adoc:76-135。C

3.1 新增的 12 项必选能力

RVA23 保留 RVA22 的 21 项必选扩展,并新增 12 项:V、Zvfhmin、Zvbb、Zvkt、Zihintntl、Zicond、Zimop、Zcmop、Zcb、Zfa、Zawrs、Supm。规范明确指出 V 在 RVA22U64 中是可选项。C

图 2:RVA23 将 12 项能力升为应用基线
图 2:RVA23 将 12 项能力升为应用基线

图 2 的关键不是扩展数增加,而是部署假设改变:向量化库可以把 V 放入 baseline,仍必须对向量加密、CAS、BF16 和控制流完整性保留分发路径。C


4. 三个会改变软件写法的机制

4.1 V 成为基线,但 VLEN 仍是运行时变量

RVV 的核心不是固定 128 bit SIMD,而是以 vl 和 vtype 描述本次操作元素数与布局。编译器或手写汇编应以循环内设置 vl 的方式覆盖任意 VLEN。RVA23 要求 V,却没有给出 VLEN 下限之外的固定数值。C*

// 示意:向量长度无关的加法循环。编译器据 VLEN 重复设置 vl。
for (size_t i = 0; i < n; ) {
    size_t vl = __riscv_vsetvl_e32m1(n - i);
    vfloat32m1_t a = __riscv_vle32_v_f32m1(x + i, vl);
    vfloat32m1_t b = __riscv_vle32_v_f32m1(y + i, vl);
    __riscv_vse32_v_f32m1(z + i, __riscv_vfadd_vv_f32m1(a, b, vl), vl);
    i += vl;
}

工程含义:算法可将 RVV 作为通用代码生成目标,但调优仍要按 VLEN、LMUL、寄存器压力与内存带宽分平台测量。固定为 VLEN=256 的循环展开会损害其它合规实现的吞吐或代码尺寸。

4.2 固定 64 B cache block,让 CBO 的对象可移植

Zic64b 规定 cache block 为 64 B 且在地址空间自然对齐;Zicbom、Zicbop、Zicboz 分别提供管理、预取与置零。RVA23 因而让 DMA cache maintenance 和高带宽初始化能够统一以 64 B 为粒度设计。C

// 仅示意:实际 CBO 权限与内存属性由系统软件控制。
for (uintptr_t p = start & ~63UL; p < end; p += 64)
    asm volatile("cbo.clean (%0)" :: "r"(p) : "memory");

工程含义:驱动的对齐、批量清理和 buffer 分片可以以 64 B 为常量,但不能越过 Linux DMA API 直接在普通应用中发 CBO;cache 一致性模型、PMA 和特权约束仍由平台决定。

4.3 Zicond 将简单选择变成无分支数据路径

Zicond 的 czero.eqz / czero.nez 可按条件把一个源寄存器置零。将两个结果分别清零后再 OR,可实现无条件跳转的选择。它不是通用 predication,也不会替代 RVV mask。C*

# a0 = cond, a1 = x, a2 = y;x 在 cond!=0 时选中
czero.nez t0, a1, a0
czero.eqz t1, a2, a0
or         a0, t0, t1

工程含义:短条件选择可减少不可预测分支,但必须通过 profile 构建或运行时分发保证 Zicond 存在。对长基本块或有副作用的分支,仍应保留普通控制流。

4.4 Supm 和数据独立延迟:安全语义不是免费性能

Supm 要求执行环境至少可选 PMLEN=0 与 PMLEN=7 的用户态指针掩码。Zkt 与 Zvkt 则约束相应指令的数据独立执行延迟。它们提供硬件能力边界,不等价于整个程序自动常数时间。C

工程含义:指针掩码会暴露依赖高位地址标记的错误;加密实现即便使用 Zkt/Zvkt,也仍要审计 cache、分支、访问地址和调用路径。


5. S64:Linux 与虚拟化要增加的验收项

RVA23S64 继承 U64 的所有非特权必选项,并补充 Zifencei、Ss1p13、Svbare、Sv39、Svade、Ssccptr、Sstvecd、Sstvala、Sscounterenw、Svpbmt 和 Svinval。新增必选项还有 Svnapot、Sstc、Sscofpmf、Ssnpm、Ssu64xl 与 Sha。C

S64 特性解决的系统问题验收重点
Sv39 / Svpbmt / Svinval页表、内存类型与细粒度 TLB 失效MMU 与 IOMMU/设备内存组合测试
Sstcsupervisor 定时器中断tick、NOHZ、虚拟机 timer 注入
Svnapot连续页翻译大页、TLB 覆盖与 page fault 路径
Sscofpmf计数器溢出与按模式过滤perf 采样、虚拟化计数器隔离
Sha增强 Hypervisor 语义KVM 启动、嵌套/设备虚拟化能力声明

工程含义:S64 的目的不是让 Linux 能启动,而是固定 OS、性能分析和虚拟化框架可依赖的特权行为。只有 U64 的核心可跑用户程序,却不能宣称 RVA23 系统平台完整合规。


6. 生态进度:编译器、内核与硬件不是同一节奏

RVA23 的价值只有在编译器可指定、内核可识别、硬件真实执行三层都闭环后才会释放。图 3 按层展示已核实事实与待验证边界。

图 3:RVA23 生态闭环与证据边界
图 3:RVA23 生态闭环与证据边界

6.1 工具链

组件可核实状态证据等级工程判断
LLVM/Clang2024-10 的官方提交将 rva23u64 / rva23s64 从 experimental 标为非实验C可作为 profile 名称接口;仍应以所用发行版编译器实测为准
GCC2025-06 邮件列表补丁增加 profile 支持S补丁存在不等于已进入用户所用版本;构建前必须试编译
GNU Binutils2025-05 补丁增加 RVA23 profilesSassembler/linker 版本需与 GCC 配套验证
Linux公开追踪文章称 7.0-rc1 达到必选扩展覆盖S不是本报告核实的 mainline commit,不将其当作部署保证

推荐的编译期 gate 如下。命令是验证协议示例,未在本工作区交叉编译执行。P

clang --target=riscv64-linux-gnu -march=rva23u64 -mabi=lp64d -O3 app.c -o app
# 或在 CI 中显式失败:
riscv64-linux-gnu-gcc -march=rva23u64 -mabi=lp64d -c app.c

工程含义:不要只因编译器接受 profile 字符串就发布通用二进制。CI 应记录编译器 --version、-Q --help=target 输出、反汇编和运行时机器扩展声明。

6.2 硬件 IP 与芯片信号

实现公开信息与 RVA23 的关系证据等级
Tenstorrent Ascalon官方页面称 64-bit OoO superscalar、RVA23 compliant、256-bit vector data path已明确宣称 profile 合规C
StarFive Dubhe-100第三方报道为 RVA23 compliant、6-wide、15-stage、VLEN=256值得跟踪,未由本报告以官方 datasheet 交叉核实S
SiFive P670官方页面列 RVA22、V 1.0、Vector Crypto、两条 128-bit vector ALU说明前一代向量硬件已成熟;不应标为 RVA23C

硬件列表不是市场份额,也不是可获得开发板清单。公开产品能否以完整 S64、IOMMU、固件和发行版组合交付,仍需逐平台验收。?


7. 对性能工程的实际影响

7.1 可直接获益的工作负载

工作负载RVA23 新的可用假设优化方向不可推断的部分
线性代数、DSP、图像V 为必选RVV length-agnostic kernel;按 VLEN 调参向量 ALU 数、load/store 带宽、VLEN
memset、零页、缓冲区初始化Zicboz + 64 B block比较 cbo.zero 与 vector/scalar storeCBO 访存层级与 OS 许可策略
网络与存储Zicbop、Zicbom、Zic64b调整预取距离、DMA buffer 对齐cache 一致性与设备 DMA 行为
分支敏感整数代码Zicond用条件置零降低短不可预测分支编译器 cost model 与分支预测器
加密V、Zvkt、可选 Zvkng/Zvksg优先向量化;可选 crypto 做运行时分发可选扩展存在性、常数时间全路径

7.2 一个容易犯的性能错误

RVA23 不承诺 VLEN,也不承诺每周期的 vector issue 数。因此下列推理不成立:-march=rva23u64 → 有 256-bit vector → 某 kernel 必然快两倍。profile 只确认指令可执行。吞吐还取决于微架构,必须以目标 CPU 采样。C*

建议采用两层调优:第一层以 RVA23 生成不含非法指令的通用版本;第二层以 VLEN、cache 层级和特定实现做可选 tuned variant。前者解决可部署性,后者争取峰值性能。P

7.3 最小测量协议

目前没有可复现、跨多款 RVA23 芯片的统一 benchmark 数据,本报告不填充加速比。建议在同一内核、频率策略和内存配置下执行:

  1. 以 rv64gc、rva23u64 和平台 tuned 三个目标编译同一 benchmark;保存完整编译命令。
  2. 记录 vlenb、CPU 频率、内存通道、NUMA 与 governor;对每个 case 至少 30 次重复。
  3. 分开报告吞吐、p50/p99 延迟、cycles、instructions、vector 指令占比和内存带宽。
  4. 对 CBO、Zicond、vector crypto 分别给 feature-on/off 或替代实现,避免把多项变化归因到 profile。
  5. 对性能回退 case 保存反汇编,检查是否意外保留 scalar fallback 或产生过高的 LMUL/寄存器溢出。

工程含义:这套协议能回答 profile 带来的是“生成能力”还是“实际速度”,并把收益归因到具体 ISA 与微架构。


8. 采用策略与失败模式

8.1 建议的交付矩阵

交付目标推荐 target必要 gate
兼容现有 RISC-V Linuxrv64gc 或发行版基线现有硬件兼容性测试
明确 RVA23U64 设备群的应用rva23u64编译、启动、vector/CBO/Zicond smoke test
Linux/虚拟化平台应用 U64 + 平台 S64 验收MMU、timer、perf、KVM、DMA/IOMMU 测试
crypto 高性能变体U64 baseline + Zvkng/Zvksg variant运行时 extension dispatch 与安全回归

8.2 必须显式管理的失败模式

  1. 把 U64 当成 S64。应用能跑不证明 supervisor、KVM 或 timer 路径合规;以 S64 项目清单验收。C
  2. 假定固定 VLEN。在不同合规核上可能功能正确但性能退化;使用 vector-length-agnostic 主循环。C*
  3. 把 optional 当 mandatory。Zvkng、Zvksg、Zacas、BF16、Zicfilp/Zicfiss 均不能直接放进 U64 baseline;应编译分发版本。C
  4. 以 profile 推断加速比。没有跨芯片公开统一实测;按第 7.3 节测量。?
  5. 忽视 pointer masking。Supm 会让高位地址标记或未定义指针转换暴露问题;将 PMLEN 配置纳入 sanitizer 和回归。C*

9. 不确定性清单

缺口当前等级为什么不能下结论下一步证据
已量产 RVA23S64 SoC 列表与出货量?无统一官方追踪页和可复核市场数据厂商 datasheet、开发板 BSP、发行版认证记录
各实现 VLEN/向量吞吐/功耗?profile 不规定,公开资料不完整microbenchmark 与 PMU 数据
Linux mainline 的完整支持 commit 集合S本报告仅取得公开追踪文章,未 clone 内核逐项核对对照每项必选扩展的 arch/riscv commit
GCC/Binutils 已发布版本的完整 support matrixS已核实 2025 patch,未构建各发行版版本CI 试编译与 assembler test
Zvkng/Zvksg 在量产硬件的覆盖率?可选扩展,无集中登记目标 CPU ISA string + vendor manual

10. 参考来源

一手规范与源码(C)

  1. RVA23 Profiles v1.0,RISC-V Ratified Specifications Library
  2. riscv/riscv-profiles:src/rva23-profile.adoc,本地 shallow clone 核实:rva23-src/src/rva23-profile.adoc:70-201, 215-403。
  3. LLVM 提交:RVA23S64/RVA23U64 解除 experimental 标记
  4. Tenstorrent Ascalon 官方页面
  5. SiFive P600 Series 官方页面

工具链与生态(S)

  1. GNU Binutils RVA23 support patch,2025-05
  2. GCC RVA23S64 support patch,2025-06
  3. Linux v7.0-rc1 RVA23 coverage tracking article
  4. StarFive Dubhe-100 report

背景交叉阅读

  1. RISC-V International:RVA23 ratification announcement
  2. Ubuntu:why RVA23 is significant

附:方法说明

问题重述:RVA23 到底固定了什么,哪些能力能直接改写软件目标,生态是否已足以作为应用和系统基线?

检索与复核:先 clone riscv/riscv-profiles,以 rva23-profile.adoc 逐项核对 U64/S64、必选/可选及 line range;再对照 RISC-V ratified 文档、LLVM 官方邮件、厂商官方页面。GCC、Binutils、Linux 生态进度缺少本地源码复核,保留为 S。拒绝将宣传性性能词转写为跑分结论。

图表可复现:图 1/2 由 skills/document/scripts/figstyle.py + matplotlib 生成;数据来自本地 rva23-profile.adoc:76-194 的扩展计数。图 3 由 Graphviz 生成,展示证据链而非时间线或市场份额。源文件位于 .figs/rva23-ecosystem.dot。

标注口径:C 为本地源码或官方网页;C* 为规范稳定语义;S 为一条外部公开来源;P 为部署建议;? 为当前不能量化的事实。

结论边界:报告证明 profile 规范和若干生态接口存在,不证明任何特定芯片的性能、可获得性或完整 S64 系统合规。

复现命令:cd <repo> && python3 .figs/rva23-charts.py && dot -Tsvg .figs/rva23-ecosystem.dot -o reports/figures/rva23-ecosystem.svg。