第二章:指令集架构对比

好,咱们进入正题。ARM 和 RISC-V 最根本的区别,就在指令集架构上。说白了,就是它们各自用什么样的“语言”来指挥硬件干活。我做了这么多年芯片,见过太多工程师只盯着主频和功耗,却忽略了指令集这个底层逻辑。其实,它决定了你整个系统的设计哲学。

ARM 的复杂指令集特点

ARM 走的是复杂指令集路线,也就是 CISC 风格。但注意,ARM 并不是纯正的 CISC,它其实是 RISC 内核加上 CISC 的扩展。我个人习惯把它叫做“混合体”。

ARM 指令集最大的特点是什么?指令功能强大,一条指令能干很多事。比如,一条 LDM 指令可以一次加载多个寄存器。这在处理大量数据时特别爽。

核心特点:

  • 条件执行:几乎所有指令都可以带条件。比如 ADDEQ R0, R1, R2,只有在上次比较结果相等时才执行加法。这能减少分支跳转,提高代码密度。
  • 多种寻址模式:ARM 有 9 种以上寻址方式。前索引、后索引、偏移量等等。我记得刚学 ARM 时,被这些寻址模式绕晕过。
  • 桶形移位器:ARM 的特色。可以在一条指令里完成移位和运算。比如 ADD R0, R1, R2, LSL #2,把 R2 左移 2 位后再加 R1。
  • Thumb/Thumb-2 指令集:为了节省代码空间,ARM 搞了 16 位的 Thumb 指令。后来进化到 Thumb-2,混合 16/32 位指令。我在做低功耗 IoT 芯片时,Thumb-2 帮了大忙。

嗯,这里要注意。ARM 的复杂也带来了问题。指令长度不固定,解码器设计复杂。我在项目中遇到过,ARM 的硬件解码器占的面积比 RISC-V 大不少。你想想看,同样的工艺下,ARM 核心面积更大,成本自然就上去了。

RISC-V 的简洁指令集特点

RISC-V 走的是纯正 RISC 路线。它的设计哲学就是“少即是多”。我刚开始接触 RISC-V 时,第一反应是:这也太简单了吧?

RISC-V 的指令集分为基础指令集和扩展指令集。基础指令集只有几十条指令,而且都是固定 32 位长度。这带来了几个好处:

  • 解码简单:固定长度,解码器设计极其简单。硬件实现起来,面积小、功耗低。
  • 模块化:你可以只选需要的扩展。比如做嵌入式,用 RV32I 基础集就够了。做高性能计算,再加向量扩展 V。我曾经给一个客户定制芯片,只用了基础集加乘除法扩展,整个核心面积比 ARM Cortex-M0 还小 30%。
  • 没有历史包袱:RISC-V 是全新设计的,没有兼容旧指令的负担。每条指令都经过精心设计,没有冗余。

避坑指南:我曾经以为 RISC-V 指令少,写汇编会很痛苦。其实不然。因为指令规整,编译器优化起来反而更高效。GCC 和 LLVM 对 RISC-V 的支持已经非常成熟了。

指令编码格式差异

这个差异很关键。我直接上对比表,大家看得更清楚。

特性 ARM (A32) ARM (Thumb-2) RISC-V (RV32)
指令长度 固定 32 位 16/32 位混合 固定 32 位
寄存器数量 16 个通用寄存器 8 个 (Thumb) / 16 个 (Thumb-2) 32 个通用寄存器
寻址模式 9 种以上 较少 4 种基本模式
条件执行 几乎所有指令 部分指令 仅分支指令
编码格式种类 多种 多种 6 种基本格式 (R/I/S/B/U/J)

为什么会这样?我解释一下 RISC-V 的编码格式。它只有 6 种基本格式:

  • R 型:寄存器-寄存器操作。比如加法 ADD rd, rs1, rs2
  • I 型:立即数操作。比如 ADDI rd, rs1, imm
  • S 型:存储指令。比如 SW rs2, imm(rs1)
  • B 型:条件分支。比如 BEQ rs1, rs2, offset
  • U 型:高位立即数。比如 LUI rd, imm
  • J 型:无条件跳转。比如 JAL rd, offset

每种格式的指令位域布局都非常规整。比如所有指令的 opcode 都在最低 7 位,rd 字段都在相同位置。这给硬件解码带来了极大便利。

举个例子:RISC-V 的 R 型指令编码如下:

funct7 | rs2 | rs1 | funct3 | rd | opcode
  7位  | 5位 | 5位 |  3位   | 5位 |  7位

你看,所有字段位置固定。解码器只需要简单的位提取和比较,不需要复杂的逻辑判断。

相比之下,ARM 的编码格式就复杂多了。不同指令类型有不同的位域布局,解码器需要根据 opcode 和条件码做多级判断。我当年做 ARM 解码器时,光是处理各种指令格式就写了上千行 Verilog 代码。而 RISC-V 的解码器,几百行就搞定了。

注意:RISC-V 的简洁也带来了一些限制。比如条件执行只在分支指令中支持,不像 ARM 那样几乎所有指令都能条件执行。这意味着在某些场景下,RISC-V 可能需要多写几条指令来实现同样的功能。但编译器优化通常能弥补这个差距。

最后说一句。指令集架构的选择,没有绝对的好坏。ARM 的复杂带来了更高的代码密度和更丰富的功能,适合对性能要求高的场景。RISC-V 的简洁带来了更低的硬件成本和更好的可定制性,适合嵌入式、IoT 等场景。我个人建议,选型时不要只看参数,要结合你的实际应用场景来定。