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