>
摘 要:本文介绍了虚拟原型技术在当前SoC设计中的作用,ARM的虚拟原型工具Maxsim的使用和建模方法,以及如何使用Maxsim建立一个基本的ARM9嵌入式系统。文章最后给出了运行在模型上的testbench的编写、性能测试和分析。
关键词:虚拟原型;SoC;Maxsim;ARM;SystemC
引言
随着SoC芯片复杂度的不断增加,在SoC设计的早期阶段,具有能够对系统建模、软硬件划分等进行设计验证的工具已成为业界的需求之一。
为此,虚拟原型技术应运而生。它其实就是一个虚拟的硬件原型,用于在构建硬件系统之前虚拟其软件模型,在其上开发和运行应用软件,分析性能,并进行软硬件的划分权衡。ARM提供了虚拟原型工具Maxsim,利用它可以设计虚拟硬件平台,仿真硬件系统,并进行性能开销折衷方面的分析。
本文使用Maxsim设计出一个简单的ARM9平台,在其上运行了进行大量内存、寄存器访问和中断控制的测试程序,并分析了性能。
虚拟原型的设计流程
传统的嵌入式系统开发流程具有系统架构难以更改,软硬件难以协同设计,软件滞后于硬件开发等缺点,不适合当今SoC系统的开发。
基于虚拟原型的系统开发流程如图1所示,它在系统架构设计阶段就利用虚拟原型开发工具进行仿真分析,找到合适的系统架构,并构造出一个参考的虚拟原型供软、硬件开发使用。从而在真正的硬件构建出来之前,就能在此虚拟原型的基础上进行软件开发。这样加快了开发速度,避免了系统架构和应用软件不匹配的问题,更加适合复杂SoC系统的开发。
图1 基于虚拟原型的系统开发流程
图3 仿真系统结构
虚拟原型工具Maxsim
的结构和特性
当前国际上出现的虚拟原型工具包括ARM提供的Maxsim和Coware的ConvergenSC。Maxsim提供了对ARM系列微处理器核的最好支持,而ConvergenSC则提供了更加通用的SystemC模型,适合一般的非ARM嵌入式产品开发。
Maxsim基于SystemC语言,提供了周期精确级和事件驱动事务级的两种仿真方法。Maxsim工具包括MaxSim Designer、MaxLib元件库和Maxsim Explorer三部分:MaxSim Designer用于创建元件模板和组建系统,可以将创建好的元件加入到MaxLib库中;Maxsim Explorer则对组建好的系统进行仿真分析。
MaxSim Designer的主要作用是探索系统的最佳架构,包括CPU内核、存储器、cache、总线结构、DMA等的最佳配置和组合;还可以通过向导生成一个元件框架,再往其中添加代码描述行为,生成一个自定义的部件。
MaxSim Explorer可以对生成的系统进行仿真,仿真流程如图2所示。工具在创建阶段调用各对象的构造函数,初始化各数据结构;在配置阶段配置各对象运行时的参数;在初始化阶段根据配置阶段配置的参数为一些动态数据结构分配内存;在互联阶段建立对象间的连接,一旦开始运行仿真,这些连接就不能改变;在复位阶段将各对象复位为确知的状态,避免由于启动时状态不确定带来的错误;在通信阶段执行对象间的通信,但不更新对象内部状态和共享资源的值;在更新阶段更新各对象的内部状态和共享资源的值,但不进行对象间的通信;在结束和析构阶段执行仿真结束和释放内存等操作。通信和更新阶段交替运行,仿真得以一拍一拍地运行,直到达到指定的仿真结束条件。
将编译产生的动态链接库加入到MaxLib库中,就可以在以后的系统搭建中重复利用。
用MaxSim创建ARM9
的虚拟原型
创建系统仿真模型
为了测试一个ARM9通用系统的I/O性能,本文创建了一个仿真模型,结构如图3所示。图中clk(时钟)、irq(中断信号)、ahb(AHB总线)、mem(内存总线)、apb(APB总线)等均为信号名称,有的是逻辑信号,有的是抽象信号接口。
该模型通过Maxsim Designer创建,其中中断控制器为自定义的模块,其它都是MaxLib库中的现有模块。添加好各个模块后,将各模块的抽象端口连接起来,启动MaxSim Explorer来对该系统模型进行仿真,加载应用程序testbench.axf,分析系统性能。
创建中断控制模块
为了分析系统的中断性能,本文创建了一个中断控制器。该元件是个Cycle-based SystemC模块,具有四个端口:apb端口(transaction slave)是对ARM APB总线访问的抽象接口,isrc端口(signal slave)是中断源发出的中断信号接口,clk是时钟端口,irq端口(signal master)是向CPU发出中断请求的信号接口,这些端口和其它元件的连接如图3所示。
用Component Wizard生成元件的源代码框架,再往其中添加代码描述其行为,这里主要介绍一下向CPU发出中断的代码。
isrc端口捕捉来自中断源APB Timer的溢出信号,在Update函数中对捕捉到的信号加以锁存。在Communicate函数中检查内部中断锁存信号,决定是否向CPU输出中断,代码如下:
void MyIntCtrl::communicate()
{
if (readyToDriveSignal) //分析在Update阶段接收到的信号,是否需要发出中断
irq_SMaster->driveSignal(1, NULL); //通过irq端口输出到CPU
if(readyToClearSignal) //是否需要清除中断
{
readyToClearSignal = false;
irq_SMaster->driveSignal(0, NULL); //清除对CPU的中断请求
}
}
irq_SMaster是MaxSim提供的接口类,用于向别的元件输出信号(signal master),调用其driveSignal函数来输出指定值的信号。如果readyToDriveSignal为真,则输出中断信号;如果readyToClearSignal为真,则撤销中断信号,中断信号通过irq端口连到ARM9 CPU。
代码在Unix或Windows环境下进行编译,这里使用Visual C++6.0,编译产生出MyIntCtrl.dll文件,将此文件的路径添加到MaxSim的配置文件中。
仿真测试
构建测试程序
测试程序是由C和ARM 汇编混合的代码,C文件中实现了主函数和中断操作,汇编中实现了内存和寄存器操作。主要函数功能如下所述。
RegisterToMemory函数实现寄存器和SDRAM之间的数据传输,它将r4、r5、r6 和r7四个寄存器的值写为 0xaa55aa55,然后将这四个寄存器的值写到地址从0x30000000到0x363fffff共
MemoryToMemory函数实现SDRAM块之间的数据传输,它从首址为0x30000000的内存区域传输
StartTimerInt函数的主要功能是使能中断,启动定时器。StopTimerInt函数清除中断。
IRQ_Handle是中断ISR,当中断产生时会被调用,功能是将地址在0xa0000000的内存的值交替地在0和1间进行改变。
最后通过使用armcc和armlink对testbench源代码进行编译和链接,产生testbench.axf,在仿真时加载到仿真模型中运行。
测试结果分析
本文中测试环境为Intel Pentium4
通过在MaxSim上建立虚拟原型,并运行ARM测试程序,分析了系统性能,这样的性能对于运行Mpeg4或H.264等大型应用而言还是不够的,因此在改进系统的性能时可以从以下几个方面入手:将ARM9虚拟内核由现在的Cycle Approximate改为Cycle Accurate,增加内部SRAM,在其中存放中断向量表,增加Cache,扩展外设和存储设备,增加E2PROM等来存储程序,使用DMA而不是通过中间寄存器来搬移数据。这样的模型会更加接近实际的硬件原型。
结语
对于软件人员而言,虚拟原型就是一台虚拟的嵌入式平台,在其上可以开发应用程序,而不必等到硬件开发完毕才能进行软件开发。在复杂的SoC设计中,使用虚拟原型的设计流程无疑具有重大的意义。