1. 什么是Risc-V?
RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA),简易解释为开源软件运动相对应的一种“开源硬件”。该项目2010年始于加州大学柏克莱分校,但许多贡献者是该大学以外的志愿者和行业工作者。既然是全新的 ISA,为何其名字中有 V (five 罗马数字) ?这是因为,RISC-V 在 RISC-I 、RISC-II 、SOAR 和SPUR 项目的基础上,是加州大学伯克利分校的第五项 RISC ISA 的设计成果,因此我们将其命名为 RISC-V。还有一点原因是设计人员期望新的 ISA 可以很好地支持并行,V 也有 “Vector” 的含义。
与大多数指令集相比,RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件而不必支付给任何公司专利费。虽然这不是第一个开源指令集,但它具有重要意义,因为其设计使其适用于现代计算设备(如仓库规模云计算机、高端移动电话和微小嵌入式系统)。设计者考虑到了这些用途中的性能与功率效率。该指令集还具有众多支持的软件,这解决了新指令集通常的弱点。
RISC-V指令集的设计考虑了小型、快速、低功耗的现实情况来实做,但并没有对特定的微架构做过度的设计。截至2017年5月RISC-V已经确立了版本2.22的用户空间的指令集(userspace ISA),而特权指令集(privileged ISA)也处在草案版本1.10。
RISC-V(“RISC five”)的目标是成为一个通用的指令集架构(ISA – instruction set architecture):
- 它要能适应包括从最袖珍的嵌入式控制器,到最快的高性能计算机等各种规模的处理器。
- 它应该能兼容各种流行的软件栈和编程语言。
- 它应该适应所有实现技术,包括现场可编程门阵列(FPGA)、专用集成电路(ASIC)、全定制芯片,甚至未来的设备技术。
- 它应该对所有微体系结构样式都有效:例如微编码或硬连线控制; 顺序或乱序执行流水线; 单发射或超标量等等。
- 它应该支持广泛的专业化,成为定制加速器的基础,因为随着摩尔定律的消退,加速器的重要性日益提高。
- 它应该是稳定的,基础的指令集架构不应该改变。更重要的是,它不能像以前的专有指令集架构一样被弃用,例如AMD Am29000、Digital Alpha、Digital VAX、 Hewlett Packard PA-RISC、Intel i860、Intel i960、Motorola 88000、以及Zilog Z8000。
RISC-V 的不同寻常不仅在于它是一个最近诞生的指令集架构(它诞生于最近十年,而大多数其他指令集都诞生于20世纪70到80年代),而且在于它是一个开源的指令集架构。与几乎所有的旧架构不同,它的未来不受任何单一公司的浮沉或一时兴起的决定的影响(这一点让许多过去的指令集架构都遭了殃)。
它属于一个开放的,非营利性质的基金会。RISC-V基金会的目标是保持RISC-V的稳定性,仅仅出于技术原因缓慢而谨慎地发展它,并力图让它之于硬件如同Linux之于操作系统一样受欢迎。
图1.1列出了RISC-V基金会最大的企业成员,作为其活力的证明:
图1.2:x86指令集自诞生以来指令数量的增长。x86在1978年诞生时有80条指令,到2015年增长了16倍,到了1338条指令,并且仍在增长。令人惊讶的是这张图的数据仍显保守。2015年在英特尔的博客上有着3600条指令的统计结果[Rodgers and Uhlig 2017],这意味着x86指令的增长速率提高到了(在1978年到2015年之内)每四天增长一条。我们是用汇编语言指令计算的,他们想必算入了机器语言指令。正如第八章所解释的那样,这个增长的很大一部分是因为x86 ISA依赖于SIMD指令来实现数据级并行。
图1.3×86-32 ASCII Adjust after Addition(aaa)指令以二进制编码十进制数(BCD)形式进行计算机运算,这种方式已经被扔进信息技术历史的垃圾堆里。x86还有三个相似的指令,分别执行减法操作(aas),乘法操作(aam),和除法操作(aad)。由于他们都是单字节指令,它们加起来占用了宝贵的操作码空间的1.6%(4/256)。
2. RISC-V ISA设计原则
RISC-V ISA 总体的设计目标是什么?一句话概括,RISC-V ISA 要适用于几乎任何计算设备。这一目标带来了两个直观的结果:
- RISC-V 不能针对任何特定的架构进行设计,这是因为在某些体系结构上带来的好处可能在别的地方会花费非常大的代价。之前讨论的主流架构中,之所以有非常多缺点,是因为架构师做出了对原先的实现过度优化的决策(例如,MIPS 的延迟分支和 SPARC 的条件码)。避免“架构技术”在 RISC-V 设计中的影响,因为它只会给 RISC-V 的实现带来很小的好处,却给其他实现带来不必要的损失。
- 更重要的一点是,为了使 RISC-V 无处不在,RISC-V ISA 必须 open and free。开放标准的好处是多方面的,最重要的可能就是大量处理器实现;免费、开源将降低构建新系统的成本,它们与商业专营的实现的竞争将刺激微体系结构的创新;因为开放的实现可以提供第二种选择,对知识产权供应商垄断的担忧得到了缓解;如果采用同一标准和实现,那么学术界和工业界交流的障碍就会降低;开放的标准也可以改进一系列安全问题:商业间谍、爱干涉的政府等影响都会减弱
:)
。
之前说的目标过于笼统,在定义 RISC-V 前,应当有一个更加细化的特定技术目标:
- 将 ISA 分为小而基础的 base ISA 和可选扩展 ISA 。其中 base ISA 应当尽量小,适合教育和许多嵌入式处理器,但它必须足够完整,可以运行一个现代软件堆栈。扩展 ISA 可提高了计算工作性能,提供多进程的支持
- 同时支持 32 bit 和 64 bit ,因为 32 bit 更适合在小系统中使用,同时,还要预留给未来 128 位的机器
- 考虑自定义 ISA 扩展,提供包括紧密耦合的功能单元和松散耦合的协处理器单元
- 支持变长指令集,以提高代码密度,扩展自定义 ISA 的编码空间。
- 给现代标准提供便利的硬件支持,包括 IEEE-754 2008 中规定的浮点数运算标准,以及 C11 和 C++11 等编程语言。
- 严格正交化用户级与特权级的 ISA ,即严格分离用户级与特权级,并做到完全支持可虚拟化。支持在特权 ISA 下的实验,同时能维护用户应用程序 ABI 的兼容性。
3. 模块化与增量型 ISA
英特尔曾将其未来押在高端微处理器之上,但那时还需要很多年时间。为了对抗Zilog,英特尔开发了一款过渡产品,并给它起名为8086。它本应该是短命的,没有任何继任者,但事情并非如此。高端处理器姗姗来迟,等它最终出现时,它的性能并不如人意。因此,8086架构延续了下去——它变成32位处理器,最终演变为了64位处理器。它的名称不断变化(80186,80286,i386,i486,Pentium),但基础指令集保持不变。
计算机体系结构的传统方法是增量ISA,新处理器不仅必须实现新的ISA扩展,还必须实现过去的所有扩展。目的是为了保持向后的二进制兼容性,这样几十年前程序的二进制版本仍然可以在最新的处理器上正确运行。这一要求与来自于同时发布新指令和新处理器的营销上的诱惑共同导致了ISA的体量随时间大幅增长。例如,图1.2显示了当今主导ISA 80×86的指令数量增长过程。这个指令集架构的历史可以追溯到1978年,在它的漫长生涯中,它平均每个月增加了大约三条指令。
这个传统意味着x86-32(我们用它表示32位地址版本的x86)的每个实现必须实现过去的扩展中的错误设计,即便它们不再有意义。例如,图1.3描述了x86的ASCII Adjust after Addition(aaa)指令,该指令早已失效。
作为一个类比,假设一家餐馆只提供固定价格的餐点,最初只是一顿包含汉堡和奶昔的小餐。随着时间的推移,它会加入薯条,然后是冰淇淋圣代,然后是沙拉,馅饼,葡萄酒,素食意大利面,牛排,啤酒,无穷无尽,直到它成为一顿大餐。食客可以在那家餐厅找到他们过去吃过的东西,尽管总的来说这样做可能没什么意义。这样做的坏处是,用餐者为每次晚餐支付的宴会费用不断增加。
RISC-V的不同寻常之处,除了在于它是最近诞生的和开源的以外,还在于:和几乎所有以往的ISA不同,它是模块化的。
RISC-V 的核心是一个名为RV32I的基础ISA,运行一个完整的软件栈。RV32I是固定的,永远不会改变。这为编译器编写者,操作系统开发人员和汇编语言程序员提供了稳定的目标。模块化来源于可选的标准扩展,根据应用程序的需要,硬件可以包含或不包含这些扩展。这种模块化特性使得RISC-V具有了袖珍化、低能耗的特点,而这对于嵌入式应用可能至关重要。RISC-V编译器得知当前硬件包含哪些扩展后,便可以生成当前硬件条件下的最佳代码。惯例是把代表扩展的字母附加到指令集名称之后作为指示。例如,RV32IMFD将乘法(RV32M),单精度浮点(RV32F)和双精度浮点
(RV32D)的扩展添加到了基础指令集(RV32I)中。
继续用我们刚才的类比来说,RISC-V提供的是菜单,而不是一顿应有尽有的自助餐。主厨只需要烹饪顾客需要的东西(而不是每次都做出一顿盛宴),顾客只需要按他们的订单付费。RISC-V无需仅仅为了市场吸引力而添加指令。RISC-V基金会会决定什么时候在菜单里添加新的选项,而他们只会出于技术原因这样做,而且要在由软硬件专家组成的委员会进行专门的公开讨论以后才会添加。即使那些新选择出现在了菜单上,它们仍是可选的,不会像在增量ISA中那样成为未来所有实现的必要组成部分。