最后编辑于: 2010-11-04 10:19 | 分类: FPGA | 标签: NIOS | 浏览数: 456 | 评论数: 0
随着VLSI设计技术和深亚微米制造技术的飞速发展,SOC(SystemonChip)技术逐渐成为了集成电路设计的主流技术。SOC已经在便携式手持设备、无线网络终端和多媒体娱乐设备等领域得到了广泛的应用。
高性能的处理器核是SOC设计中最为关键和核心的部分。绝大多数SOC的处理器都采用了RISC体系结构。RISC处理器具有指令效率高、电路面积小和功率消耗低等特点,满足了SOC高性能、低成本和低功耗的设计要求。目前在SOC设计中广泛使用的32bitRISC处理器,如ARM公司的ARM处理器,IBM的PowerPC处理器,MIPS公司的MIPS处理器,Motorola的MCore处理器,Tensilica公司的Xtensa处理器等均属于商业内核,使用者必须支付相对昂贵的授权费。
近年来开放源代码运动迅速发展,开放性源码的概念已经从软件领域(如Linux,Gcc,MySQL等)扩展到了硬件领域,出现了像OpenCores这样专门发布免费的IP核源代码的组织。本文比较和分析了三种“免费”的开放性32bit处理器内核:GaislerResearch公司的LEON2,OpenCores组织公布的OpenRISC1200和Altera公司的NiosII。这三种开放性处理器凭借其高性能、低成本,良好的可配置性和完善的开发环境,受到了学术界和工业界的普遍重视。
LEON系列32位RISC处理器核的第一个版本是EON1,它是由欧洲航天局(EuropeanSpaceAgency)主持设计开发的。LEON1的设计初衷是为了使欧洲能够摆脱在航空航天高性能嵌入式处理器上对美国的严重依赖。以JiriGaisler为首的设计团队在完成LEON1后从欧洲航天局独立出来,成立了GaislerResearch公司,相继推出了LEON2和LEON3处理器。LEON系列处理器软核均以RTL级VHDL源代码形式免费公布,使用者可以在GNULGPL(LibraryGeneralPublicLicense)下对其源代码进行使用和研究。LEON系列处理器在结构上有很高的一致性和继承性,我们选用比较稳定的LEON221.0.222xst版本进行研究分析。其结构框图如图1所示:
图1 LEON2结构框图
LEON2的整数处理单元是5级流水线设计,采用了SPARCV8(IEEE-1754)指令和体系结构,具有分离的数据Cache和指令Cache。LEON2的整数单元包括一个可选的16×16的MAC单元,能够完成基本的DSP运算,同时还提供了浮点运算单元(FPU)的接口和协处理器(CP)的接口,可以扩展浮点运算和DSP处理。
LEON2选用了ARM公司的AMBA2.0片上总线标准,用于连接内存控制器(MemoryController),定时器(Timers),中断控制器(IrqCtrl),UART接口,PCI接口,10/100M以太网接口等模块。LEON2同时还提供了一个调试支持单元(DebugSupportUnit)和一个调试串口(DebugSerialLink),用于支持片内调试。
LEON2的一个非常重要的特点就是具有很好的可配置性。使用者根据自己的需要,通过一个用tcltk脚本编写的图形化界面,对LEON2内核的绝大多数模块进行配置,比如可以配置Cache的大小和访问方式,是否支持硬件乘?除法,是否需要内存管理单元(MMU),PCI接口,以太网接口等。
GaislerResearch公司提供了比较完善的基于LEON2的GNU软件开发环境。使用者可以使用TSIM或GRMON进行LEON内核的调试仿真。ECCS是专门针对LEON的交叉编译系统,可以进行C/C++的编译和调试。SnapGearLinux是基于LClinux的实时Linux内核,它的LEON版提供了对LEON处理器的全面支持,可以支持MMU和NOMMU等不同配置方案。
OpenRISC1000系列处理器是开放IP核源代码组织Opencores公布的32*64位处理器软核。使用者可以在GNULGPL下免费使用其RTL级的Verilog源代码。OpenRISC1000系列处理器有很多版本,我们选用了目前最新的OpenRISC1200进行研究分析,其结构如图2所示:
图2 OpenRISC1200结构框图
OpenRISC1200采用了自主设计的OpenRISC1000体系结构和自定义的ORBIS32指令集。OpenRISC1200是Harvard结构设计,拥有一个5级流水线的整数单元。OpenRISC1200有一个32×32的MAC单元,具备基本的DSP处理功能。
OpenRISC1200还可以根据需要自定义用户指令。OpenRISC1200具有1K~64K可配置大小的数据Cache和指令Cache以及可供选择的内存管理单元。OpenRISC1200同时还提供了一个用于降低功耗的电源管理单元(PowerManager)和一个支持片内调试的调试单元(DebugUnit)。OpenRISC1200采用了Silicore公司提出的WISHBONE开放性总线标准,包括一个数据WISHBONE接口和一个指令WISHBONE接口。总线管理模块(TrafficCop)将内存控制器,调试单元,UART接口,PCI接口,Ethernet接口等模块连接在一起。OpenRISC1200具有较好的可配置性,使用者可以根据自己的需要配置Cache的大小,是否使用MMU,并可以定制自定义的指令。不过目前OpenRISC1200还没有图形化的配置界面,使用者必须根据需要修改配置定义文件or1200defines.v。
OpenRISC1200有完善的软件开发环境(SDK)和操作系统的支持。使用者可以通过包括Sourcenavigator,Gcc,Binutills,Gdb等在内的GNUToolchian工具方便的进行基于OpenRISC1200内核的编码、编译和调试。同时,OpenRISC1200拥有专门的仿真器Or1ksim,可以进行OpenRISC1200的仿真。OpenRISC1200还支持Linux,LClinux,RTEMS,RedHaeCos等多种操作系统。
Nios系列处理器是Altera公司推出的基于RISC体系结构的通用嵌入式处理器软核,它是Altera的可编程逻辑和可编程片上系统(SoPC)设计综合解决方案的核心部分。Altera前后推出了两代Nios系列处理器:Nios和NiosII。Nios是其第一代产品,是准32bit的RISC处理器,具有16bit指令集和16*32bit数据通路。NiosII是第二代完全32bitRISC处理器,具有32bit的指令集、数据通路和地址空间。我们选用了NiosII进行比较和分析。图3是典型的基于NiosII的系统。
图3 典型的基于NiosII的系统
NiosII处理器是5级流水线设计,采用数据和指令分离的Harvard结构。NiosII拥有自己专用的体系结构与指令集,支持32bit的硬件乘除法指令,有32个通用寄存器。用户还可以根据自己的需要自定义最多256条指令。
NiosII采用了Altera公司自己的Avalon片内总线标准,用于连接定时器,UART接口,LCD接口,内存控制器和以太网接口等片内模块。NiosII同时还提供了一个Debug模块,支持JTAG在线调试。Altera公司为NiosII提供了极为完善的软硬件开发环境。NiosII处理器方案是基于HDL源码构建的,提供了三种性能和资源消耗不同的基本软核:NiosII/f(快速型),NiosII/s(标准型)和NiosII/e(经济型)。通过QuartusII开发软件中的SOPCBuilder系统开发工具,使用者可以在任何一种软核的基础上方便的配置符合自己的需要NiosII内核。
Altera公司同时为NiosII提供了基于GNUC/C++toolchain和EclipseIDE的软件开发环境。用户可以在这个开发环境下方便的完成编码、仿真和调试等工作。NiosII的开发套件内免费提供了一个Luc/OS2II的实时操作系统支持,同时NiosII还支持LClinux,NucleusPlus,KROS等第三方操作系统。和上面所提到的LEON2和OpenRISC1200两种完全开放的处理器内核不同,NiosII内核属于“半开放”的内核。用户可以免费获得NiosII的开发平台,不过NiosII只支持Altera的Stratix和Cyclone器件。用户只能在Altera的FPGA芯片上免费使用NiosII,而且无法获得NiosII的HDL源代码。另外设计者若要在ASIC设计中使用NiosII内核,则需要向Altera公司支付一定的授权费用。
相同处理器内核在不同工艺、不同结构配置下性能会有较大的差别。为保证评测的客观性,我们在相同工艺,相同结构配置下对三种处理器内核分别在FPGA和ASIC两个平台上,从性能和面积两个角度进行了比较和分析。
目前嵌入式处理器并没有统一的性能测试标准,我们选择了当前各个嵌入式处理器提供厂商广泛采用的DhrystoneV2.1Benchmark评测标准。DhrystoneV2.1Benchmark是ReinholdWeicker编写的用于测试系统的整数处理能力的测试程序,它有公开的源代码和测试结果。
DhrystoneV2.1Benchmark是由C语言编写,包括各种赋值语句,控制语句,过程调用和参数传送,整数运算及逻辑操作等。在不同的处理器平台上运行Dhrystone测试程序,得到DhrystoneperSecond的参数值,并以VAX-11/780为参照值,换算出Dhrystone2.1VAXMIPS(DMIPS)的值。因为VAX-11/780的测试结果为1757个DhrystoneperSecond,将其作为参照,得出DMIPS=DhrystoneperSecond/1757。因为处理器的性能与工作频率密切相关,在不同工作频率下测算出的DMIPS是不同的,所以通常使用DMIPS/MHz作为标准,评估各个处理器的结构优劣和性能高低。
我们选用Altera的Cyclone开发板(EP1C20F400C7)作为FPGA的硬件测试平台,分别评测LEON2,OpenRISC1200和NiosII在FPGA上的性能。为保证评测结果的准确性,我们将三种处理器配置成为大体相当的评测系统,如图4所示。编译好的Dhrystone程序将被下载到板上的SRAM中运行,运行的结果通UART或JTAG端口输出到PC终端。定时器(Timer)是Dhrystone程序运行所需的计时设备。由于体系结构的差异,各个处理器在有些部分的实现细节并不完全和图4相同(比如LEON2使用了两个UART,分别用于调试和输出,而OpenRISC1200和NiosII则选择使用一个JTAG接口进行调试),但其大体结构都是相同的。同时我们还在三种处理器核内均实现了32×32bit的硬件乘除法指令。
图4 FPGA平台评测系统
LEON2的源代码中提供了在各种器件如Xilinx,Actel等上的综合支持。不过LEON2没有提供对Altera器件和相应开发板的支持,因此必须要首先编写添加tech_cyclone.vhd文件,并修改源代码中target.vhd和tech_map.vhd文件。然后使用QuartusII进行综合的结果显示:LEON2使用了11702个逻辑单元(LogicElements)和242748内存位(MemoryBits),其最高频率可达61.95MHz。在25MHz和50MHz的FPGA中,LEON2可以分别达到35398.2和72289.2DhrystoneperSecond。即在25MHz下LEON2可达到20.15DMIPS,在50MHz下为41.14DMIPS,相当于0.82DMIPS/MHz。
OpenRISC1200的源代码中提供了对Altera器件的支持,因此只需修改其代码,配置成所需要的系统构架。由于OpenRISC1200采用的是WISHBONE片上总线,所以还要专门给板上的SRAM写一个WISHBONE的接口。QuartusII的综合结果显示OpenRISC1200共使用了9624个逻辑单元和217344内存位,其最高频率可达46.02MHz。在25MHz的FPGA中,OpenRISC1200可达到32918.2DhrystoneperSecond,即18.74DMIPS。其性能相当于0.75DMIPS/MHz。Nios是Altera公司专门针对Cyclone和Stratix器件设计的处理器。Quartus中的SOPCBuilder系统开发工具,可以方便的配置出符合要求的NiosII处理器。Quartus的综合结果显示Nios共消耗了6615个逻辑单元和181248内存位,最高频率为65.78MHz。在50MHz下,测得FPGA中的NiosII为69915.8DhrystoneperSecond,相当39.79DMIPS,其性能为0.80DMIPS/MHz。为了进行纵向的对比,我们还评测Nios的性能。Nios共需4535个逻辑单元和231424个内存位,最高频率为61.65MHz。在50MHz下Nios可以达到18.88DMIPS,其性能为0.37DMIPS/MHz。显然NiosII比Nios在性能上有了很大的提高。
图5给出了几种处理器的性能对比图。显然三种32位处理器的性能比指令集为16位的准32位Nios处理器高出很多。在三种32位处理器中,LEON2的性能最好为0.82,但其相应的所耗的资源也最多。和LEON2相比,OpenRISC1200的性能稍差为0.75,但其所占用的逻辑单元也较少。Nios处理器的测试性能可达0.80,而且其所消耗的逻辑单元仅为LEON2的57%。这是由于Nios针对Cyclone器件进行过专门的优化,导致了Nios在Cyclone器件上的出色表现。为了使比较更加全面和深入,我们还对评测系统进行了ASIC平台上的对比。由于NiosII并不提供源代码,仅针对Altera的FPGA器件是免费的,因此我们仅对比了LEON2和OpenRISC1200两种完全开放性内核。我们使用中芯国际(SMIC)的RapidCompiler完成Registerfile中所需的双口SRAM和Cache模块所需的单口SRAM的设计,并使用Synopsys公司DesignCompiler和SMIC的0.18Lm的标准单元库完成了两种内核RTL代码的综合和优化。相当占用了152904个门单元,最差条件下的最高频率为160MHz。OpenRISC1200共使用了148455个门单元,最差条件下的最高频率为125MHz。显然LEON2的运行频率更高,但其所占的面积也相对更大。
图5 四种处理器性能对比图
本文从结构和性能两个方面比较了LEON2,OpenRISC1200和NiosII三种32位RISC处理器内核,概括如表1所示。
通过以上比较和分析可以看出,LEON2和OpenRISC1200主要是面向ASIC设计,它们具有开放的源代码以及相关ASIC平台开发的支持。其中由于LEON2处理器得到了欧洲航天局的资助,其开发文档和技术支持也相对更为完善。虽然NiosII在Altera的器件上具有良好的性能并且Altera公司提供了完善的文档和技术支持,但是由于NiosII只能应用于Altera的器件,所以其使用范围受到了一定的限制。