基于RISC架构的龙芯处理器
市场上可见到的处理器大致可以分为以下两类:CISC处理器和RISC处理器。CISC技术多用在个人电脑等通用处理器上。RISC技术多用在嵌入式处理器上(我们可以认为除了通用处理器,所有的处理器都是嵌入式处理器),比如手机处理器芯片、GPS处理器芯片、掌上电脑处理器芯片、工业控制芯片、医疗设备芯片。甚至数字电视机顶盒、空调、电冰箱、洗衣机等家电产品中也有基于RISC技术的嵌入式微控制器。ARM公司和MIPS公司的处理器IP核、SUN公司的SPARC处理器、IBM公司的Power PC处理器都是基于RISC技术的。使用ARM、MIPS处理器IP核的SoC片上系统更是不可胜数,代表企业恩智浦半导体公司、三星公司等。据统计,每年Intel的个人电脑处理器出货量,只占世界处理器出货量的1%。加上AMD、Mackintosh的个人电脑处理器,也只有大约2%的市场份额。剩下的98%市场份额,都是基于RISC技术的嵌入式处理器的天下。
北京神州龙芯集成电路设计有限公司自主研发的,具有自主知识产权的龙芯处理器和龙芯处理器IP核基于MIPS架构。MIPS架构是RISC架构中结构最先进、性能最出众的一个大家族。
RISC的定义
那么什么是RISC呢?RISC这个概念运用比较混乱。有的书上将"Reduced Instruction Set Computing",即精简指令集的英文首字母缩写,定义为RISC。有的书上将"Reduced Instruction Set Computer",即精简指令集计算机的英文首字母缩写,称为RISC。Dominic Sweetman的《See MIPS Run》给了关于RISC最精确的定义:RISC是一个形容词,它可以和"计算机"、"处理器"、"体系结构"、"指令集"等词搭配,组成"RISC计算机"、"RISC处理器"、"RISC体系结构"、"RISC指令集"等概念。更重要的是,RISC是一种理念、一个灵魂、一条处理器发展的道路。
长期以来,人们都有以下偏见:认为RISC性能上、技术上不如CISC,认为RISC是CISC的缩减版,RISC中的R不就指的是"精简"么?为了理解RISC,我们有必要先从RISC的起源说起。
早在RISC这个词被提出以前,处理器和指令集是没有CISC和RISC之分的。换句话说,当时所有的处理器和指令集都是Complex Instruction Set Computer/Computing(CISC)。直到1974年IBM公司的研究员John Cocke通过分析计算机指令和处理器的运行得出这样的论断:20%的简单计算机指令完成了处理器80%的工作。复杂的指令可以用几个简单的指令的组合来实现。后来加州Berkely大学的David Patterson正式提出了RISC这个名词。从此,RISC的理念开始深入人心。可以说,上世纪八十年代以来的处理器,或多或少都用到了RISC的技术。
RISC的特点
1. 减少指令子集和取消微指令
相比CISC,RISC除了削减一些复杂的指令,由简单指令的组合完成它们的功能外,使用用的计算机指令子集也更少。指令子集是指具有类似功能的指令的集合,比如加法指令子集、移位运算指令子集、分支跳转指令子集。由于处理器完成每个指令子集需要特定的晶体管和电路来实现,更大的指令集和更多的指令子集意味着处理器的结构相对复杂,效率相对低下。
传统的CISC处理器采用微指令,即利用软件算法来处理一些复杂指令。RISC的核心思想是取消微指令和复杂指令,将所有的简单指令用硬件来实现。众所周知,用硬件实现一个算法,其执行速度是用软件实现这个算法的成千上万倍,因此使用RISC的处理器可以在更高的速度下运行。
2. 随设计工艺的进步而发展
除性能提高外,RISC还带来了相关设计方法的进步。首先,由于复杂指令的摒弃和指令类型的减少,处理器内用来实现这些指令消耗的晶体管减少了,电路也得到了简化,这意味着更低的成本。其次,由于RISC处理器结构得以简化,芯片上晶体管和电路布局更具有灵活性。第三,RISC技术往往和新兴的EDA软件相结合,使设计和验证的效率得到了很大提高,处理器的设计周期也大大缩短。芯片设计制造商可以利用技术优势得到最多价值。第四,由于指令集精简,操作系统和应用程序的开发员更容易掌握它们。第五,由于高级计算机语言编译器倾向于使用更小的指令集,所以可以生成效率更高的代码。
3. 使用流水线大大加快指令执行效率
RISC处理器的另外一个特点是采用流水线。由于摒弃了复杂指令,每个简单指令的执行时间,甚至每个指令步骤(比如取指令、译码、运算、写回)的执行时间得到了统一。可以用专门的晶体管和电路来实现特定的指令步骤,比如让一部分晶体管和电路专门用来取指令,而另一部分晶体管和电路则专门用来译码,等等。这样,这些功能模块就可以像流水线上的工人一样,各负其职。当前面一个指令进行运算的同时,后面一条指令已经在进行译码。如果一个指令步骤需要很长的时间,可以将它分成几级流水线,尽量让每级流水线工作所占的时间大致相同。