若是仅从“免费”或“开放”这两点来评判,RISC-V架构并非第一个作到免费或开放的处理器架构。算法
在开始以前,咱们先经过论述几个具备表明性的开放架构,来分析RISC-V架构的不一样之处以及为何其余开放架构没能取得足够的成功。安全
OpenRISC是OpenCores组织提供的基于GPL协议的开放源代码RISC处理器。服务器
OpenRISC具备如下特色:网络
OpenRISC被应用到不少公司的项目之中。能够说,OpenRISC是应用很是普遍的一种开源处理器实现。架构
OpenRISC的不足之处在于其侧重于实现一种开源的CPU Core,而非立足于定义一种开放的指令集架构,所以其架构的发展不够完整,指令集的定义也不具有上节中提到的RISC-V架构的优势,更加没有上升到成立专门的基金会组织的高度。OpenRISC更多的时候被认为是一个开源的Core,而非一种优美的指令集架构。此外,OpenRISC的许可证为GPL,这意味着全部的指令集改动都必须开源(而RISC-V则无此约束)。ide
SPARC架构做为经典的RISC微处理器架构之一,SPARC最先于1985年由Sun电脑所设计。SPARC也是SPARC国际公司的注册商标之一,这家公司于1989年成立,目的是向外界推广SPARC架构以及为该架构进行兼容性测试。该公司为了推广SPARC的生态系统,SPARC国际公司将标准开放,并受权予多家生产商采用,包括德州仪器、Cypress半导体和富士通等。因为SPARC架构也对外彻底开放,所以,也出现了彻底开放源码的LEON处理器。不只如此,Sun公司还于1994年推进SPARC v8架构成为IEEE标准(IEEE Standard 1754-1994)。模块化
因为SPARC架构的初衷是面向服务器领域而设计,其最大的特色是拥有一个大型的寄存器窗口,符合SPARC架构的处理器须要实现从72到640个之多的通用寄存器,每一个寄存器宽度为64bits,组成一系列的寄存器组,称之为寄存器窗口。函数
这种寄存器窗口的架构,因为能够切换不一样的寄存器组快速地响应函数调用与返回,所以,可以产生很是高的性能,可是这种架构因为功耗面积代价太大,而并不适用于PC与嵌入式领域处理器。而SPARC架构也不具有模块化的特色,使得用户没法裁剪和选择。很难做为一种通用的处理器架构对商用的x86和ARM架构造成替代。工具
设计这种超大服务器CPU芯片又非普通公司与我的所能涉足,而有能力设计这种大型CPU的公司也没有必要投入巨大的成原本挑战x86的统治地位。随着Sun公司的衰弱,SPARC架构如今基本上退出了人们的视野。感兴趣的读者请在网络上自行搜索文章《再见SPARC处理器,再见Sun》oop
关于RISC-V在伯克利大学诞生的经历,本节在此不作重复赘述。
由于多年来在CPU领域已经出现过多个免费或开放的架构,不少高校也在科研项目中推出过多种指令集架构。所以,当笔者第一次据说RISC-V之时,觉得又是一个玩具,或纯粹学术性质的科研项目而不觉得意。
直到笔者亲自通读了一遍RISC-V的架构文档,不由为其先进的设计理念所折服。同时,RISC-V架构的各类优势也获得了众多专业人士的青睐好评和众多商业公司的相继加盟。而且2016年RISC-V基金会的正式启动在业界引发了不小的影响。如此种种,使得RISC-V成为至今为止最具有革命性意义的开放处理器架构。
RISC-V架构做为一种指令集架构,在介绍细节以前,让咱们先了解设计的哲学。所谓设计的“哲学”即是其推崇的一种策略,譬如说咱们熟知的日本车的设计哲学是经济省油,美国车的设计哲学是霸气外漏等。RISC-V架构的设计哲学是什么呢?是“大道至简”。
笔者最为推崇的一种设计原则即是:简单就是美,简单便意味着可靠。无数的实际案例已经佐证了“简单即意味着可靠的”真理,反之越复杂的机器越则越容易出错。
所谓大道至简,在IC设计的实际工做中,笔者曾见过最简洁的设计实现安全可靠,也曾见过最繁复的设计长时间没法稳定收敛。最简洁的设计每每是最可靠的,在大多数的项目实践中一次次的获得检验。
IC设计的工做性质很是特殊,其最终的产出是芯片,而一款芯片的设计和制造周期均很长,没法像软件代码那样轻易的升级和打补丁,每一次芯片的改版到交付都须要几个月的周期。不只如此,芯片的一次制形成本费用高昂,从几十万美金到百千万美金不等。这些特性都决定了IC设计的试错成本极为高昂,所以可以有效的下降错误的发生就显得很是的重要。
现代的芯片设计规模愈来愈大,复杂度愈来愈高,并非说要求设计者一味的逃避使用复杂的技术,而是应该将好钢用在刀刃上,将最复杂的设计用在最为关键的场景,在大多数有选择的状况下,尽可能选择简洁的实现方案。
笔者在第一次阅读了RISC-V架构文档之时,不由击节赞叹,拍案惊奇,由于RISC-V架构在其文档中不断地明确强调,其设计哲学是“大道至简”,力图经过架构的定义使得硬件的实现足够简单。其简单就是美的哲学,能够从几个方面容易看出,后续小节将一一加以论述。
在处理器领域,目前主流的架构为x86与ARM架构,笔者曾经参与设计ARM架构的应用处理器,所以须要阅读ARM的架构文档,若是对其熟悉的读者应该了解其篇幅。通过几十年的发展,现代的x86与ARM架构的架构文档长达几百数千页。打印出来能有半个桌子高,可真是“著做等身”。
之因此现代x86与ARM架构的文档长达数千页,且版本众多,一个主要的缘由是由于其架构的发展的过程也伴随了现代处理器架构技术的不断发展成熟。
而且做为商用的架构,为了可以保持架构的向后兼容性,其不得不保留许多过期的定义,或者在定义新的架构部分时为了可以将就已经存在的技术部分而显得很是的别扭。长此以往就变得极为冗长。
那么现代成熟的架构是否可以选择从新开始,从新定义一个简洁的架构呢,能够说是几乎不可能。其中一个重要的缘由即是其没法向前兼容,从而没法获得用户的接受。试想一下若是咱们买了一款新的搭配新的处理器的电脑或者手机回家,以前全部的软件都没法运行而变砖,那确定是没法让人接受的。
而如今才推出的RISC-V架构,则具有了后发优点,因为计算机体系结构通过多年的发展已经成为比较成熟的技术,多年来在不断成熟的过程当中暴露的问题都已经被研究透彻,所以新的RISC-V架构可以加以规避,而且没有背负向后兼容的历史包袱,能够说是无病一身轻。
目前的“RISC-V架构文档”分为“指令集文档”(riscv-spec-v2.2.pdf)和“特权架构文档”(riscv-privileged-v1.10.pdf)。“指令集文档”的篇幅为145页,而“特权架构文档”的篇幅也仅为91页。熟悉体系结构的工程师仅需一至两天即可将其通读,虽然“RISC-V的架构文档”还在不断地丰富,可是相比“x86的架构文档”与“ARM的架构文档”,RISC-V的篇幅能够说是极其短小精悍。
感兴趣的读者能够在RISC-V基金会的网站上(https://riscv.org/specifications/)无需注册即可免费下载其文档,如图1所示。
图1 RISC-V基金会网站上的架构文档
RISC-V架构相比其余成熟的商业架构的最大一个不一样还在于它是一个模块化的架构。所以,RISC-V架构不只短小精悍,并且其不一样的部分还能以模块化的方式组织在一块儿,从而试图经过一套统一的架构知足各类不一样的应用。
这种模块化是x86与ARM架构所不具有的。以ARM的架构为例,ARM的架构分为A、R和M三个系列,分别针对于Application(应用操做系统)、Real-Time(实时)和Embedded(嵌入式)三个领域,彼此之间并不兼容。
可是模块化的RISC-V架构可以使得用户可以灵活选择不一样的模块组合,以知足不一样的应用场景,能够说是“老小咸宜”。譬如针对于小面积低功耗嵌入式场景,用户能够选择RV32IC组合的指令集,仅使用Machine Mode(机器模式);而高性能应用操做系统场景则能够选择譬如RV32IMFDC的指令集,使用Machine Mode(机器模式)与User Mode(用户模式)两种模式。而他们共同的部分则能够相互兼容。
短小精悍的架构以及模块化的哲学,使得RISC-V架构的指令数目很是的简洁。基本的RISC-V指令数目仅有40多条,加上其余的模块化扩展指令总共几十条指令。
本章将对RISC-V的指令集架构多方面的特性进行简要介绍。
RISC-V的指令集使用模块化的方式进行组织,每个模块使用一个英文字母来表示。RISC-V最基本也是惟一强制要求实现的指令集部分是由I字母表示的基本整数指令子集,使用该整数指令子集,便可以实现完整的软件编译器。其余的指令子集部分均为可选的模块,具备表明性的模块包括M/A/F/D/C,如表1所示。
表1 RISC-V的模块化指令集
为了提升代码密度,RISC-V架构也提供可选的“压缩”指令子集,由英文字母C表示。压缩指令的指令编码长度为16比特,而普通的非压缩指令的长度为32比特。以上这些模块的一个特定组合“IMAFD”,也被称为“通用”组合,由英文字母G表示。所以RV32G表示RV32IMAFD,同理RV64G表示RV64IMAFD。
为了进一步减小面积,RISC-V架构还提供一种“嵌入式”架构,由英文字母E表示。该架构主要用于追求极低面积与功耗的深嵌入式场景。该架构仅须要支持16个通用整数寄存器,而非嵌入式的普通架构则须要支持32个通用整数寄存器。
经过以上的模块化指令集,可以选择不一样的组合来知足不一样的应用。譬如,追求小面积低功耗的嵌入式场景能够选择使用RV32EC架构;而大型的64位架构则能够选择RV64G。
除了上述的模块,还有若干的模块包括L、B、P、V和T等。这些扩展目前大多数还在不断完善和定义中,还没有最终肯定,所以本文在此不作详细论述。
RISC-V架构支持32位或者64位的架构,32位架构由RV32表示,其每一个通用寄存器的宽度为32比特;64位架构由RV64表示,其每一个通用寄存器的宽度为64比特。
RISC-V架构的整数通用寄存器组,包含32个(I架构)或者16个(E架构)通用整数寄存器,其中整数寄存器0被预留为常数0,其余的31个(I架构)或者15个(E架构)为普通的通用整数寄存器。
若是使用了浮点模块(F或者D),则须要另一个独立的浮点寄存器组,包含32个通用浮点寄存器。若是仅使用F模块的浮点指令子集,则每一个通用浮点寄存器的宽度为32比特;若是使用了D模块的浮点指令子集,则每一个通用浮点寄存器的宽度为64比特。
在流水线中可以尽早尽快的读取通用寄存器组,每每是处理器流水线设计的指望之一,这样能够提升处理器性能和优化时序。这个看似简单的道理在不少现存的商用RISC架构中都难以实现,由于通过多年反复修改不断添加新指令后,其指令编码中的寄存器索引位置变得很是的凌乱,给译码器形成了负担。
得益于后发优点和总结了多年来处理器发展的教训,RISC-V的指令集编码很是的规整,指令所需的通用寄存器的索引(Index)都被放在固定的位置,如图2所示。所以指令译码器(Instruction Decoder)能够很是便捷的译码出寄存器索引而后读取通用寄存器组(Register File,Regfile)。
图2 RV32I规整的指令编码格式
与全部的RISC处理器架构同样,RISC-V架构使用专用的存储器读(Load)指令和存储器写(Store)指令访问存储器(Memory),其余的普通指令没法访问存储器,这种架构是RISC架构的经常使用的一个基本策略,这种策略使得处理器核的硬件设计变得简单。
存储器访问的基本单位是字节(Byte)。RISC-V的存储器读和存储器写指令支持一个字节(8位),半字(16位),单字(32位)为单位的存储器读写操做,若是是64位架构还能够支持一个双字(64位)为单位的存储器读写操做。
RISC-V架构的存储器访问指令还有以下显著特色:
为了提升存储器读写的性能,RISC-V架构推荐使用地址对齐的存储器读写操做,可是地址非对齐的存储器操做RISC-V架构也支持,处理器能够选择用硬件来支持,也能够选择用软件来支持。
因为如今的主流应用是小端格式(Little-Endian),RISC-V架构仅支持小端格式。有关小端格式和大端格式的定义和区别,本文在此不作过多介绍,若对此不甚了解的初学者能够自行查阅学习。
不少的RISC处理器都支持地址自增或者自减模式,这种自增或者自减的模式虽然可以提升处理器访问连续存储器地址区间的性能,可是也增长了设计处理器的难度。RISC-V架构的存储器读和存储器写指令不支持地址自增自减的模式。
RISC-V架构采用松散存储器模型(Relaxed Memory Model),松散存储器模型对于访问不一样地址的存储器读写指令的执行顺序不做要求,除非使用明确的存储器屏障(Fence)指令加以屏蔽。
这些选择都清楚地反映了RISC-V架构力图简化基本指令集,从而简化硬件设计的哲学。RISC-V架构如此定义很是合理,可以达到能屈能伸的效果。譬如:对于低功耗的简单CPU,可使用很是简单的硬件电路便可完成设计;而对于追求高性能的超标量处理器则能够经过复杂设计的动态硬件调度能力来提升性能。
RISC-V架构有两条无条件跳转指令(Unconditional Jump),jal与jalr指令。跳转连接(Jump and Link)指令jal可用于进行子程序调用,同时将子程序返回地址存在连接寄存器(Link Register:由某一个通用整数寄存器担任)中。跳转连接寄存器(Jump and Link-Register)指令jalr指令可以用于子程序返回指令,经过将jal指令(跳转进入子程序)保存的连接寄存器用于jalr指令的基地址寄存器,则能够从子程序返回。
RISC-V架构有6条带条件跳转指令(Conditional Branch),这种带条件的跳转指令跟普通的运算指令同样直接使用2个整数操做数,而后对其进行比较,若是比较的条件知足时,则进行跳转。所以,此类指令将比较与跳转两个操做放到了一条指令里完成。
做为比较,不少的其余RISC架构的处理器须要使用两条独立的指令。第一条指令先使用比较指令,比较的结果被保存到状态寄存器之中;第二条指令使用跳转指令,判断前一条指令保存在状态寄存器当中的比较结果为真时则进行跳转。相比而言RISC-V的这种带条件跳转指令不只减小了指令的条数,同时硬件设计上更加简单。
对于没有配备硬件分支预测器的低端CPU,为了保证其性能,RISC-V的架构明确要求其采用默认的静态分支预测机制,即:若是是向后跳转的条件跳转指令,则预测为“跳”;若是是向前跳转的条件跳转指令,则预测为“不跳”,而且RISC-V架构要求编译器也按照这种默认的静态分支预测机制来编译生成汇编代码,从而让低端的CPU也能获得不错的性能。
为了使硬件设计尽可能简单,RISC-V架构特意定义了全部的带条件跳转指令跳转目标的偏移量(相对于当前指令的地址)都是有符号数,而且其符号位被编码在固定的位置。所以,这种静态预测机制在硬件上很是容易实现,硬件译码器能够轻松的找到这个固定的位置,并判断其是0仍是1来判断其是正数仍是负数,若是是负数则表示跳转的目标地址为当前地址减去偏移量,也就是向后跳转,则预测为“跳”。固然对于配备有硬件分支预测器的高端CPU,则能够采用高级的动态分支预测机制来保证性能。
为了理解此节,需先对通常RISC架构中程序调用子函数的过程予以介绍,其过程以下:
“保存现场”和“恢复现场”的过程一般由编译器编译生成的指令来完成,使用高层语言(譬如C或者C++)开发的开发者对此能够不用太关心。高层语言的程序中直接写上一个子函数调用便可,可是这个底层发生的“保存现场”和“恢复现场”的过程倒是实实在在地发生着(能够从编译出的汇编语言里面看到那些“保存现场”和“恢复现场”的汇编指令),而且还须要消耗若干的CPU执行时间。
为了加速这个“保存现场”和“恢复现场”的过程,有的RISC架构发明了一次写多个寄存器到存储器中(Store Multiple),或者一次从存储器中读多个寄存器出来(Load Multiple)的指令,此类指令的好处是一条指令就能够完成不少事情,从而减小汇编指令的代码量,节省代码的空间大小。可是此种“Load Multiple”和“Store Multiple”的弊端是会让CPU的硬件设计变得复杂,增长硬件的开销,也可能损伤时序使得CPU的主频没法提升,笔者在曾经设计此类处理器时便深受其苦。
RISC-V架构则放弃使用这种“Load Multiple”和“Store Multiple”指令。并解释,若是有的场合比较介意这种“保存现场”和“恢复现场”的指令条数,那么可使用公用的程序库(专门用于保存和恢复现场)来进行,这样就能够省掉在每一个子函数调用的过程当中都放置数目不等的“保存现场”和“恢复现场”的指令。
此选择再次印证了RISC-V追求硬件简单的哲学,由于放弃“Load Multiple”和“Store Multiple”指令能够大幅简化CPU的硬件设计,对于低功耗小面积的CPU能够选择很是简单的电路进行实现,而高性能超标量处理器因为硬件动态调度能力很强,能够有强大的分支预测电路保证CPU可以快速的跳转执行,从而能够选择使用公用的程序库(专门用于保存和恢复现场)的方式减小代码量,可是同时达到高性能。
不少早期的RISC架构发明了带条件码的指令,譬如在指令编码的头几位表示的是条件码(Conditional Code),只有该条件码对应的条件为真时,该指令才被真正执行。
这种将条件码编码到指令中的形式可使得编译器将短小的循环编译成带条件码的指令,而不用编译成分支跳转指令。这样便减小了分支跳转的出现,一方面减小了指令的数目;另外一方面也避免了分支跳转带来的性能损失。然而,这种“条件码”指令的弊端一样会使得CPU的硬件设计变得复杂,增长硬件的开销,也可能损伤时序使得CPU的主频没法提升,笔者在曾经设计此类处理器时便深受其苦。
RISC-V架构则放弃使用这种带“条件码”指令的方式,对于任何的条件判断都使用普通的带条件分支跳转指令。此选择再次印证了RISC-V追求硬件简单的哲学,由于放弃带“条件码”指令的方式能够大幅简化CPU的硬件设计,对于低功耗小面积的CPU能够选择很是简单的电路进行实现,而高性能超标量处理器因为硬件动态调度能力很强,能够有强大的分支预测电路保证CPU可以快速的跳转执行达到高性能。
不少早期的RISC架构均使用了“分支延迟槽(Delay Slot)”,最具备表明性的即是MIPS架构,在不少经典的计算机体系结构教材中,均使用MIPS对分支延迟槽进行过介绍。分支延迟槽就是指在每一条分支指令后面紧跟的一条或者若干条指令不受分支跳转的影响,无论分支是否跳转,这后面的几条指令都必定会被执行。
早期的RISC架构不少采用了分支延迟槽诞生的缘由主要是由于当时的处理器流水线比较简单,没有使用高级的硬件动态分支预测器,因此使用分支延迟槽可以取得可观的性能效果。然而,这种分支延迟槽使得CPU的硬件设计变得极为的别扭,CPU设计人员对此每每苦不堪言。
RISC-V架构则放弃了分支延迟槽,再次印证了RISC-V力图简化硬件的哲学,由于现代的高性能处理器的分支预测算法精度已经很是高,能够有强大的分支预测电路保证CPU可以准确的预测跳转执行达到高性能。而对于低功耗小面积的CPU,因为无需支持分支延迟槽,硬件获得极大简化,也能进一步减小功耗和提升时序。
不少RISC架构还支持零开销硬件循环(Zero Overhead Hardware Loop)指令,其思想是经过硬件的直接参与,经过设置某些循环次数寄存器(Loop Count),而后可让程序自动地进行循环,每一次循环则Loop Count自动减1,这样持续循环直到Loop Count的值变成0,则退出循环。
之因此提出发明这种硬件协助的零开销循环是由于在软件代码中的for 循环(for i=0; i<="" p=""></N;>
然有得必有失,此类零开销硬件循环指令大幅地增长了硬件设计的复杂度。所以,零开销循环指令与RISC-V架构简化硬件的哲学是彻底相反的,在RISC-V架构中天然没有使用此类零开销硬件循环指令。
在本章第2.1节中曾经提到RISC-V架构使用模块化的方式组织不一样的指令子集,最基本的整数指令子集(I字母表示)支持的运算包括加法、减法、移位、按位逻辑操做和比较操做。这些基本的运算操做可以经过组合或者函数库的方式完成更多的复杂操做(譬如乘除法和浮点操做),从而可以完成大多数的软件操做。
整数乘除法指令子集(M字母表示)支持的运算包括,有符号或者无符号的乘法和除法操做。乘法操做可以支持两个32位的整数相乘获得一个64位的结果;除法操做可以支持两个32位的整数相除获得一个32位的商与32位的余数。
单精度浮点指令子集(F字母表示)与双精度浮点指令子集(D字母表示)支持的运算包括浮点加减法,乘除法,乘累加,开平方根和比较等操做,同时提供整数与浮点,单精度与双精度浮点彼此之间的格式转换操做。
不少RISC架构的处理器在运算指令产生错误之时,譬如上溢(Overflow)、下溢(Underflow)、非规格化浮点数(Subnormal)和除零(Divide by Zero),都会产生软件异常。RISC-V架构的一个特殊之处是对任何的运算指令错误(包括整数与浮点指令)均不产生异常,而是产生某个特殊的默认值,同时,设置某些状态寄存器的状态位。RISC-V架构推荐软件经过其余方法来找到这些错误。再次清楚地反映了RISC-V架构力图简化基本的指令集,从而简化硬件设计的哲学。
基本的RISC-V基本整数指令子集(字母I表示 )规定的指令长度均为等长的32位,这种等长指令定义使得仅支持整数指令子集的基本RISC-V CPU很是容易设计。可是等长的32位编码指令也会形成代码体积(Code Size)相对较大的问题。
为了知足某些对于代码体积要求较高的场景(譬如嵌入式领域),RISC-V定义了一种可选的压缩(Compressed)指令子集,由字母C表示,也能够由RVC表示。RISC-V具备后发优点,从一开始便规划了压缩指令,预留了足够的编码空间,16位长指令与普通的32位长指令能够无缝自由地交织在一块儿,处理器也没有定义额外的状态。
RISC-V压缩指令的另一个特别之处是,16位指令的压缩策略是将一部分普通最经常使用的的32位指令中的信息进行压缩重排获得(譬如假设一条指令使用了两个一样的操做数索引,则能够省去其中一个索引的编码空间),所以每一条16位长的指令都能一一找到其对应的原始32位指令。所以,程序编译成为压缩指令仅在汇编器阶段就能够完成,极大的简化了编译器工具链的负担。
RISC-V架构的研究者进行了详细的代码体积分析,如图3所示,经过分析结果能够看出,RV32C的代码体积相比RV32的代码体积减小了百分之四十,而且与ARM,MIPS和x86等架构相比都有不错的表现。
图3 各指令集架构的代码密度比较(数据越小越好)
RISC-V架构定义了三种工做模式,又称特权模式(Privileged Mode):
RISC-V架构定义M Mode为必选模式,另外两种为可选模式。经过不一样的模式组合能够实现不一样的系统。
RISC-V架构也支持几种不一样的存储器地址管理机制,包括对于物理地址和虚拟地址的管理机制,使得RISC-V架构可以支持从简单的嵌入式系统(直接操做物理地址)到复杂的操做系统(直接操做虚拟地址)的各类系统。
RISC-V架构定义了一些控制和状态寄存器(Control and Status Register,CSR),用于配置或记录一些运行的状态。CSR寄存器是处理器核内部的寄存器,使用其本身的地址编码空间和存储器寻址的地址区间彻底无关系。
CSR寄存器的访问采用专用的CSR指令,包括CSRRW、CSRRS、CSRRC、CSRRWI、CSRRSI以及CSRRCI指令。
中断和异常机制每每是处理器指令集架构中最为复杂而关键的部分。RISC-V架构定义了一套相对简单基本的中断和异常机制,可是也容许用户对其进行定制和扩展。
RISC-V架构目前虽然尚未定型矢量(Vector)指令子集,可是从目前的草案中已经能够看出,RISC-V矢量指令子集的设计理念很是的先进,因为后发优点及借助矢量架构多年发展成熟的结论,RISC-V架构将使用可变长度的矢量,而不是矢量定长的SIMD指令集(譬如ARM的NEON和Intel的MMX),从而可以灵活的支持不一样的实现。追求低功耗小面积的CPU能够选择使用长度较短的硬件矢量进行实现,而高性能的CPU则能够选择较长的硬件矢量进行实现,而且一样的软件代码可以彼此兼容。
除了上述阐述的模块化指令子集的可扩展、可选择,RISC-V架构还有一个很是重要的特性,那就是支持第三方的扩展。用户能够扩展本身的指令子集,RISC-V预留了大量的指令编码空间用于用户的自定义扩展,同时,还定义了四条Custom指令可供用户直接使用,每条Custom指令都有几个比特位的子编码空间预留,所以,用户能够直接使用四条Custom指令扩展出几十条自定义的指令。
处理器设计技术通过几十年的衍进,随着大规模集成电路设计技术的发展直至今天,呈现出以下特色:
如上种种这些因素,使得不少早期的RISC架构设计理念(依据当时技术背景而诞生),时至今日不只不能帮助现代处理器设计,反而成了负担桎梏。某些早期RISC架构定义的特性,一方面使得高性能处理器的硬件设计束手束脚;另外一方面又使得极低功耗的处理器硬件设计背负没必要要的复杂度。
得益于后发优点,全新的RISC-V架构可以规避全部这些已知的负担,同时,利用其先进的设计哲学,设计出一套“现代”的指令集。本节再次将其特色总结如表2所示。
表2 RISC-V指令集架构特色总结