仿真的基本原理
仿真是一种被用在嵌入式系统开发领域的技术。它可以给系统开发者带来集成硬件和软件所需的可控制性和可视性,有效地模仿DSP处理器的电气特征和性能,同时让工程师更清晰地了解处理器的活动并加以控制。
仿真器包含了硬件和软件技术。仿真硬件方面由DSP芯片上的功能构成,它可以采集数据。该数据提供了有关系统活动状态和其它可视性的信息。硬件还需要从DSP设备上高速获取此类信息,并将数据格式化。仿真器软件则提供了更高级别的控制,以及一个和主机相连的接口 - 一般是一个调试器。调试器让开发工程师可以轻松地从编辑过程(编译、汇编并为某个应用建立链接)过渡到执行环境。它从编辑过程中输出数据,并将图象导入到目标系统中。接下来,工程师可以通过调试器和仿真器互动,来控制并执行应用,同时找到并解决问题。这些问题可能是硬件问题,也可能会是软件上的问题。仿真器被设计成一个完整的集成和测试环境。
仿真器系统组件
所有的仿真器系统都是由以下三个部分构成的:
片上调试装置
仿真控制器
运行在主机上的调试器应用程序
图7展示了这三部分的连接。其中主机和一个仿真控制器相连,仿真控制器也连接到目标系统。用户通过IDE中的调试器来控制目标应用。
从处理器、仿真器到主机平台的整个开发环境,都会使用DSP仿真技术。
在DSP设备本身,要实现更高的时钟率,就要求仿真逻辑必须是在芯片上,这样它才能够全速运行,并跟上处理器的速率。集成度更高的芯片,总线会被隐藏起来,让工程师无法通过管脚看到。这也使得仿真逻辑必须在芯片上,这样才能接入到系统总线。为此,DSP厂商都一直在积极地将高端仿真功能集成到它们的DSP产品上。
下一个组件是仿真器,它用来将目标板连接到主机平台上,并在主机和目标处理器之间传输数据。
第三个组件也是最后一个组件是调试器和仿真软件。该软件可以自动配置以匹配DSP设备,并作为用户接口,让片上系统(SoC)设备的调试变得尽可能简单。这些IDE还支持 “插入式”应用的开发,此类应用不仅能控制处理器,还能通过一个高速数据接口显示来自处理器的仿真数据。
调试器运行的主机可以是一台电脑,也可以是一个工作站。该主机可以通过各种方式来和仿真器相连,包括以太网、通用串行总线(USB)、Firewire (IEEE 1394)和并行接口等。
主机可以决定设备到主机之间的数据带宽。主机和仿真器之间的通信决定着数据传输协议的最大持续数据带宽。比如,在某些仿真应用下,仿真器清空接收数据缓冲器的速度必须和这些缓冲器被装满数据的速度一样快。第二,产生数据的主机和接收数据的客户端必须拥有足够的MIP和/或磁盘带宽,来准备、传输、处理和/或存储来自DSP的数据。此处必须注意的一点是,一个功能强大的电脑或者一个工作站会对整个仿真系统的性能产生影响。
仿真器的物理特征
大多数仿真控制器都位于主机外部。仿真器分为通信和仿真两个部分。通信部分负责和主机通信,而仿真部分则和目标连接,控制目标调试功能和设备调试端口。
仿真器/目标通信
仿真控制器通过连接线和目标相连。调试、跟踪、触发和实时传输可以通过同一根目标连接线来完成,有时也可以采用同样的设备管脚。当一根连接线无法满足目标系统的跟踪带宽时,就需要多根连接线。所有跟踪、实时数据传输和调试通信可以通过这个链路来完成。仿真器允许目标和仿真器之间可以至少分开2英尺,以方便DSP开发者能在各种环境下应用。
片上仿真
由于当前精密的DSP处理器的可视性日益下降,调试功能也被集成到了芯片上-即我们常说的片上调试。片上调试实际上硬件和软件的结合。位于DSP上的功能是硬件实现资源。这些资源包括终端用户代码可利用的功能,例如断点寄存器和其它专用硬件。要在芯片和调试器之间进行通信,DSP上必须有额外的管脚。这些管脚可以是JTAG接口管脚,也可以是一些专门用于控制或数据的额外管脚。
要进行片上调试,还要求主系统必须和调试部分以及数据抽取通信并对之加以控制。主软件运行调试器软件,并通过专用接口头信息与片上调试寄存器连接。主调试器以图画形式显示源代码、处理器资源、存储器位置和外围设备状态等。
片上调试的一些主要功能包括:
-中断或插入程序和/或数据存储地址上的调试模式
-中断或插入外围设备上的调试模式
-通过1个DSP微处理器指令进入调试模式
-读/写DSP内核寄存器
-读/写外围存储器映射的寄存器
-读/写程序或数据存储器
-执行1个或多个指令
-跟踪1个或多个指令
-读实时指令跟踪缓冲器
图8展示了一个高性能DSP上的仿真硬件。该逻辑位于DSP上,可以执行以下功能:
观测-采用总线事件探测器来观测系统中的事件。用户可以通过调试器界面编程选择需要观测的特定事件或情况。
保存-采用计数器和状态机来保存系统中发生的事件。
导向和控制-采用触发器来发送计数器和状态机获取的有用数据。
导出-采用导出功能从系统导出数据。例如,以跟踪逻辑来导出原始程序寄存器和数据跟踪信息。
加速-采用本地振荡器来提高以高时钟速率运行的设备的数据传输率。
导入-以导入逻辑来从主机导入数据,让开发者可以输入用来调试和集成系统的数据文件。
这个仿真系统里还包括一个主通信控制器(host communications controller)。它可以连接到控制整个过程的主调试器。调试器可以位于电脑上或者工作站中,也可以集成到一个集成度更高的开发环境中,或者独立运行。电脑或工作站中构建的代码通过一个通信链路导入到目标中。
仿真控制器(以及调试器)是一种带有两组不同功能特征的调试工具。其中的一组特征可以提供简单的运行控制,让DSP开发者能控制DSP处理器的运行。运行控制的例子有启动、暂停、步进和运行至断点。
另一组特征则用来捕捉和记录DSP处理器的活动,正如处理器总线所显示的那样。开发者可以通过一个触发系统来限定控制捕捉这一跟踪信息的条件。该跟踪系统将DSP处理器总线的活动记录在系统内部或外部的高速RAM中。
调试器是在主系统上执行的一个软件组件。它可以监控和控制整个仿真过程,有以下一些常见功能:
启动/运行(Go/Run)- 这个命令将启动目标CPU的执行。执行是从当前程序计数器的位置和寄存器数值开始的。
停止/暂停(Stop/Halt)- 这一命令用来通知仿真器停止目标CPU并暂停执行。
当执行这一命令时,目标CPU和寄存器的当前上下文会被保存,以便当处理器再次开始运行时,执行可以继续从原停止点处继续进行。
单步执行(Single-Step)- 这一命令是启动或运行指令的一个特殊形式,但在下一个指令处有一个断点组。它让用户可以连续步进。在每一步,用户都可以观察寄存器、执行堆栈和其它关于系统状态的重要信息。这可能是寻找软件或固件模块的问题时应用最为普遍的命令。
步过/步进(Step-Over/Step Through)- 这个命令和单步执行很相似,但有一个很大的不同。当步过一个子程序调用时,该命令会执行子程序但不会进入子程序。而当采用单步执行命令时,调试器会进入子程序并以一次一条指令的方式执行子程序。如果用户不需要看到子程序或库函数中的每条指令,这一命令可以让用户绕过。
运行至(Run To)- 这个命令可以在程序某个被认为有用的地方设置一个断点,然后运行直到达到该断点。它可以让用户不必多次单步执行便可达到同样的位置。
DSP仿真器可以提供DSP处理器、寄存器和应用软件的可视性,让软件工程师可以了解到应用执行中处理器内部发生的变化。软件工程师可以基于应用内部的硬件信号值和软件位置在应用中设置断点。在这些断点上,用户可以了解到处理器和数据的状态,并确定其应用是否仍在正常运行,还可以在仿真器上执行应用软件的基准化(时序分析)和绘制概图(CPU加载)。多处理器调试可以让用户同时在多个处理器上调试软件,并依照设置在某个处理器中的条件停止一个或多个处理器,让用户能够在有疑问时捕捉到整个系统的状态。DSP调试器中的这些功能可以极大地缩短软件开发周期中的调试时间。
仿真器是直接和DSP处理器连接的。电气信号被发送到仿真器,仿真器可以接入到处理器,而标准软件调试器则不能。工程师可以浏览并更改寄存器-这是标准软件调试器所没有的。硬件信号发送还可以带来更好的实时控制。仿真器还能实时记录处理器的活动,如果发生问题,开发者就可以有一个系统活动的历史记录来进行分析。
仿真器相比于标准软件调试器的另一个优势在于它可以调试系统的启动代码。标准软件调试器一般需要目标操作系统来接入系统和通信接口。在系统初始化过程中,这是不能实现的。而仿真器可以提供自己的通信接口(一般是JTAG),能接入到系统的任何部分,达到和CPU一样的可视性。
仿真器的另一个优势是可以调试已经损坏的系统。如果目标系统因为某个原因而被损坏,它的操作系统一般会停止运行。此时软件调试器根本排不上用场。而仿真器则不会受到系统损坏的影响。仿真器可以保留重要的跟踪信息和寄存器数值等DSP处理器状态信息,并对该数据进行分析,以确定导致系统损坏的原因。
基本仿真组件
当采用一个DSP调试器来在硬件平台上进行软件调试时,必须执行一些设置程序,以确保目标处理器能够和调试器兼容。仿真的设置包含了两个工具:一个是仿真器本身(例如TI XDS510或XDS560)-它控制到达目标和来自目标的信息流,另一个是调试器-它是这一信息的用户接口。在仿真设置之后是目标处理器。大多数DSP处理器中的仿真逻辑都采用联合测试行动组(JTAG)标准连接方法来从处理器内部获取调试信息。
硬件的调试是通过停止DSP内核来进行的,这样才可以使信息通过JTAG信息头被扫描进设备并从设备中扫描出来。该信息是通过符合IEEE 1149.1 JTAG规格的JTAG接口来串行传输的。必须注意的是,这个调试方法接近于实时调试,但它是插入式的,因为它需要停止内核来扫描信息。尽管和JTAG头之间的连接可能是一样的,但用于仿真的扫描链和用于边界扫描的扫描链是不同的。在处理器内部有多种可以扫描信息进出的串行扫描链。扫描链的选择以及每个扫描链所包含的信息由一个微处理器来控制。这个“扫描管理器”的任务是在信息被扫描进出各种处理器的过程中控制该信息,并将之引导在各个调试器窗口之间。
仿真器主机可以作为扫描管理器,因为它控制着扫描信息在目标和调试器窗口之间的传输。比如,操作系统可以是一台电脑,而JTAG连接则通过一张ISA卡(图7)来完成,其它配置也可以实现。当主CPU或一个独立的处理器控制JTAG扫描信息时,主机需要有关扫描链中包含的设备的信息。