4. RISC-V架构入门:从诞生理念到模块化设计

说实话,我第一次接触RISC-V时,心里是有点抵触的。那时候ARM已经统治了嵌入式世界,我心想:又来一个新架构?能活多久?

但当我真正读完它的指令集手册,我意识到——这东西不一样。它背后藏着一种全新的设计哲学。

4.1 RISC-V的诞生:一个教授的小项目

2010年,加州大学伯克利分校的Krste Asanović教授团队,需要为一个项目选CPU架构。他们看了看ARM——授权费太贵。看了看x86——不开放。看了看OpenRISC——嗯,太老了,设计上也有不少问题。

于是他们决定:自己做一个。

这个「自己做一个」的项目,最初只是几个研究生在暑假里写的。谁也没想到,十几年后它会成为与ARM分庭抗礼的存在。

RISC-V的名字很有意思:

  • RISC:精简指令集计算机,这是它的血统
  • V:罗马数字5,代表这是伯克利的第五代RISC项目
  • 连起来读就是「RISC Five」,不是「RISC-V-E」

核心要点:RISC-V不是某家公司的产品,它是一个开放的指令集架构(ISA)标准。任何人都可以免费使用,不需要交授权费。

4.2 设计理念:少即是多

RISC-V的设计哲学,说白了就一句话:做减法

我见过太多架构,为了兼容老代码,背了几十年的历史包袱。x86里那些古董指令,现在谁还用?但为了兼容,芯片里必须留着那些电路。

RISC-V不一样。它从零开始,只保留最核心、最必要的指令。

举个例子:

  • ARM有超过1000条指令(ARMv8)
  • x86有超过1500条指令
  • RISC-V的基础指令集(RV32I)只有47条指令

47条!我当时看到这个数字,第一反应是:够用吗?

答案是:够。而且非常够。

我的经验:我在一个IoT项目中,用RV32I实现了完整的RTOS和TCP/IP协议栈。47条指令,一个都没多。简洁的指令集让编译器优化变得异常轻松,生成的代码密度甚至超过了ARM Thumb模式。

4.3 模块化设计:按需定制

RISC-V最聪明的设计,就是它的模块化架构

你想想看,一个智能手表的芯片和一个服务器的芯片,需要的指令集能一样吗?

传统架构的做法是:给你一个巨大的指令集,你用不用是你的事,但芯片里都得有。

RISC-V的做法是:我给你一个最小的核心,你需要什么功能,自己往上加。

这个核心就是基础指令集

基础指令集 位数 指令数 适用场景
RV32I 32位 47条 嵌入式、IoT
RV64I 64位 47条(地址宽度扩展) 应用处理器、服务器
RV128I 128位 47条(未来扩展) 高性能计算、AI

然后,RISC-V定义了一系列标准扩展

  • M扩展:整数乘除法指令。没有它,乘法得用软件模拟,慢得很
  • F扩展:单精度浮点。做DSP、传感器融合必备
  • D扩展:双精度浮点。科学计算、AI推理用得上
  • C扩展:压缩指令。代码密度提升25%-30%,我特别喜欢这个
  • A扩展:原子操作。多核同步的基石

组合方式很简单:RV32IMAC 表示32位基础指令集 + 乘除法 + 原子操作 + 压缩指令。

注意:不是所有扩展都能随便组合。比如F扩展依赖M扩展(浮点转整数需要乘除法),D扩展依赖F扩展。设计芯片时一定要检查依赖关系。

4.4 基础指令集:47条指令的优雅

RV32I的47条指令,分为几类:

  1. 算术运算:ADD、SUB、ADDI等。没有MUL和DIV,它们在M扩展里
  2. 逻辑运算:AND、OR、XOR、SLL、SRL等
  3. 比较指令:SLT、SLTU。比较结果存到寄存器里
  4. 分支跳转:BEQ、BNE、JAL、JALR。条件分支只有相等/不等,没有大于/小于
  5. 访存指令:LB、LH、LW、LBU、LHU、SB、SH、SW。对齐访问,简单粗暴
  6. 控制状态寄存器:CSRRW、CSRRS等。用于中断、异常处理

