FPGA最大的优点在于其灵活性,可激发设计人员创造出无数不同的设计。然而,设计调试通常最后才加以考虑——如果还加以考虑的话,因此调试器通常要适应系统的要求。
好消息是一家在嵌入式领域耕耘近30年的公司推出了一款调试器,它对于解决所有您能想象得到的问题,甚至包括那些您都不愿意去听到的问题具有丰富的经验。在本文中,我们将通过一些例子说明Lauterbach公司的TRACE32调试器所具有的功能,这些功能将节省您的时间,甚至保全您的项目。
面向灵活平台的灵活调试
谈到灵活设计,我们想到了客户推出的一套十分有趣的系统。该系统在Virtex-5 LX50T器件上集成两个Xilinx MicroBlaze处理器核和一个内部block RAM存储器块。这种设计的特殊之处在于每个MicroBlaze处理器只有一个与block RAM模块相连的I-side接口以实现指令提取。Block RAM的另一个存储端口被连接到PCI Express接口上,以便在运行时远程改变应用代码和启动处理器。在此面临的挑战在于如何在调试器无法读写的存储器区域进行调试,因为在存储器区域MicroBlaze处理器本身无法进行加载/存储操作。
我们利用TRACE32的内部“虚拟存储器”来解决这个问题,这个调试器内部的仿真存储器具有无限的地址空间(64位),可以按照需要分配存储容量。我们将目标程序加载到这个虚拟存储器中,并且通过配置调试器的内部地址转换机制将无法读取的目标存储器映射到虚拟存储器上。这使得甚至可在汇编级上进行程序诊断。
但是这里面临着另外一个挑战:为了实现程序的按步执行,特别是高级语言行以及条件分支,人们通常使用软件断点。由于无法通过MicroBlaze处理器访问Block RAM,显然无法做到这一点。我们的解决方案是提供“map.break”指令,强制调试器在给定的地址范围内使用硬件断点。映射指令还可使您指定存储器的数据宽度,更改大小头特性,或者完全禁止调试器访问某些具有关键外设寄存器的地址范围。
小而有用的功能
Lauterbach在JTAG调试器和仿真器方面的经验充分体现在TRACE32调试器的功能以及其他诸多微小和意想不到的细节中。考虑到Lauterbach完全利用自身工具开发所有软件,这一点并不奇怪。而日常出现的问题通常会激发人们设计出最有用的功能。
您是否曾经需要在调试阶段关掉烦人的计时器中断处理器,或者在无需重启的情况下改变条件分支?是否曾经需要修补循环以观察处理器核是否正确执行外部存储器给出的指令?内置的汇编器正可实现这些功能。
另一个调试中常见的情况是:是否经常在某个程序行走得太远而不得不重新开始?寄存器恢复功能可以取消最后的操作。
TRACE32通过不间断地每秒10次的存储器重读来显示存储器的内容,甚至在处理器停止的时候也不停止重读。为什么它要这么做呢?可能在一秒钟内,您的系统中不间断运行的MicroBlaze处理器就造成了数据破坏,所以您希望能够监测这一点。也可能在某些时候不稳定的存储器造成了屏幕闪烁。又或者是您的JTAG接口在20MHz时并不那么稳定。这些都是您期望知道的。另一方面,TRACE32确保它只会在需要的时候访问存储器。
谈及外设,我们还应该提到外设寄存器文件。这些文件指定了存储器映射的寄存器的位置、宽度,甚至按位编码,并且将它们分组成寄存器树。这样,可以很容易地访问外设寄存器以进行检查及修改:您点击一下即可关掉DMA控制器,而无需仔细阅读目标手册以找到正确位。调试器给出了标准外设的规格说明,但是您可以使用简单的文本编辑器修改这些文件以满足您的要求。对于Xilinx工具链,插件选项可以生成这些文件,并将其作为Xilinx构建过程的一部分。
灵活IDE
TRACE32提供了功能强大的图形用户界面(GUI),并且其命令行的使用非常高效:屏幕下方就有调试器命令行,并且几乎所有的GUI功能都可以通过命令行—从而通过脚本实现。这使得可实现所有常规任务的自动化,包括目标配置,窗口布局,以及将它们分配在多个虚拟屏幕中。最好的是,不像许多IDE一样,这些窗口没有docking特性,但也可以任意放置以及更改这些窗口的尺寸,甚至重叠。同时还可与不同的IDE联用,例如您可以从您的Eclipse环境中直接调用TRACE32.
连接多核目标
另一个有趣的功能是Lauterbach调试多核目标的直观方式。比如为每个核提供GUI,并且使它们共用一根调试电缆。这对于包含了PowerPC和MicroBlaze内核的异构系统或采用TRACE32所支持的50-plus处理器架构的其他系统而言同样有效(图1)。
TRACE32与Xilinx平台电缆所使用的同一JTAG连接器连接,并且适用于任何由Xilinx 嵌入式开发套件(EDK)创建的设计。对于PowerPC而言,也支持使用专用的调试连接器。
对于多核系统,内核的同步启动和关断是一个问题。要想在硬件中支持这一点,例如在多MicroBlaze处理器配置中,调试器应利用硬件功能实现周期精确同步,否则同步是在软件中完成。集成脚本语言了解多核情况,从而允许通过一个主脚本完成所有GUI控制,包括将调试器连接到相应的内核并进行复位,以及下载并启动应用程序。
实时程序流和数据跟踪
实时跟踪的主要功能是记录程序流,即处理器所执行的每一条指令以及数据的处理。对于MicroBlaze处理器,这是通过Xilinx Platform Studio中的XilinxMicroBlaze跟踪内核(XMTC)来实现的。XMTC集成了一个跟踪编码器,其中包含一个连接到MicroBlaze处理器跟踪端口(包含近200个未编码信号)的输入接口。
它还包含一个提供21信号编码跟踪的输出接口。
跟踪硬件提供了多达512MB的外部高速跟踪存储器,可用于替换稀有的片上存储资源存储跟踪信息。跟踪功能也可支持PowerPC架构。此外,还具有更多的高级功能,包括静态函数和任务运行时间分析、变量访问、代码覆盖率分析等(图2,图3A和3B)。
操作系统支持
在MicroBlaze处理器上,TRACE32为μClinux和Linux提供了一个所谓的内核敏感模块。对于PowerPC而言,可支持更多的操作系统,包括QNX,VxWorks以及Nucleus PLUS。这些扩展功能使得调试器可以知道目标中的内核相关数据结构。这使得可以利用进程指定断点和程序控制实现进程级调试。其他功能包括支持完整的MMU,诸如加载的内核模块或者挂载的文件系统等Linux系统资源的实时、非侵入式显示,任务运行时间的统计评估和图形显示,以及函数运行时间的任务相关评估。
总结
Lauterbach TRACE32为所有Xilinx器件系列上的PowerPC和MicroBlaze处理器提供了完整的调试解决方案。未来Xilinx相关增强功能将进一步增强调试电缆,使得XilinxChipScope分析仪可以使用调试电缆与调试器共同实现目标访问,并且通过调试器下载FPGA配置位流。