以下内容摘自《步步惊芯——软核处理器内部设计分析》一书
随着FPGA技术的发展,以及EDA软件工具的进步,如今的FPGA应用范围越来越广,以致出现了SOPC(System-On-a-Programmable-Chip:可编程片上系统)的概念,用可编程逻辑技术把整个系统放到一块可编程逻辑芯片上,其中可以包含处理器、DSP、RAM、ROM、总线控制器、UART控制器、以太网控制器、USB控制器、JTAG接口、FPGA编程接口等各种功能模块,且每个功能模块都可以设计成为IP(Intellectual Property)核,IP核指的是完成某种功能的设计模块。借助于IP核以及一些标准的总线接口,硬件设计开发者可以像搭积木那样搭建硬件平台。
IP核有三种:软核、固核、硬核。软核指的是在寄存器级或者门级对电路功能用HDL(Hardware Description Language)进行描述,表现为VHDL或Verilog HDL代码,软核与生产工艺无关,不涉及物理实现,为后续设计留有很大的空间,增大了IP的灵活性和适应性。用户可以对软核的功能加以裁剪以符合特定的应用,也可以对软核的参数进行设置,包括总线宽度、存储器容量、使能或禁止某些功能块等。固核是完成了综合的功能块,通常以网表的形式提交给客户使用。硬核指的是以版图的形式实现的设计模块,它基于一定的设计工艺,不同的客户可以根据自己的需要选用特定生产工艺下的硬核。软核使用灵活,但其可预测性差,延时不一定能达到要求;硬核可靠性高,能确保性能,如速度、功耗等,可以很快投入使用。
本书关注的并不是如何使用各种IP核搭建SOPC系统,我们所感兴趣的是由于采用了可编程逻辑器件设计各种硬件模块,由于使用了硬件编程语言,那么任何一个人都可以通过阅读源代码掌握各种功能模块的内部结构,比如可以掌握处理器内部的结构、原理,同样的,不需要高昂的代价、漫长的周期我们就可以在FPGA上设计自己的处理器,就像开源的操作系统将操作系统拉下神坛,开源处理器也揭开了处理器的神秘面纱,使得人人皆可谈论,正所谓:昔日王谢堂前燕,飞入寻常百姓家。
使用HDL描述的处理器称之为软核处理器。各大FPGA厂商都有自己的软核处理器IP,Altera公司的NiosII,XILINX公司的MicroBlaze,但是这些IP核都不开放源代码。在此之外还有许多开源的软核处理器。本节列举部分开源软核处理器如下:
1、OR1200
OR1200来自于OpenRISC项目,OpenRISC项目的目标是建立一个免费、开源的计算平台,这个计算平台提供一个带DSP功能的RISC处理器架构,提供一些基于该架构的RISC处理器,以及免费、开源的开发工具、库、操作系统、应用程序。OpenRISC包括OpenRISC 1000和OpenRISC 2000两个子项目,OR1200是OpenRISC 1000项目的一个主要实现,最初发布于2001年,一直在持续改进,目前的稳定版本是Rel3,采用Verilog编写源代码。OR1200是一个32位的RISC处理器,采用Harvard结构(即分开的指令与数据缓存)、5级整数流水线(本书分析认为只有3级整数流水线),并且支持MMU,具备基本DSP功能。
2、LEON系列
LEON系列至今已发布到了LEON4,这是一种SPARC V8架构的处理器。最初的LEON1与LEON2由欧洲航天局发布,LEON3由GaislerResearch公司设计发布,2008年Aeroflex收购了Gaisler Research公司,并于2010年1月发布了LEON4,不过LEON4至今还没有公布源代码。LEON系列使用VHDL编写代码,其LEON2、LEON3系列都提供了一个容错版(Fault Tolerance),分别是LEON2-FT、LEON3-FT,这主要是因为LEON系列原计划是使用在航天器上,在航天器上的电子器件面对一个特殊问题,那就是太空中的各种高能粒子具有很高的动能,当这些粒子穿过航天器的电子器件时可能会影响半导体电路的逻辑状态,甚至对半导体材料造成永久损害。单个高能粒子对电子器件功能产生的影响称之为单粒子效应。其中,导致存储内容在0和1之间发生变化的现象,称之为SEU(Single
Event Upset:单粒子翻转)。在容错版中通过一些逻辑结构纠正SEU带来的影响。LEON2采用5级流水线,LEON3采用7级流水线,同时增加了对多处理器的支持。LEON4又引入了静态分支预测、2级缓存。
3、OpenSparc系列
OpenSparc开始于2006年3月,Sun发布了OpenSparcT1的源代码,这是一个64bit的处理器,采用了SPARC V9架构,含有8个处理器核,之间通过crossbar通信,每个核支持4个硬件线程,所以共支持32个线程。此外,每个处理器核支持8K数据一级缓存、16K指令一级缓存,8个处理器核共享3M大小的2级缓存,含有4个DDR-II SDRAM控制器。2007年11月Sun发布了OpenSparcT2,采用的还是8核,但每个核支持8个线程,所以共支持64个线程,采用的是8级整数流水线,12级浮点流水线。
4、S1 Core
S1 Core是Simple RISC公司发布的,该项目基于OpenSparc,所以它也是采用SPARC V9的架构,其目的是简化OpenSparc,后者下载到FPGA上会占用很大的资源,简化的地方主要在于:只有1个64bit的处理器核,而不是8个。虽然做了简化,但根据1-CORETechnologies提供的数据显示在XILINX的Virtex-5上S1 Core需要使用37000-60000个LUTs,还是比较占用资源。
5、LatticeMicro32
LatticeMicro32是Lattice公司发布的32位RISC软核处理器,该处理器虽然由Lattice发布,但也可以使用在其他厂商的FPGA上,如Altera的FPGA,这就比NiosII有优势,NiosII只能使用在Altera的FPGA上。LatticeMicro32采用Harvard结构、32个通用寄存器、32个外部中断、可选的指令与数据缓存、Wishbone总线接口。提供了三种配置模式使得用户可以在占用资源与速度之间取舍:(1)基本模式:没有乘法器、没有缓存、多周期转换器;(2)标准模式:有乘法器、8K指令缓存、没有数据缓存、流水线转换器;(3)完全模式:有乘法器、8K指令缓存、8K数据缓存、流水线转换器。
软核处理器还有其它很多种,本书不一一介绍,本书将对OR1200进行深入的剖析,至于为何选择OR1200作为剖析目标,笔者在序言中已明确,此处再重复一下:一通百通、融会贯通、取长补短、创新提高。
在1-CORE Technologies公司的网站上对主要的软核处理器进行了一个比较,如表1.1所示。值的注意的是表1.1中所列出的软核处理器都是RISC处理器,在之前的介绍中,也多次提到过RISC,RISC是精简指令集计算机(Reduced Instruction Set Computer),与之相对的是CISC,即复杂指令集计算机(ComplexInstruction Set Computer)。在计算机的发展早期,人们使用汇编语言编程,偏好强大好用的指令集,处理器的设计人员于是将指令集设计得更强大、更灵活,并且那个时期的存储器既昂贵且速度慢,因此指令使用了变长编码,以节约存储空间,由于一条指令就能完成很多的功能,对内存的访问也减少了,这样也减少了缓慢的存储器访问对程序性能的影响。典型的CISC指令集就是Intel的x86指令集。上世纪70年代中期,人们发现在CISC指令集的各种指令中,其使用频率相差悬殊,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20%,显然,这种结构是不太合理的。于是人们提出将指令集和处理器进行重新设计,减少那些使用不多的指令,只保留常用的简单指令,这样处理器就不需要浪费太多的晶体管去做那些很复杂又很少使用的功能,于是产生了RISC。1979
年美国加州大学伯克利分校提出了RISC的概念,RISC 并不只是简单地减少指令,更主要的目的是研究如何使计算机的结构更加简单合理以提高运算速度。其特点是指令长度固定、指令格式种类少、寻址方式种类少、大量使用寄存器。由于在RISC中使用的指令大多数是简单指令且都能在一个时钟周期内完成,因而处理器的频率得以大幅提升,同时易于设计流水线。RISC是计算机历史上的一个里程碑,以致有人开玩笑的把RISC定义为:1985年之后发布的所有处理器。