系列文章目录
上一节:从零开始的RISCV架构CPU设计(1)-CPU开源资料说明
文章目录
前言
从指令集架构的角度来看,现在流行的两种指令集架构为复杂指令集(Complex Instruction Set Computer)即CISC以及精简指令集(Reduced Instruction Set Computer,)即RISC。
在CPU发展早期,CISC作为主流,凭借其灵活、指令集易拓展等优点,占据了CPU领域的半边江山,但随着其不断发展,指令集不断壮大,CISC的缺点也越来越多。针对其缺点,在20世纪80年代,无病一身轻的CPU界新星RISC架构便诞生了。
一、什么是CISC
CISC(Complex Instruction Set Computer)指令集是由Intel公司推出的,Intel 8086处理器为最典型的代表;
CISC的指令系统十分庞大,一般CISC架构CPU包含的指令可达300条以上,其中除了处理器常用的指令外,还包含了许多的不常用指令,一方面这使得CPU在进行相关的软件设计时更加简单灵活,功能也可更加强大,比如我们如今所熟悉的Windows系统就是在以CISC架构的CPU上运行的;但另一方面来看,实际上在CPU运行程序时,仅使用了指令集中的20%,其余80%的指令集虽已设计,但却很少用到。
一方面,这会导致硬件利用效率不高,计算机的高性能往往通过增加硬件复杂度,压榨硬件性能所得到的,如今设计了这么多的指令,但真正常用的指令仅20%,这些很少用到的指令,增加了CPU设计的难度和开发时间,也大大增加了硬件设计的面积。
另一方面,这也对开发者造成困扰。经过几十年的发展,CISC架构的CPU文档篇幅可以多大几千页,难以想象这么多的文档打印出来可以垒到一个桌子这么高。
二、什么是RISC
RISC(Reduced Instruction Set Computer)架构是由Berkeley大学的David Patterson教授提出的。
RISC架构指令集处处体现着大道至简的思想,在指令集上采用了等长指令集的设计,且仅保留了常用指令。这使得有关RISC的指令集文档在篇幅上大大减少,相较于CISC的1000多页指令集文档,RISC仅100多页;其次,在摒弃了冗长的指令后,RISC在芯片的面积上也大大降低,第一款搭载了RISC架构指令集的CPU RISC-I仅由44420个晶体管组成,而同年代的CISC设计消耗的晶体管平均在100000个左右。
除此之外,RISC还具有一个最大的优势即开源,其相当于电脑操作系统界的Linux、手机操作系统界的Android,这一巨大优势必然能使得RISC蓬勃发展。
但RISC是无法取代CISC的,就目前来说,RISC的发展还是不如CISC,其面临无数的挑战,如市场等,目前RISC主打的市场领域为微处理器(MCU)。
三、CISC与RISC
3.1 指令集实现架构
· CISC
CISC在实现指令的过程中依靠存于只读存贮器(ROM)中的微程序实现,其核心的部件为微程序控制器。一条指令会由多条微程序来实现。
· 微指令表(部分)
·微程序流程
· RISC
RISC采用了硬布线逻辑,其将程序控制部件专门做成由固定时序信号控制的逻辑电路,所以不存在CISC中类似的微指令控制器部件。
3.2 指令长度
· CISC
CISC的指令长度不等长,如:
IN R0,SW-DATA的机器码是001xxxxx;
ADD R0,[n]的机器码长为010xxxxx_n;
· RISC
RISC指令的长度往往是相同的;各指令间指令码格式也大同小异;
3.3 访存与寻址
· CISC
具有的访存指令,访存方式较多,搭配较多;
寻址方式也较多,有寄存器寻址、立即寻址、直接寻址、间接寻址、变址寻址、基址寻址、基址+变址寻址;
· RISC
访存指令仅有Load/Store(加载/存储)指令;
3.4 指令周期
· CISC
不同指令执行需要的时钟周期相差很大,指令的执行往往需要多个时钟周期;
· RISC
大部分指令的执行所需时钟周期相同,在采用流水线技术的前提下,大部分指令可以在一个时钟周期内完成;
3.5 编译器
· CISC
编译器优化实现高效代码困难;
· RISC
优化编译实现容易;
本节总结
相对规整的指令形式使得RISC指令集更容易通过硬件实现,且能够在使用更少资源的情况下,达到较高的性能;
但这种实现方式基于硬布线逻辑,这就意味着指令集架构一旦实现就不再好修改了,因为若要增删改查指令,需要对硬件重新实现;而CISC的微指令控制器相对灵活,只需要烧写存储微指令表的ROM即可实现指令的修改和拓展;
四、RISC-V架构指令集
RISC-V是在RISC的思想上,通过若干次迭代更新后,实现的产物,自此,大量基于RISC-V指令集架构的CPU、SOC等设计涌现出来。
目前已有许多RISC-V架构CPU:
1)Rocket Core
2) BOOM Core
3)Freedom Soc
4)蜂鸟E200系列
大多数CPU也秉承了RISC的开源理念,在各平台上开源。详细的RISC-V指令集将在后续介绍。
五、RISC-V的大道至简
或许通过上面的描述,大家对两种指令集架构CPU的优缺点有了一定的了解,但对RISC-V大道至简的思想还很模糊。这边我通过几个例子来给大家体现一下:
在RISC-V中,仅设计了sub指令,并没有设计立即数减;
立即数减通过立即数加addi来实现,如addi x2,x1,imm,该指令表示x2 = x1 + imm,imm为立即数若为负数则完成了立即数减法,因为1-2等于1+(-2),RISC-V以这样的方式用一个addi完成了两条指令的功能;addi指令还可以用于加载立即数,如addi x1,x0,imm表示x1 = x0 + imm。由于x0寄存器永远为0,所以x1 = imm;
这样的思想在很多地方都有体现,再如条件分支跳转指令,在CISC上,我们是通过判断状态寄存器来实现的,而在RISC中不存在状态寄存器,直接通过分支跳转指令实现,且RISC-V 架构特地定义了所有的带条件跳转指令跳转目标的偏移量(相对于当前指令的地址〉都是有符号数,并且其符号位被编码在固定的位置,这使得静态预测很容易实现
。
同样在产生异常时(上溢、下溢、除法除0等),RISC-V均不会产生异常,而是将当前的运算结果或目的寄存器置数为某个特定值,推荐通过软件的方法来发现这些错误。
总结
总之,无论从架构上来看还是从指令实现上来看,RISC都透露着简单即是美的思想,这也是笔者为什么选择RISC作为本次设计的CPU架构。由于篇幅限制,本篇也仅总结了两种架构CPU的特点,每种CPU涉及的知识也仅仅是冰山一角,若对此想深入研究,也可以阅读下RISC的指令集文档。
在下一篇系列文章,将对CPU的两种实现方式单周期(状态机)、多周期(流水线)进行介绍。
《手把手教你设计CPU——RISC-V处理器篇》