每当提起CPU,‘卡脖子’这个词总会立刻浮现在许多人的脑海里。
x86和ARM的IP授权模式虽然便利,但其本质上的不自主与不可控,使得一旦遭遇限制,国内产业便可能面临一夜之间“无芯可用”的严峻局面。今天,我们来深入探讨一个被视为破局关键的技术路径——开源RISC-V芯片。

1. RISC-V概述及历史
RISC-V的故事始于加州大学伯克利分校。2010年夏天,Krste Asanovic教授带领他的两名学生Andrew Waterman和Yunsup Lee启动了一个为期三个月的项目。他们的目标明确:针对x86和ARM指令集架构复杂且受IP授权束缚的问题,开发一个简化、开放的替代方案。
RISC-V基金会于2015年作为非营利组织成立,最初的董事会由Bluespec、Google、Microsemi、NVIDIA、NXP、UC Berkeley和Western Digital七家单位组成,主席由Krste Asanovic教授担任。
如今,基金会的成员阵营已经十分庞大:

基金会负责为核心芯片架构制定标准、构建生态,所有标准均可公开免费下载。其旗下拥有超过1000家成员单位,包括高通、NXP、阿里巴巴和华为等行业巨头。成员有权使用RISC-V商标。RISC-V指令集架构采用开源BSD授权,任何企业、高校和个人都可以依据其架构指南设计自己的CPU。
秉持开放、中立的原则,RISC-V基金会总部从美国迁往瑞士,并于2020年3月完成注册,更名为RISC-V国际基金会。其CEO Calista Redmond曾撰文指出,RISC-V标准是免费和开放的,没有任何单一实体能够控制RISC-V技术。企业、学术界和机构都可以自由地在RISC-V上进行创新,共同推动计算前沿的发展。
自诞生以来,市场上已涌现数十个版本的RISC-V内核和SoC芯片。其中一部分是开源免费的,而商业公司开发的内核和平台则需要授权。西部数据的SweRV架构是典型代表,它是一个32位顺序执行指令架构,采用28nm工艺,频率达1.8GHz,已在西部数据的存储控制器中使用,且本身是一个开源项目。
开源内核如伯克利分校的Rocket Core(RV64)和BOOM Core,苏黎世理工大学的Zero-riscy(RV32)和R15CY Core(面向超低功耗),都非常适合研究与教学。但要用于商业芯片设计,仍需大量工程化工作。
由创始人之一Yunsup Lee创立的SiFive公司,在2017年发布了首个RISC-V内核SoC平台家族及配套开发板,包括支持Linux的64位多核CPU U500和面向低成本物联网的E300处理器。
国产处理器芯片起步较晚,集成电路进口额常年高企。RISC-V与AI芯片被普遍认为是国内最有希望实现突破的领域。目前,RISC-V的应用主要集中在生态依赖相对较小的嵌入式系统,以及物联网、边缘计算、人工智能等新兴领域。随着产业界和社区的支持日益广泛,越来越多企业开始重视RISC-V,其应用前景非常乐观。
2. RISC-V指令集特点
CPU所支持的所有指令及其字节级编码,构成了它的指令集架构。ISA是连接计算机软硬件的桥梁。不同的CPU家族,如x86、PowerPC和ARM,拥有不同的ISA。RISC-V ISA的开源,确切地说,是其指令集规范和标准的开源。
RISC-V是基于精简指令集计算原理建立的开放指令集架构,它是在指令集技术不断演进的基础上构建的全新设计。RISC-V ISA可以免费使用,允许任何人设计、制造和销售RISC-V芯片和软件。

