嵌入式系统软件仿真器的研究与实现.doc_第1页
嵌入式系统软件仿真器的研究与实现.doc_第2页
嵌入式系统软件仿真器的研究与实现.doc_第3页
嵌入式系统软件仿真器的研究与实现.doc_第4页
嵌入式系统软件仿真器的研究与实现.doc_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统软件仿真器的研究与实现第一章 绪论11.1课题背景11.2软件仿真模型的提出11.3课题来源21.4章节安排2第二章 嵌入式系统软件仿真器的相关技术22.1嵌入式系统22.2开发方式比较32.3软件仿真技术42.4构件技术42.4.1构件概述52.4.2构件模型62.4.3构件设计62.4.4基于构件技术开发的现状72.5事件驱动仿真算法72.6逻辑仿真算法92.7本章小结9第三章 软件仿真器模型研究93.1结构仿真器分析103.1.1 SimpleScalar模拟器软件架构113.1.2 out-of-order模拟器内核123.1.3模拟器主要数据结构133.1.4 out-of-order模拟器流水线分析143.2指令集仿真器分析153.2.1 ARMulator介绍153.2.2 ARMulator组成163.2.3 ARMulator使用173.3软件仿真器模型GSSM173.3.1典型微控制器结构分析173.3.2 GSSM体系结构183.3.3控制核的设计193.3.4 GSSM基本特征203.3.5 GSSM工作流程203.4本章小结21第四章 软件仿真器的设计实现214.1 AT91X40体系结构214.1.1 ARM指令编码214.1.2 ARM指令分类说明224.1.3 Thumb指令编码234.1.4 Thumb指令分类说明244.1.5硬件结构和编程模型254.2软件仿真器设计304.2.1信息家电仿真系统的体系结构304.2.2软件仿真器结构314.2.3工作流程324.3实现原理334.3.1交互机制334.3.2控制模块384.3.3中央处理器模块404.3.4存储器模块444.3.5系统集成模块444.3.6设备模块464.3.7通信管理模块494.4数据结构504.5本章小结56第五章 软件仿真器验证565.1软件仿真器的验证565.2结果分析575.3本章小结57第六章 总结和展望576.1工作总结576.2创新点586.3后续研究展望58参考文献58致谢61个人简历、在校期间的研究成果及发表的学术论文62个人简历62研究成果62学术论文621第一章 绪论1.1课题背景对于后PC时代和pervasive computing(普适计算)而言,嵌入式系统将无处不在,而嵌入式系统的开发难度却越来越大。一般的嵌入式系统开发不能脱离开一个具体的硬件环境。有时开发的时候,硬件还没有,而工期又紧,这时可以开始软件开发。需要硬件的地方可以用软件模拟的硬件仿真器来代替。就是有时项目的时间并不是关键因数,但是一般的硬件的仿真器比较贵重,这时从经济的因数来考虑也可以用软件模拟的软件仿真器来代替。当在软件平台调试完成以后,最后才下载都嵌入式硬件环境中。在当今嵌入式应用中,CPU是核心部件,每个嵌入式系统中都要重点考虑。而嵌入式CPU中,ARM处理器的市场占有率高达70%。ARM处理器在嵌入式领域中有着广泛的应用。iaSDP(Internet Appliance Simulation Development Platform)家电控制器仿真开发平台,是电子科技大学与广东软件园共同完成的广东省科技攻关项目“智能电器嵌入式软件开发平台”的二项重要技术成果之一,它是为以智能家电为代表的嵌入式软件提供一套基础的、高效的计算机仿真开发平台。已经实现的仿真MCU只有一个型号,并且是8位的。现在需要的是在这个平台上开发并嵌入一个基于构件的ARM软件仿真器。1.2软件仿真模型的提出纯软件的模拟器有许多种,如模拟一个芯片时序逻辑的模拟器、只模拟CPU指令的模拟器、模拟整个硬件开发板的模拟器、模拟一个PDA的模拟器等。存在一些纯软件的仿真器或模拟器,如Stanford大学的SimOS模拟器,它仿真的是MIPS系列CPU和相关外设,可以在其上运行SGI公司的Irix操作系统和软件,目前基本上停止了进一步的开发;PSIM是一个仿真PowerPC指令集的模拟器,目前只支持简单的命令行应用程序;Copilot是一个PDA模拟器,它是由Greg Hewgill出于个人喜好编写的,它仿真的是M68K CPU,通过它可以给PalmOS的软件开发者提供一个模拟开发环境。Bochs是一个仿真x86 CPU的开源项目,目前还支持AMD64 CPU,在它上面可以运行linux操作系统。其它一些商业的仿真软件如vmware和virtualPC可以仿真一个真实的x86计算机,而Virtutech Simics仿真器可以仿真多种CPU和硬件,功能强大,可用于硬件和系统软件的评测。1.3课题来源广东省科技厅应用研究项目1.4章节安排本论文以嵌入式系统开发为出发点,研究和实现软件仿真器原型,引入计算机仿真、构件化等关键技术,研究微处理器软件仿真模型和软件仿真器体系结构。第一章概述嵌入式系统开发方式,提出利用软件仿真器模拟目标硬件环境; 第二章分析典型嵌入式系统开发方式,提出纯软件仿真开发的设计需求,综述了相关的仿真技术、构件技术,探讨实现微处理器软件仿真器模型的可行性。第三章对一种结构集软件仿真器和一种指令集软件发仿真器进行分析研究,同时提出了一种软件仿真器模型。第四章分析了ARM处理器的体系结构和指令系统,用软件仿真器模型实现了一个ARM软件仿真器,阐述了其实现机理,并给出具体实现中的部分数据结构。第五章对实现的ARM软件仿真器进行验证,分析验证结果。第六章总结论文的工作,讨论了软件仿真器原型的特点和本课题的创新之处。术语解释:定义一 仿真器:是一种用以模拟程序在目标芯片上运行情况的工具。定义二 软件仿真器:这类仿真器是以纯软件的形式来仿真程序在目标芯片上的运行。在本文中特指微控制器的软件指令级模拟(simulator)。第二章 嵌入式系统软件仿真器的相关技术2.1嵌入式系统嵌入式系统是以应用为中心,以计算机技术、半导体技术、控制技术和通讯技术为基础,强调硬软件的协同性与整合性,软件与硬件可剪裁,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它是包括微处理器、定时器、序列发生器、控制器、存储器、传感器等一系列微电子芯片与器件,以及嵌入在ROM、RAM和FLASH存储器中的微型操作系统、控制与应用软件来实现各种自动化处理任务的电子设备或装置。2.2开发方式比较嵌入式系统的开发就是软硬件协同开发的过程,可分为4个阶段:功能规格描述与验证、软件/硬件分解、软件/硬件设计以及集成测试。传统的开发方式是:在系统软件/硬件功能分解后,开发人员分别独立进行软件与硬件的设计开发,软件完成编码后必须等待硬件原型制造出来才能在上面调试,进行整个系统的集成与测试。由于软件与硬件设计是相互独立完成的,嵌入式系统行为模型的合理性、软件/硬件间接口的有效性等问题在集成测试阶段才能得以验证,早期设计阶段的问题这时才可能发现,严重的情况下还要重新调整软件/硬件功能分配,重复整个开发流程,浪费极大的人力物力。利用仿真技术构造嵌入式开发平台是新的发展趋势,仿真开发可以给应用软件提供一个虚拟的运行环境。下面将嵌入式系统传统开发方式和仿真开发方式作一个比较:图2-1 传统嵌入式系统开发流程图系统集成与测试发现问题软件/硬件功能分解软件/硬件独立开发软件设计/编码硬件开发制造调试图2-2 嵌入式系统仿真开发流程图软件/硬件功能分解软件/硬件独立开发硬件开发软件开发虚拟调试、集成与测试发现问题系统集成与测试发现问题从图中可看出,仿真开发可以先一步发现问题,软件的调试测试也不需要等待硬件原型的制造完成,在真实系统集成前就对设计思想进行验证,使设计中的错误在硬件实现前消除,两种方式在开发效率上的优劣显而易见。2.3软件仿真技术目前很多嵌入式开发平台提供在线仿真方式,采用这种开发方式在应用开发过程中仍需与硬件打交道,软/硬件间敏感的交互影响会产生大量的麻烦和进度的延误,很多不确定因素会引起错误。而纯软件的仿真开发方式可进一步改善开发环境,避免硬件干扰,集中精力开发软件。它是用计算机软件模拟实际硬件电路的运行,构建应用软件运行所需的虚拟硬件环境,提供嵌入式软件开发和调试的真正“软”平台。现在一些硬件模型已经相当精确,软件仿真可以真实地反映实际电路的行为。引入软件仿真开发相当于引入一种新的开发模式,为程序员提供了一个更便捷高效低成本的开发平台,在仿真平台开出的程序,具有较高的可移植性,一些成熟的通用程序可以作为专家库函数产品推向社会。2.4构件技术嵌入式系统主要特点之一是多样性。设备生产厂商在芯片选择、功能定义、显示设备特性、耗电限制方面会有许多不同的要求,同时嵌入式系统应用广泛,嵌入式硬件平台必须满足应用实际要求,可灵活定制。仿真目标硬件平台的仿真运行环境要覆盖不断变化的嵌入式硬件系统,需要选择具有良好可扩展性、开放性的技术方案,以较小的代价应对未来不断变化的需求。因此,仿真运行环境的研究和实现必须借助于软件复用技术,同时可以充分利用已有的开发成果,消除在设计、编码、测试等方面的重复劳动,提高软件开发的效率;通过复用高质量的已有的开发成果,也可避免重新开发可能引入的错误,以提高软件质量。当前有两大软件复用方式:面前对象和构件方式,两者区别在于:l 构件是设计的概念,与具体编程语言无关,不象OO中的对象属于编程中的概念,要依赖于具体的编程语言。l 在对构件操作时不允许直接操作构件中的数据,数据真正被封装了。而对象的操作通过公共接口部分,这样数据是可能被访问操作的。l 从构件和对象的生成方式上,OO中的对象生成属于实例化的过程,比较单一,而生成构件的方式较多。l 在纯OO设计中,对象(类)、封装和继承三者缺一不可,但对构件可以没有继承性,只要实现封装即可。因此,构件不是OO中的对象,而是与基于对象中的对象类似。l OO中的对象对软件重用是通过继承实现的,构件对软件重用不仅可以通过继承还可以通过组装时的引用来实现。比较发现,基于构件的软件开发模式更满足仿真运行环境的设计要求,多年来构件技术的发展也提供了必要的技术支持。构件是可重用的,对外提供统一接口,既包括接口信息,还包括自身的功能实现体;软件开发者或用户选择一些这样的构件,通过一些适当的方式组合起来构成一个仿真硬件平台12,14,使它们在一个时间或空间相一致的环境中实现交互作用,协调运行,完成特定的仿真任务。构件的组合运行涉及到集成方式和体系结构的研究,本章后面对此有专门阐述。2.4.1构件概述软件构件技术是近几年来迅速发展并受到高度重视的一门技术。所谓构件(component)是指一组封装的、规范的、可重用的软件模块,它具有特定的功能,支持灵活的即插即用,可以方便地插入到网络、语言、应用、工具、操作系统中工作,是组织系统的基本单位。构件是指应用系统中可以明确辨识的构成成分,而可复用构件是指具有相对独立的功能和可复用价值的构件。从功能角度可将软件构件分为系统构件System、支撑构件Support和领域构件Demain。系统构件为在整个构件集成环境和运行环境中都使用的构件,支撑构件为在构件集成环境与构件库管理系统中使用的构件,领域构件为专用领域开发的构件。构件是一个动态的概念,运行时要占用内存空间。构件有一个生命周期:构件的创建,构件的运行和构件的消亡。其中激活构件是通过事件来触发的,即构件是通过事件来驱动的,事件是指消息、过程调用和指令等。构件的封装性有两层含义:一层指数据和操作的封装;另一层是指没有操作下的数据属性的封装,这一层的封装可以认为是数据和操作封装的一种特例,即操作为空的特殊封装。象Ada的Package、Smalltalk-80的object、C+的class和数据类型都可属于构件范畴。但是,操作集合、过程、函数即使可以重用也不能成为一个构件10。由于构件的标准化特点,组装标准的构件来形成新软件很容易;同时依据标准开发的构件也才可能大量被其它软件使用。基于构件的软件开发技术也正是强调:(1)构件的使用,开发新软件尽量通过重用已有的构件来实现;(2)构件的生产,在新软件的开发过程如果必须要添加新代码,尽量把这部分代码按照标准做成构件的形式,方便以后重用。构件技术的主要研究内容包括构件获取、构件模型、构件描述语言(CDL)、构件分类与检索、构件复合组装、标准化。其中构件模型和构件描述语言是构件制作、检索和组装的基础。由于构件的种类繁多,形态各异,因此很难建立一个能够描述所有类型构件而又支持制作和组装的构件模型。一般来说特定的构件模型只能用于描述特定类型的构件。2.4.2构件模型构件模型是一种部件通用体系结构,旨在建立一套软部件形态标准与接口标准,而且可以用不同的语言来编写,同时为用户提供各种不同的函数功能。设计初期建立参考模型构件,还需要花一定的时间构造参考模型库,但一旦模型库建好以后,用户就可以根据这些参考模型库来定制自己的构件,使用起来特别方便。目前国际上较为流行的构件模型主要有:3C模型、CORBA模型、COM/DCOM模型、EJB模型等。3C模型是一个指导性的构件模型,认为对一个构件的描述应该包括概念(concept)、内容(content)和语境(context)三个不同方面的内容。从构件组装的角度可以将构件分为源代码级构件和二进制代码级构件。CORBA模型则是通过属性、功能接口和依赖关系三个部分来描述一个分布式二进制代码级构件,COM/DCOM模型和EJB模型与CORBA模型类似,侧重于实现分布式二进制代码级构件的复用。真正意义上的基于构件的软件开发模式是在源码件或者比它更高层次的设计件、分析件的基础上进行的,而就目前的研究情况来看,支持源码级组装的构件模型并不多。2.4.3构件设计构件在概念设计阶段主要是定义构件接口和描述构件功能。构件不仅要提供外部物理实现接口,还要提供一个外部逻辑接口,外部逻辑接口是给用户提供一个非形式化的该构件的功能描述,这样更能方便用户了解和使用构件。深入、明确的刻划构件功能有利于构件的重用,而构件功能的描述,就是通过构件的外部逻辑接口提供给用户的。构件的逻辑设计须在构件设计规范下进行,利用规范所提供的构件定义语言和构件操作语言来进行逻辑设计。构件的逻辑设计阶段和物理设计阶段是分开的,这样可以使构件有不同的语言实现版本。随着构件规范的标准化,今后构件的设计开发将由构件制造商来完成,这样不但减少了用户开发系统的周期,同时还会提高系统的质量和可靠性。可以这样设计一个可复用构件:在设计一个构件A时,从提高复用性的角度出发需要将其内部某些功能相对独立的部分抽象出来,作为另外一些构件。假设某一功能独立部分抽象为构件B,则A中原来B所在的部分将被B的部分功能描述(注意不是B本身)所替代,这一部分就是A的协作构件。之所以说是B的部分功能描述,是因为这些功能描述可能只包括B中A要用到的那些功能,而不是B的全部功能。构件设计应遵循以下原则:l 构件应设计有很好的与语义有关的界面,界面构件要有标准。l 构件将代表一个抽象,有很高的内聚力,并提供一些所需的特定操作、属性、事件和方法接口。l 提高构件的复用程度,区分领域的可变与不可变部。l 构件系统要向下兼容。l 构件粒度大小、复杂度适中。l 易于原型演化。2.4.4基于构件技术开发的现状目前已有许多功能和性能都很好的硬件仿真环境存在,象MatLab、SIMULINK等,它们也使用了构件开发的概念11,但它们有两个不足:(1)抽象层次低。它们主要是为了验证硬件电路的设计,侧重于在电路级、寄存器级层次对硬件环境的内部工作的物理机制进行仿真。而通常硬件仿真环境目的是为软件开发服务,只要验证软件对硬件的控制是否正确就可以了,所以只需要从软件所控制的对象的外部逻辑级别上仿真一个硬件环境就足够了,也即是在器件级上进行功能仿真,如IC、外设级别;(2)没有考虑与开发工具之间集成的问题。基于构件的软件开发中比较流行的技术标准CORBA和COM是面向通用领域的,它们在系统层次上解决了软件的开放性和扩展性的问题,在解决专用领域中的问题时能力不足,但是它们提供了实现适合专用领域的构件标准的技术基础。2.5事件驱动仿真算法在软件仿真中人们通常采用基于事件驱动的仿真技术,可分为连续事件仿真和离散事件仿真,在一般情况下人们采用的是实现离散事件仿真的基本功能。离散事件仿真有两种仿真类型:单个事件仿真和多重事件仿真,仿真算法采用高效的事件推进法。仿真过程可概括为:(1)扫描存放当前等待的仿真事件列表,将最先发生的事件推进到活动对象列表;(2)扫描活动对象列表,按模型流程图进行推进;(3)推进仿真钟,处理相应的性能指标;(4)显示仿真结果。下图为其流程图,其中生成起始事件序列有三种方法可选择:平均分布、随机分布和按统计样本生成29。图2-5 基于事件驱动的仿真过程图扫描事件列表推进仿真钟处理性能指标可视化仿真显示生成分析报告生成事件列表仿真初始化事件驱动算法是一个同步仿真算法,对并发事件的处理是由一个中央控制时间机构来管理,把时间划分为一个个细小时隙t,且认为在一个t时隙之内发生的事件都是并行事件,只有在当前仿真时隙内的所有并行事件处理完毕,仿真时间才前进一个时隙,通过一个全局半有序的事件列表中存储事件,通常用首尾相连的循环堆栈来完成算法此部分的实现。其中t即为仿真周期,一般较小4。仿真过程中采用两个列表:一个是事件时间列表,它临时记录事件和事件发生的时间,在这里不断地对事件按它发生的时间从小到大的顺序进行排序,以便知道当前哪个事件最先发生;一个是活动对象列表,它记录当前的活动对象是谁,仿真算法是基于事件驱动的仿真钟推进算法,先将从用户界面输入的开始事件进行按时间从小到大的顺序进行排序,然后将开始事件直接推进活动对象列表,并且将仿真钟推进到最先发生事件的时间,再判断活动对象列表中的下属的对象为功能、事件、连线和规则。如果是连线,判断连线的下属对象是功能、事件还是规则。是事件,直接将事件推进到活动对象列表中。以图表文字的形式输出是规则,判断规则的类型并进行相应的处理;是功能,则计算相应的时间、成本、队列长度、占用率等技术指标,再将功能的执行时间=仿真钟的当前时间+功能的执行时间+等待时间,并且将功能推进到事件列表中,再重新对事件时间列表进行排序,然后不断地将事件时间列表中的最先发生的事件推进到活动对象列表中。如果是功能,将功能的下属对象推进到活动对象列表中。如果是规则,依据规则的类型进行相应的处理,并将规则推进到活动对象列表中。依此循环,直到仿真结束, 对仿真的结果进行分类和计算,统计相应的空闲时间、忙时间、成本、净增加价值和每个功能的成本、等待时间、处理时间以及队列长度、各个功能所增加的价值等一系列数据。通过以上活动,对用户建立的流程模型进行动态仿真,计算性能等指标,为分析评价和辅助决策提供信息。2.6逻辑仿真算法逻辑仿真的基本过程是要反映和模拟信号进入逻辑网络的输入端,在逻辑网络内部变化和传播的全过程。在仿真过程中,元件状态的每一次变化,都是一次求值的过程。由于网络的复杂和信号流的并行性,如何经济有效的安排元件的求值顺序是逻辑模拟算法中的核心问题。典型的是编排级数法和事件驱动法。编排级数法是一种较早的算法。算法思想:首先针对各个元件编制各自的处理子程序。逻辑仿真主程序则根据网络中各个元件的位置,依一定的顺序就每个元件调用一次与之相应的处理程序,各个元件进行顺序求值。为安排各个元件的求值顺序,对每个元件设置一个级数,入口元件的级数为0,以后各个元件的级数等于其所有前级元件的最大值加上1。在逻辑仿真主程序中,按照各个元件的级数调用相应的处理程序。事件驱动法没有固定的元件求值顺序,而是建立起动态的事件队列。算法思想:在仿真过程中,根据信号演变传播过程中的实际情况,只选择输入信号有变化的元件或输出信号可能有变化的元件进行处理。典型的事件驱动法有下一事件法和时轮法。2.7本章小结本章阐述了嵌入式软件开发的传统技术和基于构件的软件平台开发技术。接着简述了构件技术在软件开发平台中的应用。最后介绍了仿真开发中的两种算法思想。第三章 软件仿真器模型研究仿真器是一种用以模拟程序在目标芯片上运行情况的工具。它执行用户输入的源程序,芯片的设计者通过比较输出的结果和预期的结果可以得到目标芯片软硬件设计的反馈信息。随着现代嵌入式系统的迅速发展,仿真器以其在较低的开发成本和较少的开发时间等方面的优势,在芯片的开发过程中越来越受到重视。现在的仿真器主要可以分为两大类,一类是硬件仿真器(emulator),对这种仿真器,程序是在目标芯片上运行的,软件只是提供一个界面,以供用户了解程序运行的情况。另一类是软件仿真器(simulator),这类仿真器是以纯软件的形式来仿真程序在目标芯片上的运行。它因为不需要目标芯片及其任何配套硬件的支持,所以既可以降低成本,又可借助高级语言强大的表达力,在短时间内就可用纯软件实现与目标芯片相同的功能。由于这些优点,它无论是对芯片的开发者还是使用者,都是一个必不可少的工具。软件仿真器又可再细分为结构仿真器和指令集仿真器。前者是对目标芯片的完全描述,它不但仿真了芯片的指令集和寄存器、存储器和中断处理机制等硬件装置,还仿真了芯片的流水级,因而可以对芯片的各项性能给出更详细的描述,当然它的开发也需要较长的时间。指令集仿真器只是对指令运行的结果加以仿真,这样虽然减少了一些功能,但可以在更短的时间内完成它。当前的指令集仿真器主要有两种,一种是解释型指令集仿真器,它将应用程序存入仿真的存储器中,在运行时逐条取出指令,识别它,然后再仿真运行,将结果存入仿真的寄存器或者存储器中。它的主体通常是一个Switch语句,用大量的case语句来对应各种类型不同的指令。另一种是编译型指令集仿真器,它先将应用程序反编译为高级语言文件(通常是C语言),然后再用GCC优化为宿主机的汇编语言,最后执行。两类指令集仿真器各有优缺点,解释型指令集仿真器仿真速度比较慢,但它可以提供对应用程序的执行很方便的控制;而编译型指令集仿真器由于对源程序进行了反编译后又进行了优化,己经丢失了原来的用户程序与高级语言的对应关系,因而只能将程序一次执行完毕,不能对它的执行提供如解释型指令集仿真器那样详细的控制。但它由于在运行时不需要逐条的解释指令,因而可以有很高的仿真速度。现在的对仿真器的研究工作大多集中在如何提高仿真器的仿真效率,如何用机器描述语言来使仿真器具有可重定目标性等等。本章给出一个结构仿真器的分析和一个指令集仿真器的分析。3.1结构仿真器分析结构仿真器是仿真芯片真实的物理结构的仿真器,它不仅仿真了芯片的寄存器和存储器,而且还仿真了芯片的cache结构、跳转指令预测和乱序执行等。因而它不仅能给出指令执行的效果,而且还能够给出指令在流水级中运行的过程,对于芯片的开发有非常大的借鉴意义。SimpleScalar工具集是一套用以分析程序性能、建立芯片的微结构模型和对软硬件协同设计进行验证的工具。它在研究和教学中被广泛地使用。2000年,世界顶级的计算机会议的论文中,有超过三分之一的论文使用了该工具来评估其设计方案。这套工具由编译器、汇编器、链接器和仿真器组成。它既能够对用户代码进行指令级上的仿真,又能够进行内部流水级上的仿真。SimpleScalar仿真器能够对用户的程序进行7种不同层次上的仿真。如表3-1:仿真器描述sim-fast简单的指令集仿真器sim-safe速度优化的指令集仿真器sim-profile带报告信息的指令集仿真器sim-cache多级存储器的指令集仿真器sim-cheetah带cache的指令集仿真器sim-bpred带跳转预测的指令集仿真器sim-outorder仿真芯片微结构的结构仿真器表3-1 SimpleScalar 所包含的仿真器sim-fast是最快,但也是效果最粗略的一种仿真器。它只是对指令的结果进行仿真,不计时,不仿真cache,也不做指令检测。sim-safe也是只对指令结果进行仿真,它与sim-fast的不同之处是它对指令是否对齐以及存贮区域是否允许访问进行检测。能够对cache进行仿真的指令集仿真器是sim-cache和sim-cheetah。Sim-profile仿真器是带有报告信息的仿真器,它能产生详细的关于指令类型、指令地址、程序的符号表、存储器的读取、跳转和数据段符号表的报告,给程序的调试提供很大的便利。Sim-bpred是带跳转预测的指令集仿真器,能够对branch指令跳转的方向作出预测。最复杂的同时也是最详细的仿真器是sim-outorder仿真器。3.1.1 SimpleScalar模拟器软件架构图3-1为SimpleScalar模拟器的软件架构图,模拟器采用分层模块化的组成结构。 SimpleScalar通过采用指令驱动技术(即由目标指令仿真器对每一条指令进行解释,通过解释的结果驱动性能模拟器)将功能模拟和性能模拟结合起来协同工作,加快了处理器误预测状态的恢复。对于syscall系统调用/指令,SimpleScalar将其转换成对操作系统的系统调用,并将结果返回给相应指令。SimpleScalar提供了从简单的功能模拟器sim-safe到复杂的sim-outorder性能模拟器.simulator core模块定义并实现了各个模拟器的行为方式,其余各个模块由各个模拟器共享,各个模拟器可根据自己的需要调用各个模块。这意味着如果要设计自己的模拟器,主要工作就是修改simulator core模块。SimpleScalar提供的是一个建模框架,具有一定灵活性。每个模块具体由*.和*.文件构成,其中*.文件定义了模块所需的数据结构和可共调用的函数声明,*.文件包含函数功能的实现。其模块一类是计算机系统的组成模块;一类是辅助模块。以下是模拟器主程序部分主要源代码:main(int argc, char argv,char envp)sim-chech-options(sim-odb,argc,argv);/检验命令行参数,并对每个模块初始化,sim-*c定义mem-init();/程序加载前memory初始化,mem.c定义ld-load-prog();/程序加载,loader.c定义regs-init();/寄存器初始化,regs.c定义mem-init1();/程序加载后memeory初始化,mem.c定义sim-init();/模拟器初始化,sim-*.c定义sim-main();/模拟器执行入口函数,sim-*.c定义Program binaryTarget ISAI/O interfaceTarget ISA emulatorI/O emulaterSimulator coreBpredResourceCacheLoaderRregsMemoryDlitelStatsHost interfaceHost platform图3-1为SimpleScalar模拟器的软件架构图3.1.2 out-of-order模拟器内核out-of-order模拟器是提供了足够微体系结构细节的性能模拟器,是支持指令动态调度乱序执行的超标量模拟器,在2.0版的SimpleScalar中只为其提供了PISA一种指令集2(4 0版还支持ARM、X86、Alpha指令集)。out-of-order模拟器主函数sim-main()的程序结构表示如下:void sim-mian(void)for(;)run-commit();/提交ruu-writeback();/写回lsq-refresh();/LSQ队列刷新ruu-issue();/执行ruu-dispatch();/发射ruu-fetch();/取指sim-cycle+;/模拟器周期,用于统计程序执行周期数for循环执行一次代表流水线执行一个机器周期,每个run-*()函数代表流水线的一段(stage),采取反向执行顺序是为正确实现流水线各段之间的互锁同步.图3-2为out-of-order模拟器流水线示意图。分支预测器Float ALUIFQRUULSQRQEQInt ALUInt mult/divInt mult/div提交部件寄存器堆寄存器堆数据cacheRead portFetch_pc+1指令写回部件tailhead|-fetch-|-dispatch-|-issue&execute-|-writebach-|-commit-|图3-2 out-of-order模拟器流水线示意图3.1.3模拟器主要数据结构RUU(Register Update Unit):此结构将传统的保留站和排序缓冲站合并,实现了指令的乱序执行、按序提交,用于支持处理器精确中断和误预测的状态恢复。RUU将这两个部件合并,可以减少硬件实现的费用。RUU被组织为循环队列,在指令发射阶段,按取指先后顺序为每条指令分配RUU单元,指令在RUU中连续存放并且排列顺序与取指顺序一致,这使执行完成的指令能够按序提交3。LSQ(Load/Store Queue):用于处理Load/Store指令,其结构与RUU一致,一条Load/Store指令将被分成两个操作,地址计算和存取操作,地址计算操作作为加法运算放入RUU中,而存取操作放入LSQ中,RUU和LSQ需要同步。IFQ(Instruction Fetch Queue):用于存放取指(Fetch)段取出的指令队列。RQ(Ready Queue):如果指令执行所需所有操作数已准备好,则将指令放入此队列准备执行。EQ(Event Queue):该队列记录已发射(Issue)指令何时执行完毕,writeback段以此确定何时将指令执行结果写回。3.1.4 out-of-order模拟器流水线分析l Fetch段此段的操作由ruu-fetch()函数实现,这个段的任务是从指令cache取指令并放入IFQ中,对于分支指令,还要访问分支预测器以确定下条指令内存地址。具体过程如下:while(IFQ未满已取指令数小于取指宽度)1)根据Fetch-pc从指令cache取出一条指令;2)如指令cache发生缺失,则取指阶段结束,否则将取出指令放入IFQ中;3)确定下条指令的地址(对分支指令,访问分支预测器);l Dispatch段由函数ruu-dispatch()实现,这个阶段的任务是指令解码仿真,寄存器重命名,ruu/lsq分配,将所有源操作数已准备好的指令放入RQ中。由于采用了指令驱动技术,模拟器可以判断指令是否处于误预测状态,对处于误预测状态的指令,仿真时其访存和写寄存器操作会映射到预测buffer中,而不会访问真正的物理寄存器和存储器,其具体过程表示如下:while(ruu/lsq未满&IFQ不空&已分配指令数小于解码宽度)1) 从IFFQ中取出一条指令;2) 解码该指令并仿真(此时模拟器可能处在误预测状态);3) 为指令分配RUU单元,进行寄存器重命名(如果指令为Store/Load指令,则将指令分为计算地址操作和访存操作,分别分配ruu和LSQ单元);4) 如果该指令所需源操作数指令已准备好,指令放入RQ;5) 根据2)指令仿真结果判断模拟器是否进入误预测状态;l Issue&Execute阶段由ruu-issue()函数实现,为处在RQ队列中的指令分配执行所需资源并执行指令(具体过程略)l Writeback段由ruu-writeback()和lsq-refresh()函数实现。ruu-writeback()任务包括误预测状态的恢复和解决数据冒险(其执行过程略)。 lsq-refresh()函数的任务是将lsq中满足下列条件的Load指令放入RQ(过程略)。l Commit段由函数ruu-commit()实现,将执行完成的指令按序提交并升级处理器状态,具体过程略。)3.2指令集仿真器分析3.2.1 ARMulator介绍ARMulator 是一个在ARM公司推出的集成开发环境ADS(ARM Developer Suite)中提供的指令集模拟器。它与运行在通用计算机(通常是x86体系结构)上的调试器相连接,模拟ARM微处理器体系结构和指令集,提供了开发和调试 ARM 程序的软件仿真环境。ARMulator 不仅可以仿真 ARM 处理器的体系结构和指令集,还可以仿真存储器和处理器外围设备,例如中断控制器和定时器等,这样就模拟了一个进行嵌入式开发的最小子系统,另外使用者还可以扩展添加自己的外设。ARMulator 同时支持全部的标准C库函数,这样所有的C程序都可以在仿真器上运行。ARMulator通过Semihosting方式来实现程序中输入/输出功能。Semihosting是指在ARM程序开发调试的过程中,目标系统还不具备输入/输出的功能,通过调试代理向调试器请求 I/O。ARMulator 就是这里所说的调试代理之一,其他还有Angel、Multi-ICE也通过类似的方式来实现I/O功能。ARMulator在Windows平台上实现为动态链接库文件(.dll),在Linux或者Solaris系统上实现为共享库文件(.so)。前者的使用一般是通过ARM公司提供的图形界面调试器 AXD 中,选择目标系统为ARMulate.dll,这样就设置了ARMulator作为调试代理。用户在进行调试开发时,对于底层使用的调试代理是透明的。 3.2.2 ARMulator组成 ARMulator 本身是由一系列的模块(module)组成的,其中最主要的模块包括:(1) ARM 处理器核心模块,用来仿真处理器的体系结构。(2) 处理器使用的存储器模块,用来仿真存储系统。缺省的内存模型是 flatmem ,内存的大小不限制,理论上 4G 的地址空间都可以使用。同时,ARMulator 也包含了几种外设模块,用来仿真如下的外设模型:(1)interrupt controller(中断控制器)用于中断控制,包含状态寄存器、使能寄存器、状态位清除寄存器等。寄存器基址:Base=0x0a000000(2)Timer(定时器) ARMulator 提供了两个定时器。包含控制寄存器、计数值寄存器、中断清除寄存器等。定时器支持 free-running 和 periodic 两种工作方式,前者计数器从0xFFFF递减,到“0”后计数器溢出发生中断。后者计数器从计数值寄存器中读取计数值,然后递减至“0”后溢出发生中断。寄存器基址:Base=0x0a800000。(3)Watchdog(看门狗)看门狗是为了防止用户程序出错导致系统死锁而采用的一种保护手段。一旦到了预定时间没有设置看门狗,看门狗就会停止ARMulator的运行,返回调试器中。看门狗使用2个定时器工作,第一个定时器在复位时启动,或者通过程序写入KeyValue 寄存器预先设定好的值来启动,当过了一定时钟周期(WatchPeriod)后,第一个定时器产生 IRQ 中断,并启动第二个定时器;如果在规定时间(IRQPeriod)内程序没有写KeyValue寄存器,则看门狗将停止 ARMulator,返回调试器中。寄存器基址:Base=0xb0000000 KeyValue=0x12345678 WatchPeriod=0x80000 IRQPeriod=3000 IntNumber=16。(4)Stack tracker(栈跟踪器) 栈跟踪器在每条指令执行后,检查栈指针(r13)寄存器的值。它记录下栈顶的最小值,从而可以计算出所用堆栈的最大长度。栈底地址:StackBase=0x80000000 栈空间限制:StackLimit=0x70000000(5)Tube(显示管) Tube 实际上是一个寄存器,它用来显示输出。一旦写入这个寄存器某个可以显示的字符,则调试器将会把它显示在控制台 Console 下。这样用来显示对某个指定地址的写操作记录。寄存器基址:Base=0x0d800020,使用者也可以根据一定的接口规范编写自己的外设模块,或者通过修改已有模块的方式来适合自己的需求。比如定制自己的存储系统等。3.2.3 ARMulator使用从调试器中可以配置ARMulator的一些属性,在调试器启动的时候,会将当前配置的部分信息输出显示。ADS 提供了6个*.ami配置文件来定义当前ARMulator的工作行为。当 ARMulator 被调试器启动时,就会搜索环境变量 armconf 中的路径,读取所有的*.ami 配置文件来对 ARMulator 进行设置。ARMulator 还提供了跟踪(Tracer)功能,用来记录程序中指令和内存被访问的情况,也可以记录下各种事件的发生,例如 ARM 处理器事件、MMU 和 cache 事件等。另外,使用 ARMulator 的 profiling 记录,可以统计特定函数在执行过程中被调用的次数,包括子函数的调用在总的执行时间中所占的比例。使用 ARMulator 只要在调试器中设置了 target 就可以了,通过图形用户界面的调试器AXD ,可以查看 ARM 寄存器(包括通用寄存器和程序状态寄存器等),也可以查看任意内存单元的内容,还可以进行异常的处理,例如中断和程序中止等。3.3软件仿真器模型GSSM3.3.1典型微控制器结构分析目前有代表性的微控制器包括68HC08,80C51,ARM,PowerPC,68k等系列,希望科学有据地提出一种仿真模型,需对其体系结构进行大量深入地研究:带ARM核的芯片包含有CPU和存储器;同时将定时器、USART、A/D、D/A等归类为设备模块;将时钟、中断控制器、DMA、电源管理等归为系统集成模块;将端口、引脚等归为通信模块。Motorola68K系列芯片也有CPU和存储器;将定时器等归类为设备模块;将看门狗、时钟发生器、复位控制器、JTAG测试口、中断系统等归为系统集成模块;将双口RAM、串行DMA通道、并行I/O 寄存器等归为通信模块。分析微控制器结构可发现各系列的组成基本是相同的,特殊之处主要体现在功能单元内部部件的增减和配置,很多微控制器没有明显的总线,但内部的数据传送可视为总线行为。3.3.2 GSSM体系结构从前面的分析中抽象出最基本的组成部分,就形成了GSSM 模型。 这种模型体现了微控制器的基本结构,包含5个功能单元和连接各单元的总线,同时出于仿真运行控制考虑,专门加入控制核和控制管道等元素,各功能单元又可由更小的部件组成。在具体实现时,替换增减某单元内部的组成部件,甚至更改控制核接收的命令集,就可得到一个新的仿真微控制器,这种做法在开发同系列仿真产品时可以极大地降低工作量。功能单元图3-1 微控制器软件仿真模型GSSM结构图控制核设备模块存储模块中央处理器通信模块控制管道总线系统集成模块 GSSM的 7个组成部分共同协作完成微控制器构件的仿真功能:控制核Control Core:控制核是对外窗口,接收处理所有外部命令,接受环境的时序控制,使与其他运行实体步调一致,并帮助完成微控制器与其他仿真硬件的信号传输;同时也是运行枢纽,完成诸如创建、运行、停止和销毁等动作,负责使内部各模块协调运行,消除随机出现的不和谐因子。控制管道Control Pipe和总线Bus:这两个数据通道都是全双工通道,CPU等基本功能部件同时挂接在上面,既是数据接收方也是信息发送方。一旦有数据传送请求,通道查看目的地,将数据送往对方。由发送方和接收方负责请求合理性、数据有效性,通道只是数据通路,不实现这些控制逻辑。控制管道上流动控制命令、反馈数据、物理信号和异常信息等,其数据格式由收发双方约定;总线Bus仿真微控制器的内部物理总线。中央处理器CPU:所有CPU都依照流水线处理各执行环节:取指、译码、形成地址、取数据及执行、回写,每个环节设计为一个独立的模块,以便于移植和重用。CPU仿真部件逐条解释执行机器代码,处理发生的复位和中断;在调试模式下要根据调试命令控制应用运行。存储模块Memory Module:存储模块的仿真参数主要包括空间大小、地址分配和读写控制等。有的存储器组成很简单,没有复杂的控制逻辑,只具备简单读写功能。系统集成模块System Integration Module:系统集成模块是属于系统级的控制器,与CPU一样也是微控制器必不可少的部分,是片上集成的时钟发生器、中断控制、电源管理、看门狗等单元的总和,将这些部件作为标准构件,根据所仿真微控制器的组成进行配置,不同的配置即为不同的仿真微控制器。设备模块Device Module:设备模块包括定时器、DMA、USB等设备,与系统集成模块一样需要配置。通信模块Communication Module:通信模块是微控制器与片外其他仿真硬件设备间传送物理信号的通道。在本模型中这

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论