这里有个细节我特别欣赏:RISC-V没有条件码寄存器

ARM和x86都有标志位(N、Z、C、V),每次运算都会更新。这在乱序执行中会造成很大的麻烦——指令之间的依赖关系太复杂了。

RISC-V的做法是:比较指令直接把结果写到通用寄存器。分支指令直接读寄存器。干净、利落、没有副作用。

// 一个简单的循环:计算1到100的和
// RISC-V汇编示例

    li    a0, 0       // sum = 0
    li    a1, 1       // i = 1
    li    a2, 100     // limit = 100
loop:
    add   a0, a0, a1  // sum += i
    addi  a1, a1, 1   // i++
    blt   a1, a2, loop // if i < 100, goto loop
    // 结果在a0中

你看,没有标志位,没有复杂的寻址模式。每条指令做一件事,清清楚楚。

4.5 开源与开放标准:不只是免费

很多人以为RISC-V的优势就是「免费」。其实没那么简单。

开源的是指令集规范,不是芯片设计。

你可以免费下载RISC-V的指令集手册,但你不能免费下载一个RISC-V处理器的GDSII文件。你得自己设计,或者买别人的IP核。

那RISC-V到底开放了什么?

  • 指令集规范:完全公开,任何人都可以阅读、实现
  • 扩展机制:你可以自定义指令,不需要任何人批准
  • 生态工具:GCC、LLVM、Linux、FreeRTOS都已支持

我曾经在一个AI加速器项目中,给RISC-V加了一条自定义的矩阵乘法指令。从定义指令编码,到修改编译器,到设计硬件,整个过程不到两周。这在ARM上?想都别想。

开放标准的意义:你不再被某一家公司绑定。你可以选择不同的RISC-V核供应商,甚至自己设计。你的软件生态是通用的,换一个核,重新编译就行。

当然,开放也有代价。没有统一的ARM那样的一致性测试。你买的RISC-V核,可能和另一个供应商的核在行为上有细微差异。嗯,这需要你在选型时多留个心眼。

4.6 一张图看懂RISC-V架构

下面这张图,是我梳理的RISC-V知识体系。你可以把它当作本章的「地图」:

RISC-V 架构知识体系 RISC-V ISA 设计理念:精简、模块化、可扩展 基础指令集:RV32I / RV64I(47条指令) 标准扩展:M(乘除) F(单精度浮点) D(双精度) C(压缩) A(原子) 开源生态:GCC/LLVM/Linux/FreeRTOS 全面支持 自定义扩展:自由添加专用指令,无需授权 核心哲学 最小核心 按需组合 工具链 差异化

这张图展示了RISC-V的五个层次:从核心哲学,到基础指令集,到标准扩展,再到开源生态和自定义扩展。每一层都建立在前一层之上。

4.7 我的建议:什么时候选RISC-V?

做了这么多年芯片,我总结了几条选型经验:

  • 如果你在做IoT、传感器、可穿戴设备:RISC-V的简洁性和低功耗优势非常明显。RV32IMC组合,代码密度高,功耗低,成本低。
  • 如果你在做AI加速器、专用处理器:RISC-V的自定义扩展能力是杀手锏。你可以把最耗时的运算做成一条指令,性能提升10倍以上。
  • 如果你在创业,预算有限:RISC-V没有授权费,没有版税。省下来的钱,可以多雇两个工程师。
  • 如果你在做手机SoC、高端服务器:嗯,目前RISC-V的生态还不够成熟。ARM和x86仍然是更稳妥的选择。

一个小技巧:如果你不确定RISC-V是否适合你的项目,可以先在FPGA上跑一个RISC-V软核(比如SweRV或VexRiscv)。花几百块钱,一周时间,就能得到真实的性能数据。比看PPT靠谱多了。

RISC-V不是万能的,但它给了我们一个选择。一个不受制于任何公司的选择。对我来说,这就够了。


公众号:蓝海资料掘金营,微信deep3321