文章摘要
文章批评RISC-V指令集架构存在设计缺陷,包括过度可选性、缺失关键组件、编码不合理等问题,并质疑其所谓“修正方案”的有效性,认为设计者本应做得更好。
文章总结
好的,作为一名专业的中文编辑,我将对您提供的英文文章进行中文重述,保留核心观点和关键细节,同时删减与主题无关的冗余内容。
文章核心观点重述:RISC-V 架构的批判性分析
本文作者对 RISC-V 指令集架构(ISA)提出了尖锐的批评,认为其设计存在诸多根本性问题,远非其支持者所宣称的那么“卓越”。作者的核心观点是:RISC-V 的成功将主要归功于其免费和开放的特性,而非其设计本身的优越性。
一、 设计上的根本矛盾:试图“包罗万象”
RISC-V 的支持者声称它能同时胜任从最廉价的微控制器到顶级超级计算机的所有场景。作者认为这是不可能的,因为高端 CPU 和低成本 MCU 的需求是截然相反的。例如,廉价 MCU 追求极致的中断延迟和代码密度,而高端 CPU 则追求指令吞吐量和解码效率。试图用一个 ISA 满足所有需求,本身就是个错误。
二、 具体设计缺陷
中断处理效率低下:在廉价 MCU 这个核心应用场景中,RISC-V 的表现甚至不如十多年前的 Cortex-M0。作者通过计算中断处理所需的指令周期数(RISC-V 至少需要 44 个周期,而 Cortex-M0 仅需 27 个周期),证明了其劣势。RISC-V 需要大量软件指令来保存和恢复寄存器,而 Cortex-M0 则通过硬件自动完成。这迫使厂商开发非标准的“快速中断”扩展,反而破坏了标准的统一性。
压缩指令集(C 扩展)设计糟糕:RISC-V 的 16 位压缩指令在代码密度上表现不佳。例如,存储字节的指令,其偏移量范围仅为 0-3,远小于 Cortex-M0 的 0-31。更糟糕的是,这些有用的压缩指令(如存储字节、半字)甚至不属于核心的 C 扩展,而是被归入另一个可选的 Zcb 扩展中。
缺乏关键指令:
- 数组寻址:RISC-V 缺乏类似 ARM 的
[R0, R1, LSL #2]这种寄存器+移位寄存器的寻址模式。访问数组需要三条指令(移位、加法、访存),而 ARM 只需一条。虽然后来提出了 Zba 扩展(提供移位加法指令),但这将数组访问从三条指令缩短为两条,且代码体积更大。作者讽刺道,RISC-V 花了两年时间才“发现”数组的存在。 - 位测试与分支:没有一条指令能直接测试一个位并根据结果跳转,这需要两条指令和一个临时寄存器。作者通过分析一个 ARM64 内核镜像发现,平均每两个函数中就有一个会用到这类指令。
- 位域操作:缺乏位域提取和插入指令,而这些操作在处理网络包和硬件寄存器时非常常见。现有的 Zbs 扩展只支持单比特操作,被作者评价为“优雅但完全无用”。
- 数组寻址:RISC-V 缺乏类似 ARM 的
荒谬的指令编码:
- 立即数散乱分布:RISC-V 的立即数在指令字中随机分布,毫无规律,给硬件解码和软件模拟带来了巨大麻烦。作者认为,设计者声称的“相同位来自相同位置”的理由是站不住脚的,因为不同指令格式中,相同含义的位来自完全不同的位置。
- 压缩指令编码混乱:16 位压缩指令的编码格式多达 9 种(加上 Zcb 扩展后更多),且不同指令的立即数位序完全不同,如同“拼图游戏”。例如,跳转指令 C.J 的立即数位序为
11 4 9 8 10 6 7 3 2 1 5,毫无逻辑可言。 - 编码冲突:最严重的问题是,不同的扩展(如 Zcmp 和 D)对相同的指令编码赋予了完全不同的含义。这意味着,一个在旧 CPU 上运行正常的二进制程序,在新 CPU 上可能会因为指令含义的改变而静默地执行错误的操作(如浮点存储指令变成了跳转指令),导致极难调试的随机崩溃。作者强调,即使是编码以糟糕著称的 x86 架构,也保持了近 50 年的语义稳定性,而 RISC-V 在短短几年内就出现了这种致命问题。
三、 “可选性”的灾难
RISC-V 的几乎所有特性都是可选的:乘法、除法、用户模式、监管模式、CSR、压缩指令……作者认为,每将一个特性设为可选,就会将可能的实现分裂成两个不兼容的群体。最终导致“符合 RISC-V 规范”这句话变得毫无意义。
- 无法检测硬件特性:用于检测硬件特性的
misaCSR 本身是可选的,且其内容可以被硬件强制清零。这意味着用户态代码无法可靠地知道当前 CPU 支持哪些功能。 - 系统定时器:作为核心外设,其地址是“实现定义的”,没有统一标准。
- 中断向量模式:直接模式和向量模式都是可选的,导致编写通用操作系统内核变得极其困难。
作者认为,设计者用“虚拟化”和“Popek & Goldberg 虚拟化准则”来为这些设计辩护是站不住脚的。现代架构(如 x86 和 ARM)都通过内置的虚拟化支持解决了这些问题,而不是通过隐藏硬件信息。
四、 所谓的“修复”:Profile 标准
为了解决“无限可选性”带来的碎片化问题,RISC-V 基金会推出了“Profile”(如 RVA23),它规定了一组必须实现的“可选”扩展。作者讽刺道,这相当于为第一个标准打补丁,告诉人们哪些部分才是真正必须的。更糟糕的是,目前市面上几乎所有主流的 RISC-V 单板计算机(SBC)都不符合 RVA23 标准,这意味着它们将无法运行未来的 Ubuntu LTS 或 Android 系统。这反而进一步加剧了碎片化。
五、 结论与展望
作者认为,RISC-V 的设计问题源于“非我发明”的学术心态,以及委员会式的设计流程。
- RISC-V 不会失败:它将在廉价、一次性的微控制器市场取得成功,不是因为设计好,而是因为免费。对于性能要求不高的场景,“足够好”加上“零成本”是巨大的优势。
- 在高端计算领域前景有限:在需要真正高性能的桌面和服务器市场,RISC-V 的设计缺陷将使其难以与 ARM 或 x86 竞争。这个市场有足够的利润去购买设计更优的 ARM 核心授权,并获得更完善的软件生态支持。
总而言之,作者认为 RISC-V 是一个被过度吹捧的架构,其成功将主要归功于其商业模式,而非其技术设计的优越性。
评论总结
根据评论内容,总结如下:
主要观点与论据:
RISC-V存在设计缺陷(评分:无,但多位作者支持)
- 评论1(kev009)认为RISC-V“基本上是MIPS的翻版”,指出其设计问题。
- 评论6(exmadscientist)批评其“本应做得更好”,认为2020年仍犯1980年代的错误是“愚蠢或无知”。
- 评论7(brcmthrowaway)指出RISC-V始于学术项目,为适应工业需求不得不“打补丁”,令人遗憾。
RISC-V的灵活性与可选性既是优点也是问题(评分:无,观点分歧)
- 评论8(hn_submit)认为可选性是RISC-V的核心优势,市场可自行解决,且已在MCU领域占据主导。
- 评论10(IshKebab)承认批评属实,但认为问题被夸大,可选性对CPU设计影响不大,但给验证和软件移植带来麻烦。
- 评论11(Retr0id)以自身经历说明,从RV64IMA扩展到RVA23(含向量指令集)工作量巨大,不如直接模拟aarch64。
RISC-V的开放标准价值超越技术细节(评分:无,多位作者强调)
- 评论5(ethin)认为“开放ISA总比封闭好”,希望架构能最终修复问题。
- 评论15(bjornnn)强调RISC-V的意义在于“开放标准不受知识产权法限制”,为全球提供免于跨国公司勒索或地缘政治制裁的替代方案。
- 评论12(wren6991)作为爱好者,看重其“支持主流编译器且无需法律风险”,其他问题可后续修复。
性能与生态现状(评分:无,观点平衡)
- 评论14(eek2121)指出RISC-V在速度、功耗、面积上尚未超越顶级芯片,但在特定领域表现良好。
- 评论4(mappu)提到RVA23硬件已可用(如SpacemiT K3)。
- 评论10(IshKebab)认为RISC-V未达M系列性能的原因主要是“时间问题”,而非设计缺陷。
平衡性总结: - 批评方:聚焦设计缺陷(如指令编码浪费、可选性过多)、工业适配困难、性能落后。 - 支持方:强调开放标准的核心价值、灵活性优势、生态发展潜力,认为问题可随时间解决。 - 中立方:承认缺陷存在,但认为其他ISA也有类似问题,且RISC-V在特定领域(如MCU)已成功。