伯克利教授 Patterson 曾领导了 RISCⅠ的开发,他在其计算机体系结构一书1中提出了 “Eight Great Ideas in Computer Architecture”,分别是:
- Design for Moore’s Law
- Use Abstraction to Simplify Design
- Make the Common Case Fast
- Performance via Parallelism
- Performance via Pipelining
- Performance via Prediction
- Hierarchy of Memories
- Dependability via Redundancy
当然 CPU 背后的智慧也许远不止这些,因为 CPU 应该是最为复杂的数字电路了,也是发展速度最快的技术之一。微处理器自诞生后其性能大约以每年35%的增长速度增长。总体趋势是时钟频率越来越高,带宽越来越高,管脚越来越多。这些进步一方面得益于摩尔定律推动晶体管不断缩小,另一方面得益于计算机体系结构的创新。当然近些年由于功耗和散热问题,单核处理器性能增长的速度有所放缓,时钟频率基本不怎么提高了2。
在谈论 CPU 之前应该先明确几个概念:CPU、微处理器(Microprocessor)、微处理器核、SoC(System on chip)。CPU 称为中央处理器单元,简称为处理器。而微处理器与 CPU 在原理上其实没有多大区别,只是叫法习惯的问题。从历史发展来看微处理器的概念是随着集成电路的发展产生的,因为集成电路可以使设备越做越小,在集成电路出现之前的大型机里,中央单元还是叫 CPU 比较合适,自然不能称为微处理器。今天两个概念的区分度不是很高。至于 core 是处理器的核心部分,而 SoC 是将系统集成在了一块芯片上,包括了 CPU、GPU、DRAM、Modem(通信模块),ISP(图像处理),DSP(数字信号处理),Codec(编码器)等等。而下面要谈的 CPU 架构,主要是指 core 部分。
经过几十年的发展 CPU 架构已经有几十种了,比较出名的有 Intel x86、ARM、MIPS、SPARC、Power、RISC-V 等。那么大家谈论架构的时候指的是什么呢?一般来说 CPU 架构分为两种:指令集架构与微架构。指令集,顾名思义是一组指令的集合,而指令是指处理器进行操作的最小单元(譬如加减乘除操作或者读/写存储器数据)。有了指令集架构,便可以使用不同的处理器硬件实现方案来设计不同性能的处理器。处理器的具体硬件实现方案称为微架构(Microarchitecture )------微架构又称为微体系结构/微处理器体系结构,是在计算机工程中,将一种给定的指令集架构在处理器中执行的方法。一种给定指令集可以在不同的微架构中执行。
所以说指令集是 CPU 的灵魂,指令集架构是区分不同 CPU 的主要标准。
指令集架构分为复杂指令集架构(Complex instruction set computer)和精简指令集架构(Reduced instruction set computer)。CISC 以 X86 为代表,由于采取向前兼容的设计策略,指令集复杂,有许多专用的特殊指令,并且指令的长度也不是固定的。后来人们意识到大约20%的计算机指令完成大约80%的工作。这种想法促进了 RISC 架构的发展。
RISC 类 CPU 的指令功能单纯,种类较少。相对应地,CISC 类 CPU 的指令功能复杂,种类繁多。RISC 指令精简的好处是 CPU 内部构造可以简化,适合高速操作。但是在进行相同操作时,由于每一条指令都功能单纯,所以与 CISC 相比,它需要使用更多的指令数量。虽然 CISC 的内部构造复杂不适合高速操作,但进行相同处理时指令数比 RISC 要少。
RISC 架构最大的特点是只使用载入和存储指令访问内存,这种架构称为载入存储架构(Load/Store Architecture)。这样做的好处是可以简化指令集和流水线设计。在这种架构下,运算指令只能对寄存器中的数据进行操作。
RISC 和 CISC 两种架构各有所长,孰优孰劣不能一概而论。在追求高速运作的 CPU 的领域中,RISC 被认为更具优势。这些年,虽然 Intel 和 AMD 两家公司的 CPU 指令集依然是 CISC 的,但内部却将复杂指令分解为简单指令,使得内部可以像 RISC 一样工作。
在嵌入式设备和移动设备领域中最流行的指令集体系结构是 ARM。ARM 最初代表 Acorn RISC Machine,稍后被改为 Advanced RISC Machine。剑桥大学于1978年开发了第一个ARM处理器。1987年 Acron 计算机集团首次推出了 ARM 商用处理器。该 ARM 是由 ST Microelectronics、Motorola等公司开发的微控制器系列。ARM 体系结构分为几个版本,如 ARMv1、ARMv2 等,每个版本都有自己的优点和局限性。ARM cortex 是一个复杂的微控制器,具有 ARMv7 体系结构,Cortex 又分三个系列: A系列、R系列和M系列,A系列主要用于应用端,R系列用于实时应用(real-time),M系列用于微控制器。A系列具有高性能,设计用于在 Linux 或 Windows 中运行复杂系统。R系列用于具有实时要求的系统,比如网络设备或嵌入式控制系统。M系列用于物联网设备,可以与小型和高功率设备协作。
ARM 架构的特点如下:
2021年有外媒报道称,MIPS 架构的所属公司宣布,将放弃继续设计 MIPS 架构,全身心投入 RISC-V 阵营,至此,MIPS 逐渐走下神坛,成为历史。但是 MIPS 之前一度被业内认为可比肩 Arm、x86,其由图灵奖得主、谷歌母公司董事长 John Hennessy 创办,创办8年即上市,不可谓不辉煌,也令人惋惜不已。
MIPS,诞生于1981年,全称为 Microprocessor without Interlocked Pipeline Stage。它采用5级指令流水线,能够以接近每个周期一条指令的速率执行。最早的 MIPS 架构是32位,最新的版本已经变成64位。MIPS 架构有多个版本,包括 MIPS I、II、III、IV,以及 MIPS V,它们各是 MIPS32/64( 32位、64位的实现)发布的五个版本。
MIPS 的商业模式是做 IP 授权,企业成立早期也生产自己的处理器,而且他们在设计上非常具有前瞻性,成立第二年就推出了第一个处理器设计 R2000; 三年后推出了 R3000,其中 R3000 是其在市场上首款流行起来的产品,销售超过百万颗,后续的 R3000A 更是创造了过亿销售的记录。
MIPS 的落幕在于错失了智能手机时代。由于 MIPS 的产品从设计之初就以 Intel 的 X86 为对标产品,主打高性能; 而 Arm 从诞生开始就瞄准嵌入式低功耗领域。当 Arm 开始联合高通、苹果、联发科等公司面向智能手机市场打造移动处理器芯片的时候,MIPS 依然沉浸在高清盒子、打印机等小众产品市场。
另外值得一提的是由中国科学院计算技术研究所、龙芯中科、神州龙芯等机构、公司所设计的**龙芯(Loongson)**系列芯片(包括通用中央处理器、SoC、微控制器、芯片组等),最初采用 MIPS 架构,由 MIPS 科技公司授权使用 MIPS 指令集3。
RISC-V 架构于2010年诞生于加州大学伯克利分校。伯克利的开发人员之所以发明一套新的指令集架构 ,而不是使用成熟的 x86 或者 ARM 架构,是因为这些架构经过多年的发展变得极为复杂,并且存在着高昂的专利和架构授权问题。而且修改 ARM 处理器的 RTL 代码是不被支持的,而 x86 处理器的源代码根本不可能获得到。其他的开源架构(譬如 SPARC、 OpenRISC)均有着或多或少的问题。伯克利的教授与研发人员决定发明一种全新的、简单且开放免费的指令集架构,于是 RISC-V 架构诞生了 。
经过几年的开发,伯克利为 RISC-V 架构开发了完整的软件工具链以及若干开源的处理器实例,得到越来越多的人的关注。 2016 年, RISC-V 基金会(Foundation)正式成立开始运作。RISC-V 基金会是一个非营利性的组织,负责维护标准的 RISC-V 指令集手册与架构文挡,并推动 RISC-V 架构的发展 。
RISC-V 架构的目标如下:
目前的 RISC-V 架构文档分为指令集文档和特权架构文挡4。指令集文档的篇幅为100多页,而特权架构文档的篇幅也仅为100页左右。虽然 RISC-V 的架构文档还在不断地丰富,但是相比多达数千页的 x86 的架构文档与 ARM 的架构文档,RISC-V 的篇幅可以说是极其短小精悍。
RISC-V 架构定义了3种工作模式,又称为特权模式(PrivilegedMode)。
RISC-V 架构定义 M Mode 为必选模式,另外两种为可选模式,通过不同的模式组合可以实现不同的系统。
RISC-V 架构相比其他成熟的商业架构,最大的不同在于它是一个模块化的架构。因此 RISC-V 架构不仅短小精悍,而且其不同的部分还能以模块化的方式组织在一起,从而试图通过一套统一的架构满足各种不同的应用 。
这种模块化是 x86 与 ARM 架构所不具备的。以 ARM 的架构为例, ARM 的架构分为 A、 R 和 M ,共 3 个系列,分别针对应用操作系统(Application)、实时(Real-Time)和嵌入式(Embedded)3 个领域,彼此之间并不兼容 。 但是模块化的 RISC-V 架构能够使得用户灵活地选择不同的模块进行组合,以满足不同的应用场景。例如针对小面积、低功耗的嵌入式场景,用户可以选择 RV32IC 组合的指令集,仅使用机器模式(Machine Mod); 而针对高性能应用操作系统场景,则可以选择例如 RV32IMFDC 的指令集,使用机器模式(Machine Mode)与用户模式(UserMode)两种模式 。
短小精悍的架构和模块化的哲学,使得 RISC-V 架构的指令数目非常简洁 。基本的 RISC-V 指令数目仅有 40 多条,加上其他的模块化扩展指令总共几十条指令。
基本指令集 | 指令数 | 描述 |
---|---|---|
RV32I | 47 | 32 位地址空间与整数指令 , 支持 32 个通用整数寄存器 |
RV32E | 47 | RV32l 的子集,仅支持 16 个通用整数寄存器 |
RV64I | 59 | 64 位地址空间与整数指令及一部分 32 位的整数指令 |
RV128I | 71 | 128 位地址空间与整数指令及一部分 64 位和 32 位的指令 |
扩展指令集 | 指令数 | 描述 |
---|---|---|
M | 8 | 整数乘法与除法指令 |
A | 11 | 存储器原子(Atomic)操作指令和 Load-Reserved/Store-Conditional 指令 |
F | 26 | 单精度 (32 比特) 浮点指令 |
D | 26 | 双精度( 64 比特)浮点指令,必须支持 F 扩展指令 |
C | 46 | 压缩指令,指令长度为 16位 |
以上模块的一个特定组合 “IMAFD”,也被称为 “通用” 组合,用英文字母 G 表示,即 RV32G 表示RV32IMAFD,同理 RV64G 表示 RV64IMAFD。
为了提高代码密度,RISC-V 架构也提供可选的 “压缩” 指令子集 ,用英文字母 C 表示。 压缩指令的指令编码长度为16比特 ,而普通的非压缩指令的长度为32比特 。
得益于后发优势和总结了多年来处理器发展的经验, RISC-V 的指令集编码非常规整,指令所需的通用寄存器的索引(lndex)都被放在固定的位置。因此指令译码器(Instruction Decoder)可以非常便捷地译码出寄存器索引,然后读取通用寄存器组(Register File, Regfile)。
与所有的 RISC 处理器架构一样,RISC-V 架构使用专用的存储器读(Load)指令和存储器写(Store)指令访问存储器,其他的普通指令无法访问存储器。这种策略使得处理器核的硬件设计变得简单 。 RISC-V 架构的存储器访问指令还有如下显著特点:
RISC-V 架构定义了一些控制和状态寄存器(Control and Status Register, CSR),用于配置或记录一些运行的状态。 CSR 寄存器是处理器核内部的寄存器,使用自己的地址编码空间和存储器寻址的地址区间完全无关系。CSR 寄存器的访问采用专用的 CSR 指令。
RISC-V 架构与其他 RISC 架构的不同之处还有:
这些设计思想都是为了简化硬件设计的复杂度。
插一句题外话,MIPS 的创始人 John Hennessy 和 RISC-V 之父 Dave Patterson 渊源颇深,两人合作撰写了2本现在被广泛用于本科生、研究生课程的教科书:《计算机体系结构:量化研究方法》和《计算机组成与设计:硬件/软件接口》。 ↩︎
所谓 “功耗墙” 问题。 ↩︎
早期,龙芯基于 MIPS 设计 CPU,之后不断添加指令,在十多年里,龙芯基于 MIPS 添加了1000多条指令形成了 LoongISA,3a4000 以前的 CPU 都是基于 LoongISA。后来龙芯选择开发自主指令集LoongArch。 ↩︎
https://riscv.org/technical/specifications/ ↩︎