1。概述以及RISCV的历史 国产处理器芯片起步较晚,从2013年至今,集成电路每年的进口额均超过了2000亿美元。RISCV和AI(人工智能)芯片是我国最有希望突破的领域之一。RISCV使用的领域还是对于生态依赖比较小的嵌入式系统或者新兴的IoT(物联网)、边缘计算、人工智能领域,但RISCV得到了产业界和社区的广泛支持,同时,现在很多企业开始对RISCV重视,所以说RISCV应用前景会非常乐观。 CPU支持的所有指令和指令的字节级编码就是这个CPU的指令集架构(InstructionSetArchitecture,ISA),指令集在计算机软件和硬件之间搭起了一座桥梁。不同的CPU家族,例如86、PowerPC和ARM,都有不同的ISA。RISCVISA开源,更确切地讲是它的指令集规范和标准开源。 RISCV起源于加州大学伯克利分校。在2010年夏季,KrsteAsanovic教授带领他的两个学生AndrewWaterman和YunsupLee启动了一个3个月的项目,目标是针对x86和ARM指令集架构复杂和需要IP授权的问题,开发一个简化和开放的指令集架构。RISCV基金会创建于2015年,是一家非营利组织。基金会董事会最早由Bluespec、Google、Microsemi、NVIDIA、NXP、UCBerkeley、WesternDigital七家单位组成,目前的主席是KrsteAsanovi教授。 成员单位现在已经比较多了: 基金会为核心芯片架构制定标准和建立生态,标准公开免费下载。基金会旗下有超过1000家成员,包括高通、NXP、阿里巴巴和华为等。RISCV基金会成员可以使用RISCV商标。RISCV指令集架构采用开源BSD授权,任何企业、高校和个人都可以遵循RISCV架构指南设计自己的CPU。秉承开放、中立的宗旨,RISCV基金会总部从美国迁往瑞士,并于2020年3月完成在瑞士的注册,更名为RISCV国际基金会(RISCVInternationalAssociation)。近日,基金会CEOCalistaRedmond撰文RISCVCatalystforChangRISCV,文章指出,RISCV标准是免费和开放的,没有任何一个实体可以控制RISCV技术。企业、学术界和机构都可以自由地在RISCV指令集架构上进行创新,共同推动计算前沿技术的迅速发展。 自RISCV架构诞生以来,市场上已有数十个版本的RISCV内核和SoC芯片它们中的一部分是开源免费的,而商业公司开发的RISCV处理器内核和平台是需要商业授权的。某些商业公司开发用于内部使用的RISCV内核,但也可以开源运作。西部数据的SweRV架构(RV32IMC)是RISCV内核处理器的典型代表,它是一个32bit顺序执行指令架构,具有双向超标量设计和9级流水线,采用28nm工艺技术实现,运行频率高达1。8GHz,可提供4。9CoreMarkMHz的性能,略高于ARM的CortexA15,已经在西部数据的SSD和HDD控制器上使用,SweRV项目是一个开源项目(ChipAlliance)典型的开源RISCV内核有RocketCore,它是加州大学伯克利分校开发的一个经典的RV64设计。伯克利分校还开发了一个BOOMCore,它与RocketCore不同的是面向更高的性能。苏黎世理工大学(ETHZurich)开发的Zeroriscy,是经典的RV32设计。苏黎世理工大学还开发了另外一款RISCVR15CYCore,可配置成RV32E,面向的是超低功耗、超小芯片面积的应用场景。由CliffordWolf开发的RISCVCorePicoRV32,其内核重点在于追求面积和CPU频率的优化。 开源的RISCV内核非常适用于研究和教学,但用于商业芯片设计还有许多工作要做。SiFive(美国赛防科技)由YunsupLee创立,他也是RISCV的创始人之一。2017年SiFive公司发布首个RISCV内核SOC平台家族,以及相关支持软件和开发板。在这些芯片中,包括采用28nm制造技术,支持Linux操作系统的64位多核CPUU500,以及采用180nm制造技术的多外设低成本IOT处理器内核E300。 2。RISCV指令集特点 RISCV指令集是基于精简指令集计算原理建立的开放指令集架构(ISA),RISCV是在指令集不断发展和成熟的基础上建立的全新指令。RISCVISA可以免费使用,允许任何人设计、制造和销售RISCV芯片和软件。 RISCV(读音riskfive)是一个新的指令集体系结构(ISA),它最初用于支持计算机体系结构研究和教学,但现在我们希望它也成为一个对于工业实现来说标准、免费、开放的体系结构。RISCV官方定义RISCV的目的包括:一个完全开放的ISA,能够自由地提供给学术界和工业界使用。一个真正的ISA,能够适合直接在硬件上实现,而不仅仅是适用于模拟或者二进制翻译。一个避免对某一种微体系结构风格(例如微编码、按序、去耦合、乱序等)或者实现技术(例如全定制、ASIC、FPGA)过度体系结构化(overarchitecting)的ISA,但是也能够非常高效地利用任何一种技术实现。包含一个小的基本整数ISA(可以作为一个定制的加速器的基础或者作为教学用途)和多个可选的标准扩展的ISA,可以支持通用的软件开发。支持修订的2008IEEE754浮点标准〔10〕。ISA支持丰富的用户级ISA扩展和各种特殊的变种。对应用程序、操作系统内核、硬件实现的32位、64位地址空间变种。ISA支持高度并行的多核、众核实现,包括异构多处理器等。可选的变长指令,以支持扩展可用的指令编码空间、支持一个可选的密集指令编码,以提高性能、静态代码大小和能耗效率。一个可完全虚拟化的ISA,以简化虚拟机监督管理器(Hypervisor)的开发。ISA支持新的管理员级(supervisorlevel)和虚拟机监督管理级(hypervisorlevel)ISA设计。 3。关于RISCV的V RISCV这个名字,代表了UCBerkeley大学设计的第五代主要的RISCISA(前四个是RISCI〔18〕、RISCII〔11〕、SOAR〔27〕和SPUR〔14〕)。罗马数字V也暗示了变种(Variations)和向量(Vectors),以支持各种体系结构研究,包括各种数据并行加速器,也是这个ISA设计的明确目标。 4、发明者为什么要开发一个新的ISA 关于为什么要有RISCV,发明者这么说: 硬件上实现一些研究思想特别感兴趣(自从这个规范的第一个版本发布之后,我们已经完成了11块不同的RISCV硅片的制造),在课堂上提供给学生真实的实现(在Berkeley,RISCV处理器的RTL设计代码已经用于多个本科生、研究生的课程)。在我们当前的研究中,由于传统晶体管不断变小带来的能耗约束,我们对特殊、异构的加速器特别感兴趣。我们需要一个高度灵活、高度可扩展的基本ISA,在此基础上可以构建我们自己的研究。 我们总被问及这样一个问题为什么要开发一个新的ISA?。使用一个已有的商业化的ISA,其显而易见最大的优势在于其已经具备了丰富和广泛支持。 的软件生态系统,包括开发工具和可移植的应用程序,而在研究和教学中,这些都是可以利用的。其他的好处包括拥有大量的文档和教程示例。然而,我们的经验证明,在科研和教学中使用商业的指令集,在实际中获得的好处很小,而且掩盖不了它的缺点: l商业ISA都是私有的。除了SPARCV8(它是一个开放的IEEE标准〔1〕),绝大多数ISA的拥有者非常小心地保护他们的知识产权,并且并不欢迎自由实现的竞争实现。对于仅仅使用软件模拟器来进行学术研究和教学来说,这并不是一个问题,但是对于那些希望分享真实硬件实现的科研小组来说,这就是一个大问题。对于那些被强迫信任仅有的几个商业ISA实现,而不允许创建自己的全新实现(cleanroomimplementation)的企业来说,这也是一个大问题。我们并不能确保所有的RISCV实现没有侵犯第三方专利,但是我们确保我们绝不会起诉一个RISCV的实现者。商业ISA仅仅在某个市场领域比较流行。当书写此文档时,最显而易见的例子就是ARM体系结构在服务器领域并没有得到很好的支持,而Intelx86体系结构(或者几乎任何一种其他的体系结构)在移动领域并没有得到很好的支持,虽然Intel和ARM正在试图进入对方的市场领域。另外一个例子是ARC和Tensilica,它们提供了可扩展的内核,但是只关注嵌入式市场。这种市场的划分,使得支持某种特定商业ISA获得的好处大大削弱,因为事实上软件生态系统只存在于某个领域,到了别的领域,必须重新构建。商业ISA此起彼伏。以前基于商业ISA构建的研究基础设施,并不流行(SPARC、MIPS),甚至不再生产(Alpha)。这对于一个活跃的软件生态系统来说是一个大损失,一些围绕ISA和支持工具的知识产权问题,也使得感兴趣的第三方难以继续支持这个ISA。一个开放的ISA也可能失去流行性,但是任何感兴趣的人,都可以继续使用它并研发相应的生态系统。流行的商业ISA是复杂的。占统治地位的ISA(x86和ARM)若要支持常用软件栈和操作系统,那么其硬件实现都非常复杂。更糟糕的是,几乎所有的复杂性都来自于糟糕的、或者至少是过时的ISA设计考虑,而不是那些真正提高效率的特性。仅靠商业ISA并不足以运行应用程序。即使我们努力实现了一个商业ISA,对于运行一个现有的应用程序来说,仍然是不够的。绝大多数应用程序需要一个完整的ABI(applicationbinaryinterface)才能运行,而不仅仅是用户级ISA。绝大多数ABI依赖于库(libraries),而库又依赖于操作系统支持。为了运行一个已有的操作系统,需要实现管理员级ISA、OS需要的设备接口。这些通常并没有很好的规范,而在实现上比用户级ISA具有更大的复杂性。流行的商业ISA不是为可扩展性设计的。占统治地位的商业ISA并没有为可扩展性而进行特殊的设计,结果就是,随着后续指令集不断地增长,指令编码的复杂度大幅度增加。而类似Tensilica(被Cadence公司收购)、ARC(被Synopsys公司收购)这样的公司,它们围绕可扩展性构建了ISA和工具链(toolchain),但是它们瞄准的是嵌入式应用而不是通用计算系统。 一个修改过的商业ISA实际上是一个新的ISA。我们的一个主要目标是支持体系结构研究,包括主要的ISA扩展。即使是很小的扩展,也减弱了使用标准ISA而带来的好处,因为必须修改编译器,而应用程序必须从源代码进行重新编译,以利用这些扩展。引入了新的体系结构状态的大一些的扩展,也需要对操作系统进行修改。最终使得一个修改的商业ISA变成一个新的ISA,但是不得不肩负着所有基本ISA遗留下来的包袱。我们坚信ISA是整个计算系统中最重要的接口,没有理由把这么重要的接口变成私有的。占统治地位的商业ISA都是基于超过30年历史的指令集。软件开发者应当能够定位到一个开放标准的硬件目标机,商业处理器设计者应当在实现质量上进行竞争。我们并不是第一个为了适合硬件实现而提出开放ISA设计的。我们也考虑了其他现有的开放ISA设计,其中OpenRISC体系结构〔17〕与我们的目标最为接近。 我们由于几个技术原因,并不采用OpenRISCISA:OpenRISC有条件码(conditioncode)和分支延迟槽(branchdelayslot),这对于更高性能的实现来说,变得更为复杂。OpenRISC使用了32位定长指令编码和16位立即数,阻碍了更密集的指令编码,并对后续ISA扩展限制了空间。OpenRISC并不支持2008修订的IEEE754浮点标准。 在我们开始的时候,64位OpenRISC设计并没有完成。从零开始,我们可以设计一个符合我们所有需求的ISA,当然,这花了比我们在开始时预期多得多的努力。现在我们在构建RISCVISA基础设施上投入了大量的精力,包括文档、编译器工具链、操作系统移植、参考ISA模拟器、FPGA实现、高效的ASIC实现、体系结构测试套件、教学材料等。自本文档的上一个版本以来,在学术界和工业界对此RISCVISA都有大量的吸收(uptake),我们也创建了非盈利的RISCV基金会来保护和推进这个标准。RISCV基金会的网址在http:riscv。org,包含了基金会成员最新的信息和各种各样使用RISCV的开源项目。 5。RISCV指令集的优势 (1)完全开源。对于RISCV指令集的使用,RISCV基金会不收取高额的授权费。开源采用宽松的BSD协议,企业可以完全自由免费使用,同时也允许企业添加自有指令集,而不必开放共享,实现差异化发展。 (2)架构简单。RISCV设。处理器领域,流的架构为x8与ARM架构。x86与ARM架构的发展过程也伴随了现代处理器架构技术的不断发展成熟,但作为商用的架构,为了能够保持架构的向后兼容性,不得不保留许多过时的定义,导致其指令数目多,指令冗余严重,文档数量庞大,所以要在这些架构上开发新的操作系统或者直接开发应用门槛很高。而RISCV架构则完全抛弃包袱,借助计算机体系结构经过多年的发展已经成为比较成熟的技术的优势,从轻上路。RISCV基础指令集只有40多条,加上其他的模块化扩展指令总共也就几十条指令。RISCV的规范文档仅有145页,而特权架构文档的篇幅也仅为91页。 (3)易于移植操作系统。现代操作系统都做了特权级指令和用户级指令的分离,特权指今只能由操作系统调用,而用户级指令才能在用户模式调用,保障操作系统的稳定。RISCV提供了特权级指令和用户级指令,同时提供了详细的RISCV特权级指令规范和RISCV用户级指令规范的详细信息,使开发者能非常方便地移植Linux和UNIX系统到RISCV平台上。 (4)模块化设计。RISCV架构不仅短小精悍,其不同的部分还能以模块化的方式组纱在一起,从而试图通过一套统一的架构满足各种不同的应用场景。用户能够灵活选择不同的模块组合,来实现自己定制化设备的需要,比如针对小面积低功耗嵌入式场景,用户可以选择RV32IC组合的指令集,仅使用MachineMode(机器模式);而高性能应用操作系统场景则可以选择RV32IMFDC指令集,使用MachineMode(机器模式)与UserMode户模式)两种模式。 (5)完整的工具链。对于设计CPU来说,工具链是软件开发人员和CPU交互的窗口,若没有工具链,则对软件开发人员开发软件要求很高,甚至软件开发者无法让CPU工作起来在CPU设计中,工具链的开发是一个巨大的工作。如果用RISCV来设计芯片,芯片设计公司则不用再担心工具链问题,只需专注于芯片设计,RISCV社区已经提供了完整的工具链RISCV基金会持续维护该工具链。当前RISCV的支持已经合并到主要的工具中,比如编评工具链GCC、仿真工具QEMU等。 6、RISCV的特点 1)。没有立即数减法 只有立即数加法指令(addi),没有立即数减法指令(subi),那么减法怎么办?无论是数学上还是程序上,xy都等价于x(y),也就是说可以把减法变成加法,把被减数转化成负数然后再加上减数就实现了和减法一样的功能。正是基于这个原理,RISCV只提供立即数加法,没有提供立即数减法,如果需要立即数减法,那么就要麻烦编译器把这个立即数转化成负数,然后继续使用加法。这也是RISCV将立即数作为有符号数处理的原因。 2)。x0寄存器简化指令集 引入x0寄存器后,很多特殊指令只需用普通的指令加上x0做操作数就能解决,指令的数量大大减少,处理器的解码电路也大大简化。 3)。32位常量 之前使用的ARM处理器是将立即数表示不下的常量存到常量池,然后用PC相关的LDR指令加载到寄存器。RISCV的常量完全是用指令拼接,不需要Load指令,使用Load指令需要额外的访问周期。RISCV单条指令可以表示12位的有符号常量,超过12位需要两条指令来合成。其中一条指令是lui,lui指令加载常量的高20位,低12位可以用addi指令上去,这个过程需要编译器算出立即数到底是什么,因为addi指令执行的是有符号加法,其中的12位立即数会先被符号扩展成32位的有符号数再参与计算。ARM的常量加载需要8个字节,一条指令加一个常量;RISCV的常量加载也是需要8个字节,两条指令,两者占用的程序空间一样。 4)。只有小于和大于等于 RISCV的比较跳转指令只有blt和bge,即只有小于和大于等于。但大于和小于等于也是需要的,RISCV用了一个很巧妙的办法用两条指令实现了四条指令的工作,将blt的两个参与比较的操作数位置换一下就有了bgt(大于跳转),将bge的两个参与比较的操作数位置换一下就有了ble(小于或等于跳转)。 5)。让编译器做更多工作 对RISC的理解是处理器尽量少做、编译器尽量多做,这是非常有道理的,毕竟编译的次数远少于执行的次数。上面几点就提到不少要让编译器多做的工作,又例如Btype是比较跳转指令的格式,Jtype是长跳转或函数调用指令格式,注意它们的立即数排列次序,把填充这里的立即数交给了链接器的工作。这样排放偏移地址立即数是为了简化处理器的设计,但明显给编译器增加了工作。 6)。其他省掉的指令 很多常用的指令都被省掉了,比如nop、move、not、neg等,但所有这些功能都还有只不过都是用其他的指令来等价实现,比如not指令是用xorird,rs,1实现。 7、RISCV的x0寄存器 Linux有两个特殊的设备:devzero和dev。从devzero可以源源不断地读到0,往dev写的任何内容都被丢弃。如果要创建一个需要填0的文件,就从devzero拷贝,如 果要丢弃一些输出,就把输出重定向到dev。RISCV的x0寄存器就相当于是硬件版的devzero和dev的组合体。从0读出来的总是0,往x0写进去的总是被丢弃。所以x0提供两种功能:一是提供常量0,在软件编程中0可以说是最常用的常量:二是提供一个可以丢弃结果的场所。有了x0寄存器,很多本来需要单独指令的操作只要在普通的指令前加上x0就可以实现。 (1)nop空指令,RISCV没有提供nop指令,而是用addix0,x0,0来实现空指令,这条addi使用x0作为目标存器,会丢弃结果,所以这条指令不会对程序状态产生任何影响,和空指令是完全等价的,这就不需要单独的空指令了。 (2)neg取负数指令,RISCV用subrd,x0,rs来实现,x0rs等价于0rs,等价于rs,有了x0,就可以用更普通的减法指令来实现取负数指令。 (3)j跳转指令,RISCV没有单独的跳转指令,只有jal跳转链接指令,跳转之前总是要把下一条指令的地址拷贝到寄存器,但是如果用x0作为jal的操作寄存器,即把下条指令的地址拷贝到x0,那么效果就等价于j跳转指令了,因为写入x0的任何值都会被丢弃。 (4)beqz等于零跳转指令等一系列和0比较的跳转指令,程序中和0比较是相当常见的操作,RISCV中和0比较的指令是普通的比较跳转指令,是用x0寄存器做指令的操作数。还有很多其他这样的指令,用普通的指令加上x0做操作数,就实现了那些没有x0寄存器的处理器需要单独指令或者需要组合两条指令才能实现的操作。 参考资料: 1、riscv。org 2、《基于riscv的人工智能应用开发》 3、《深入理解RISCV程序开发》 4、《计算机体系结构与SoC设计》 处理器基础知识合集 RISCV学习笔记【1】RISCV概述 【1】8位、16位、32位、64位 除了CISC与RISC之分,处理器指令集架构的位数也是一个重要的概念。通俗来讲处理器架构的位数是指通用寄存器的宽度,其决定了寻址范围的大小、数据运算能力的强弱譬如32位架构的处理器,其通用寄存器的宽度为32位,能够寻址的范围为232Byte,即4GB的寻址空间,运算指令可以操作的操作数为32位。 注意:处理器指令集架构的宽度和指令的编码长度无任何关系。并不是说64位架构的指令长度为64位(这是一个常见的误区)。从理论上来讲,指令本身的编码长度越短越好因为可以节省代码的存储空间。因此即便在64位的架构中,也大量存在16位编码的指 且基本上很少出现过64位长的指令编码。 综上所述,在不考虑任何实际成本和实现技术的前提下,理论上来讲:。通用寄存器的宽度,即指令集架构的位数越多越好,因为这样可以带来更大的寻址范围和更强的运算能力。 指令编码的长度越短越好,因为这样可以更加节省代码的存储空间常见的架构位数分为8位、16位、32位和64位。早期的单片机以8位和16位为主,知名的8051单片机是使用广泛的8位架构。 目前主流的嵌入式微处理器均在向32位架构转移。 目前主流的移动手持、个人计算机和服务器领域,均使用64位架构。 【2】CISC、RISC 常见的指令集架构大体上可以分为两大类:复杂指令集体系(CISC)和精简指令集体系(RISC)。 RISC全称ReducedInstructionSetCompute,精简指令集计算机。 CISC全称ComplexInstructionSetComputers,复杂指令集计算机。 CISC既有简单指令也有复杂指令,后来人们发现典型程序中80的语句都是使用计算机中20的指令,而这20的指令都属于简单指令;因此花再多时间去研究复杂指令,也仅仅只有20的使用概率,并且复杂指令会影响计算机的执行速度。既然典型程序的80都是使用简单指令完成,那剩下的20语句用简单语句来重新组合一下模拟这些复杂指令就行了,而不需要使用这些复杂指令,于是RISC就出现了。 RISC的主要特点: 1)选取使用频率较高的一些简单指令以及一些很有用但不复杂的指令,让复杂指令的功能由使用频率高的简单指令的组合来实现。 2)指令长度固定,指令格式种类少,寻址方式种类少。 3)只有取数存数指令访问存储器,其余指令的操作都在寄存器内完成。 4)CPU中有多个通用寄存器(比CISC的多) 5)采用流水线技术(RISC一定采用流水线),大部分指令在一个时钟周期内完成。采用超标量超流水线技术,可使每条指令的平均时间小于一个时钟周期。 6)控制器采用组合逻辑控制,不用微程序控制。 7)采用优化的编译程序 CICS的主要特点: 1)指令系统复杂庞大,指令数目一般多达200300条。 2)指令长度不固定,指令格式种类多,寻址方式种类多。 3)可以访存的指令不受限制(RISC只有取数存数指令访问存储器) 4)各种指令执行时间相差很大,大多数指令需多个时钟周期才能完成。 5)控制器大多数采用微程序控制。 6)难以用优化编译生成高效的目标代码程序 RISC与CISC的比较 1。RISC比CISC更能提高计算机运算速度;RISC寄存器多,就可以减少访存次数,指令数和寻址方式少,因此指令译码较快。 2。RISC比CISC更便于设计,可降低成本,提高可靠性。 3。RISC能有效支持高级语言程序。 4。CISC的指令系统比较丰富,有专用指令来完成特定的功能,因此处理特殊任务效率高。 复杂指令集最常见的例子是现在绝大多数家用计算机和网络服务器所使用的AMD64指令集(也叫x8664、x8664、Intel64、EM64T等等,本文以发明人为基准称为AMD64。)除此以外有一定使用量,和有历史意义的复杂指令集还有IA32、MC68000、MOS6502、Intel8051、Intel8080等等。复杂指令集其复杂在于指令种类数量巨大,非常多次常用到不常用的功能都会被整合进处理器指令集中。同时复杂指令集系统每条指令的操作数寻址方式复杂,几乎所有指令都可以直接访问内存;相应的指令的机器码编码方式复杂,普遍使用不定长指令等。同时,复杂指令集系统一般没有独立的专用内存访问指令,处理器内所设置的通用寄存器数量也偏少。(例如IA32没有严格意义上的通用整数寄存器,到了AMD64也才勉强设置了八个通用整数寄存器。) 精简指令集最常见的例子则是常见于智能设备和嵌入式平台的ARM指令集家族。除此以外除此以外有一定使用量,和有历史意义的精简指令集还有龙芯LoongArch、MIPS、RISCV、PowerPC、AVR等等。精简指令集其精简在于指保留最基本最必要的指令,将复杂功能完全交给上层的软件算法和下层的专用外设去解决。同时精简指令集系统指令寻址方式往往非常单一,除了专门的访存指令以外所有指令都只能在寄存器范围内操作,相应的精简指令集系统普遍使用固定长度指令,也会配备相对比较多的通用寄存器。(例如上个世纪的ARMv4T、MIPS32就都已经有29~31个通用寄存器了,相比于同时期IA32的0个。) 实际到了应用层面上,对于高级语言程序来说,对于处理器设计来说,两种指令集架构分类的实际差异已经不大了。Intel和AMD的AMD64实现都使用了微代码,而从复杂指令翻译出来的微代码普遍都用了类RISC设计。本世纪初的时候还普遍认为复杂指令集处理器速度更快,到了现在精简指令集已经很强大了,完全比CISC更快。有些CISC最终也是转化为RISC进行执行了。 【3】8位的CISC8051 8位和CISC两个似乎是矛盾的,但是8051活生生的辉煌了40年。 说起8051内核,几乎无人不知无人不晓。8051作为一款生了数十年之久的微处理器内核,在8位入式微处理器内核领域,它是当之无愧的传前辈 自从Inlel于1980年为入式系统开发IntelMCS51(通常简称8051)单芯片微控制(单片机)至今,8051内核架构已经走过将近40个年头。Intel还以专利转让的形式8051内核转让给了许多其他半导体公司,这些公司进一步发展出不同型号基于8051内核微控制器芯片,因此形成了一个庞大的8051家族。 几十年发展下来的庞大的用户群和生态环境,以及多年来众多备受肯定的成功产品,可以说8051内核几乎成为8位微处理器内核的业界标杆。8051内核架构在1998年失去专利保护,久经沙场的它再次进发出强大的二次生命力,各种形式的8051架构MCU(微控制器MicrocontrollerUnit)进一步涌入市场,各种基于8051内核的芯片产品层出不穷,各种免费版本的8051内核IP也可以从各种渠道获取。 当然由于8051内核并没有一个统一的组织和标准进行管理,所以也存在着体系结构浪乱,各种增强型复杂多样的问题。虽然时常也都自称为8051内核,但是其实各有差别,琅满目让人难以分辨。但是这丝毫不影响8051内核的经典地位,时至今日,虽然目前微处理器内核正在经历着向32位架构迁移的大趋势,但是8051内核仍然有着举足轻重的地位在大量的MCU、数模混合信号芯片、SoC芯片中仍能看到8051内核的身影,并且在相当长的时间内,在适合8位架构处理器内核的应用领域中都将继续使用8051内核,可以说是廉颇虽老,尚能饭也。 8051内核能在嵌入式领域取得如此成功的地位,可以归功于如下几个方面的原因。广泛的被认知度,简单的体系结构。没有知识产权的限制,商业和开源的版本众多,非常适合中小型芯片公司采用。用庞大的用户群以及相应的生态系统。成熟且免费的软件工具链支持。 你似乎感受到RISCV从其一诞生就符合以上几条的气质。 尽管如此,8051作为一款诞生了接近40年的8位CISC(复杂指令集)架构内核,虽然是老骥伏析,壮心不已,但是由于其性能低下,寻址范围受限,已经难以适应更多的新兴应用领域。随着IoT的发展和崛起,虽然嵌入式领域对于处理器内核的需求更加井喷,但是更多的是开始采用32位架构,且很多传统的8位应用领域也在开始向着32位架构迁移。这样ARM的CortexM系列有了成长的机会。 然而在20世纪80年代该单片机刚刚问世时,半导体的制造工艺还只能达到um级,处理器所能达到的时钟频率偏低。而且当时硬件设计语言还处于起步阶段也缺乏自动设计的工具,软件多以手工汇编编程为主。这就导致流水线设计的优势无法得到发挥,并且每条指令需要多个时钟周期才能完成。由于上述原因,当时的指令集设计往往具有以下特点: (1)尽量在每条指令中实现更多的功能。例如8051的CJNE指令,就需要在一条指令中依次实现: 与累加器做减法 修改进位标示 将结果做相等比较 根据比较结果决定是否跳转 (2)指令集庞大,以实现更多的复杂功能。例如8051虽然是8位单片机其指令集却包含高达255种不同的指令和格式 (3)由于以上两点,导致变长指令的出现,以提高内存利用率。8051的指令就有单字节、双字节与三字节三种不同的种类,而且除了对指令解码以外,没有其他的手段帮助判定指令长度。 (4)寻址方式众多。例如在8051指令集中,对数值的操作包括如下方式 立即数寻址。将常数包含在指令中。 直接寻址。将内存地址包含在指令中。 间接寻址。将内存地址放入寄存器中,然后将寄存器地址包含在指令中。 寄存器寻址。将操作数放入寄存器中,然后将寄存器地址包含在指令中 【4】8051具备CISC的所有缺点 1)尽量在每条指今中实现更多的功能 为了在实现这些复杂功能的同时保持高吞吐率,流水线的设计者不得不花更多的时间规划流水线的各级。即便如此,有些指令依然无法实现单周期吞吐,例如上文提到的CJNE指令,就需要两个时钟周期。 另外,现代的8051处理器开发,早已经采用C语言代替了早期的汇编语言而高级语言的编译器往往很难把这类复杂、多功能机器指令的威力全部发挥出来有违当初指令集的设计初衷。 当然,指令集复杂这个特点也并非一无是处。由于CISC指令集的指令复杂也使得其代码密度(CodeDensity)一般要优于同等字宽的RISC处理器 2)庞大的指令集浪费逻辑资源 庞大的指令集必然导致指令的解码阶段变得更为复杂,需要耗费更多的逻辑资源。指令集被分为两部分对它们各自的解码分别占用了流水线的一级。这样设计的原因之一就是为了在庞大指令集下实现高吞吐率、高时钟频率,而不得不做出的妥协。同样时钟频率的RISCV处理器,由于指今集比较精简,就无须做这样的妥协,从而大大节省了逻辑资源,简化了流水线设计。 3)变长指令的出现,以提高内存利用率 8051的指令有单字节、双字节和三字节三种不同的种类,除解码(Decode)外没有其他的手段帮助判定指令长度。这种变长的指令结构,导致指令之间的边界很难判定,甚至有可能导致内存的非对齐读取(UnalignedMemoryAccess),从而对流水线的取指器(InstructionFetch)设计带来挑战。 8051的内存架构是哈佛架构,其代码与数据在不同的地址空间中分开存放。这就使得代码存储部分可以单独做一些优化设计。 由于8051指令集没有其他辅助手段来帮助判定指令长度,为了确定指令的边界,8051的取指器不得不为此花费比RISCV更多的逻辑资源 4)众多的寻址方式 由于8051存在众多的寻址方式,使得指令集中的许多指令都可以访间内存这导致流水线的数据冲突(DataHazard)很难判断,有时不得不通过硬件自动插入空操作(Operation,NOP)来保持数据的正确和完整。这样既消耗了逻辑资源,又降低了流水线的效率,从而对功耗和性能造成双重打击。 参考资料及书目: 《基于FPGA与RISCV的嵌入式系统设计》作者:顾长怡 《RISCV嵌入式开发快速入门》作者:胡振波 《第六篇:CISCvs。RISC引发的思考》知乎:SerenaWang 《(计算机组成原理)RISC与CISC的区别》CSDN:我真不聪明