RISC-V(读作“risk-five”)是一个全新的指令集体系结构,最初旨在支持计算机体系结构的研究与教学,现在也致力于成为工业实现的标准、免费、开放的体系结构。其官方定义的目标包括:
- 一个完全开放的ISA,可自由供学术界和工业界使用。
- 一个真正的ISA,适合直接硬件实现,而非仅用于模拟或二进制翻译。
- 避免对特定微体系结构风格或实现技术“过度设计”,但同时能高效利用各种技术实现。
- 包含一个小的基本整数ISA(可作为定制加速器基础或教学用途)和多个可选标准扩展,以支持通用软件开发。
- 支持修订的2008 IEEE-754浮点标准。
- ISA支持丰富的用户级扩展和各种变种。
- 对应用程序、操作系统内核、硬件实现提供32位、64位地址空间变种。
- 支持高度并行的多核、众核及异构多处理器实现。
- 支持可选的变长指令,以扩展编码空间,提高性能、代码密度和能效。
- 一个可完全虚拟化的ISA,以简化虚拟机监控管理器的开发。
- ISA支持新的管理员级和虚拟机监控管理级ISA设计。
3. 关于RISC-V的“V”
RISC-V这个名字,代表了加州大学伯克利分校设计的第五代主要RISC ISA(前四代为RISC-I, RISC-II, SOAR和SPUR)。罗马数字“V”也暗含了“变种”和“向量”之意,旨在支持包括各种数据并行加速器在内的体系结构研究。
4. 发明者为何要开发一个新的ISA?
关于创建RISC-V的初衷,发明者们给出了解释:他们对在硬件上实现研究思想抱有浓厚兴趣,并希望为学生提供真实的设计体验(在伯克利,RISC-V处理器的RTL设计已用于多个课程)。在当前研究中,由于传统晶体管微缩带来的能耗限制,他们对特殊、异构的加速器尤其感兴趣。因此,他们需要一个高度灵活、可扩展的基础ISA作为研究基石。
他们经常被问到:“为何要开发一个新ISA?”使用现有商业ISA的最大优势在于其成熟、广泛支持的软件生态系统,包括开发工具和可移植应用,这在研究和教学中似乎是现成的资源。此外,还有大量的文档和教程。
然而,他们的经验表明,在科研和教学中使用商业指令集,实际获益甚微,且无法掩盖其固有缺陷:
- 商业ISA是私有的:绝大多数ISA所有者小心保护其知识产权,并不欢迎自由的竞争性实现。这对于希望分享真实硬件实现的研究小组,或希望创建全新实现的企业而言,是一个重大问题。RISC-V则承诺不会起诉任何实现者。
- 商业ISA仅流行于特定市场:例如,ARM在服务器领域支持不足,而x86在移动领域同样如此。这种市场割裂削弱了采用特定商业ISA的好处,因为软件生态也仅限于该领域。
- 商业ISA此起彼伏:以往基于SPARC、MIPS甚至Alpha等商业ISA构建的研究基础设施已不再流行或停产。这导致软件生态损失,且知识产权问题使得第三方难以持续支持。开放的ISA也可能失去流行度,但任何感兴趣者都可继续使用并发展其生态。
- 主流商业ISA过于复杂:x86和ARM为了支持现有软件栈和操作系统,其硬件实现异常复杂。糟糕的是,大量复杂性源于过时或糟糕的ISA设计,而非真正提升效率的特性。
- 仅有商业ISA不足以运行应用:运行现有应用需要一个完整的ABI,而ABI依赖库和操作系统支持。实现操作系统又需要管理员级ISA和设备接口,这些往往缺乏良好规范,实现比用户级ISA更复杂。
- 主流商业ISA未为可扩展性设计:随着指令集增长,其指令编码复杂度急剧增加。而Tensilica、ARC等公司的可扩展ISA主要瞄准嵌入式市场,非通用计算。
一个修改过的商业ISA实际上就是一个新的ISA。RISC-V团队的一个主要目标是支持体系结构研究,包括主要的ISA扩展。但即便是小扩展,也会削弱采用标准ISA的好处,因为需要修改编译器并重新编译应用。最终,一个修改的商业ISA会变成一个背负着历史包袱的新ISA。
他们坚信,ISA是整个计算系统中最重要的接口,没有理由将其私有化。主流商业ISA都基于超过30年前的设计。软件开发者应当能够面向一个开放标准的硬件目标,而商业处理器设计者应在实现质量上竞争。
他们并非第一个提出开放ISA的,例如OpenRISC就与他们的目标接近。但由于几个技术原因未采用OpenRISC:
- OpenRISC有条件码和分支延迟槽,增加了高性能实现的复杂性。
- 其32位定长指令和16位立即数阻碍了更密集的编码,限制了扩展空间。
- 不支持2008修订的IEEE-754浮点标准。
- 项目启动时,其64位设计尚未完成。
因此,他们决定从零开始设计一个符合所有需求的ISA。如今,围绕RISC-V ISA的基础设施投入巨大,包括文档、编译器工具链、操作系统移植、模拟器、FPGA/ASIC实现、测试套件和教学材料等。学术界和工业界对RISC-V的吸收日益增长,非盈利的RISC-V基金会(http://riscv.org)也随之成立,以保护和推进这一标准。
5. RISC-V指令集的优势
(1) 完全开源
RISC-V基金会不收取高额授权费。其采用宽松的BSD协议,企业可完全自由免费使用,同时也允许添加自有指令集而不必开放共享,利于实现差异化发展。
(2) 架构精简
主流的x86与ARM架构为保持向后兼容,保留了大量过时定义,导致指令数目庞大、文档浩瀚,开发门槛高。RISC-V则卸下历史包袱,借助成熟的体系结构技术轻装上阵。其基础指令集仅40余条,加上模块化扩展也仅几十条指令。规范文档极为精简。
(3) 易于移植操作系统
现代操作系统区分特权级与用户级指令以保证稳定。RISC-V明确提供了这两类指令,并给出了详细的规范,使开发者能方便地将Linux、UNIX等系统移植到RISC-V平台。
(4) 模块化设计
RISC-V架构短小精悍,且能以模块化方式组合,通过一套统一架构满足各种场景。用户可灵活选择模块组合以实现定制化需求,例如针对嵌入式场景选择RV32IC指令集和机器模式;针对高性能应用选择RV32IMFDC指令集和机器/用户模式。
(5) 完整的工具链
工具链是软件开发人员与CPU交互的窗口,其开发工作量巨大。采用RISC-V设计芯片,公司可专注于芯片设计本身,无需过度担忧工具链问题,因为RISC-V社区提供了完整的工具链并由基金会持续维护。目前对RISC-V的支持已合并到GCC、QEMU等主流工具中。
6. RISC-V的设计特点
1)没有立即数减法
只有立即数加法指令(addi),没有立即数减法指令(subi)。减法通过x+(-y)的数学等价原理实现,编译器负责将减数转化为负数,然后使用加法指令。这也决定了RISC-V将立即数作为有符号数处理。
2)x0寄存器简化指令集
引入恒为0且写入无效的x0寄存器后,许多特殊功能(如空操作、取负)只需用普通指令配合x0即可实现,显著减少了指令数量,简化了处理器解码电路。
3)32位常量的合成
ARM将大立即数存入常量池,通过LDR指令加载。RISC-V则完全通过指令拼接:lui指令加载高20位,addi指令加上低12位(由编译器计算)。两者均占用8字节程序空间,但RISC-V方式无需额外的内存访问周期。
4)只有小于和大于等于
比较跳转指令仅有blt(小于跳转)和bge(大于等于跳转)。通过交换两个操作数的位置,即可等价实现bgt(大于跳转)和ble(小于等于跳转)。
5)让编译器承担更多工作
RISC的设计哲学是“处理器尽量少做,编译器尽量多做”。上述特点以及B-type、J-type指令格式中立即数的特殊排列方式(旨在简化硬件设计),都将部分工作转移给了编译器和链接器。
6)其他被“省略”的常用指令
诸如nop、move、not、neg等常用指令均被省略,但其功能均通过其他指令序列等价实现。例如,not指令可用xori rd, rs, -1来实现。
7. RISC-V的x0寄存器
Linux有/dev/zero(永读之零)和/dev/null(弃写之洞)两个特殊设备。RISC-V的x0寄存器可谓是它们的硬件合体:读x0恒得0,写x0则值被丢弃。因此x0提供两大功能:一是提供最常用的常量0;二是提供一个丢弃结果的场所。
凭借x0,许多需要单独指令的操作,用普通指令配合x0即可实现:
nop空指令:用addi x0, x0, 0实现。
neg取负指令:用sub rd, x0, rs实现(即0-rs)。
j跳转指令:用jal x0, offset实现(下条指令地址写入x0后被丢弃)。
- 与0比较的跳转指令(如
beqz):用beq rs, x0, offset等普通比较跳转指令实现。
在云栈社区的计算机基础板块,你可以找到更多关于指令集架构、CPU设计以及编译原理的深度讨论与资源,这些知识能帮助你更透彻地理解像RISC-V这样的技术革新背后的逻辑。
参考资料:
- risc-v.org
- 《基于RISC-V的人工智能应用开发》
- 《深入理解RISC-V程序开发》
- 《计算机体系结构与SoC设计》
(来源:硬件十万个为什么)