摘要 介绍在8086和MCS51嵌入式系统的非干涉测试中,用FPGA硬件子系统进行CPU总线数据采集的结构设计,以及基于提高软件分析效率的考虑,实现数据过滤的两种方法。
关键词 白盒测试 非干涉测试 数据采集 FPGA
引言
软件产品的测试通常使用软件工程中提出的两种方法,即白盒和黑盒测试。白盒测试是已知成品的内部工作过程,通过测试证明每种内部操作是否符合设计规格要求,及所有内部成分是否已经通过检查。在白盒测试的硬件数据采集中,使用FPGA读取CPU引脚的信号,在不影响嵌入式系统运行的前提下实现数据采集逻辑,是一种非干涉的测试方法。这种“非干涉测试方法”的基本特征在于:主动采集被测试系统运行状态数据,并根据测试需求进行必要的分析,但不影响目标系统的运行。通过获取目标系统运行时全部或必要的状态信息,结合被测试目标软件的静态分析,就可以了解目标软件的实际运行情况\[1\]。
由于数据采集是在不影响CPU正常运行的情况下进行,直接来自于CPU总线,因而非干涉测试系统能够有效地对嵌入式计算机系统软硬件的可靠性进行有效测试和评估\[1\]。同时,由于过滤后传输的数据量小,且能反映程序运行的路径,结合上位机的实时监控功能,非干涉测试系统可以获得在系统异常情况下嵌入式CPU的指令运行情况,可以用于航天系统的关键部件在运行状态下的安全检测与故障恢复。
文中以8086和MCS51两种CPU为例,说明非干涉测试中FPGA数据采集过程。对于非干涉测试中数据过滤问题,提出了地址对照表和指令译码两种数据过滤方法。
1非干涉测试的硬件结构
非干涉测试的硬件由数据采集头、数据采集过滤FPGA、数据传输接口以及可选的SRAM组成,非干涉测试数据采集的硬件结构如图1所示。采集头与CPU的总线
* 基金项目: 武器装备预研基金51404020403HK0149。
连接,读取CPU地址总线、数据总线和部分控制总线的信号。为了采集嵌入式存储器和外设的信号,非干涉测试的硬件采用离散探头进行连接。数据传输根据采集数据量的大小和采集过滤方式的不同,采用PCI、PXI、DMA等多种不同传输方式,最大传输速度为5MB/s~80MB/s。FPGA片外的SRAM作为可选部件,用于地址对照表的数据过滤方式。
图18086非干涉测试数据采集结构图2非干涉测试的数据采集
非干涉测试硬件系统中,主要采集嵌入式CPU地址总线上的信号。上位机根据指令地址,对照白盒测试代码分析,就可以知道指令的运行情况。数据总线上指令的采集,用于分析指令长度和指令执行时间,而对数据的采集用于上位机分析内存特定地址的变量变化情况。控制总线中的中断请求是数据采集的主要内容,其他信号用于控制FPGA采集时序。在8086以大模式运行时,当S2、S1、S0为100时,8086 CPU读取指令代码;当EA引脚为低电平时,MCS51读取片外ROM的指令,ALE信号有效时,FPGA采集地址总线上的数据,随后采集数据总线上的指令码。在FPGA采集逻辑中,不考虑MCS51指令无效取指的过滤问题,而将数据的处理统一放在过滤模块中进行。8086 CPU和 MCS51的总线时序如图2\[2\]、图3所示。
图28086总线时序图图3MCS51单字节双周期指令总线时序3地址对照表数据过滤方式
对于非干涉测试上位机代码分析而言,地址连续的指令在分析过程中需要剔除,保留转移指令和转移的目标地址,就可以完整分析代码的运行轨迹。因此,在采集过程中,需要过滤对于指令分析无效的数据采集。利用FPGA可以以流水方式处理的优点,在采集之后过滤数据,可在减少数据传输量的同时,提高上位机指令分析软件的效率。
以8086 CPU为例,由于指令地址空间有限,因此考虑由上位机分析指令的运行情况,生成基于指令地址的过滤信息。在数据采集之前,将过滤信息下载到图4地址对照表数据过滤方式FPGA片外的SRAM中。对于采集到的数据,以指令地址作为SRAM的地址,读取对于该指令地址的过滤条件。因此称这种过滤方式为地址对照表数据过滤方式,图4说明了过滤的实现。
地址对照表数据过滤方式不需要考虑指令内容和指令同步问题,地址对照表中包括了对于所有地址的指令过滤信息,处理方法简单并且准确可靠。
4指令译码数据过滤方式
在图3中,MCS51的一个完整指令周期中,指令周期大于取指周期时,ALE信号仍然有效,地址总线和数据总线进行了无效取指。在FPGA采集逻辑与CPU指令周期的开始取得同步后,通过指令译码,可以得知指令的执行周期和图5指令译码数据过滤方式指令长度,从而剔除无效取指。从这一思路引申,以指令译码方式同步指令的取指周期,对于跳转指令、CALL指令、RET指令或中断调用与返回指令,当下一取指地址不连续时,以上的指令必然被执行,过滤方式如图5所示。非干涉测试中,仅仅关心指令跳转和跳转的目标地址,因而指令译码方式提供了另一种数据过滤的途径。
MCS51是非流水线结构的CPU,没有指令预取队列,指令码长度固定,寻址方式简单,仅仅MOVX指令可以访问外部数据RAM,是非干涉测试目标CPU中最简单的一种。8086具有6字节长的指令预取队列,指令译码方式和寻址方式比MSC51复杂。在非干涉测试FPGA的过滤逻辑中,模拟指令预取队列的操作,分析CPU中正在运行的指令。对于条件跳转指令,当采集到的指令地址不连续时,必然是上一条在CPU执行的跳转指令跳转条件成立,采集到的跳转指令地址和目标指令地址上传,清空指令预取队列。
作为一种特殊的情况,在8086 CPU中,QS1、QS0信号标识了CPU对于指令预取队列的操作。当QS1、QS0为“10”时,8086发生指令地址跳转,并清空指令预取队列。
对于具有流水线结构和指令预取队列的RISC CPU,有取指、译码、执行、写回周期。非干涉测试FPGA对于控制冒险的处理方法可以类似于有指令预取队列的CPU。对于RISC处理器的数据冒险,可以在FPGA内实现CPU寄存器读写冲突的检测并加以解决,因而指令的执行情况也是可知的。
由上面的分析可知,指令译码数据过滤方式的核心问题在于通过指令译码,确定指令的长度、指令的执行时间、流水线结构中指令的相关性以及同步取指周期,并且尽可能精确的定位正在CPU内执行的指令,实现CPU指令运行与数据采集的同步,从而获取指令跳转的情况。
由于指令取指有多个周期,为了进行指令译码,必须考虑非干涉测试FPGA的过滤逻辑与CPU指令的初始化同步问题。相对简单且有效的同步方法有RESET信号同步,或者是由上位机在运行时下载特定指令地址到FPGA逻辑中进行指令译码同步。另外,对于某些特殊情况,例如在MCS51中,MOVX指令访问数据RAM时,非干涉测试FPGA利用RD或WR信号的变化进行同步。
5高性能嵌入式CPU的非干涉测试
非干涉测试通过数据采集获得CPU运行的指令,关键问题在于剔除CPU读取但没有执行的指令。对于有Cache的CPU,数据总线和地址总线上的数据并不一定是被CPU执行的指令和指令地址。在非干涉测试中,无法获得CPU读取的数据块中第一条执行的指令,以及指令跳转目标地址在Cache中的命中情况。当SoC系统内有微处理器核时,则为避开这一问题提供了可能。如果能够获得SoC系统内的微处理器与Cache的接口,非干涉测试的数据采集方法,仍然是有效的。由于SoC内已有的一些测试方法,例如针对SoC内微处理器核的内建自测试,也为非干涉的嵌入式软件测试提供了数据来源。
对于具有指令多发射、动态调度、超标量、多线程等指令级并行技术的CPU,非干涉测试方法已经不能准确获得在CPU内运行的指令。但是,通过获取进入CPU并且已经执行的指令,由上位机软件进一步分析,可以大致获得程序指令的运行情况,这些信息仍能够保证非干涉测试软件分析。
6小结
非干涉测试最终用于XX星载软件的测试。作为一种嵌入式软件测试的方法,非干涉测试在不影响软件运行的前提下,针对被测试系统硬件的特征和结构,采集CPU总线上的指令和地址信息,对嵌入式软件的可靠性、覆盖率等性能指标进行有效地测评。
参考文献
1张炯. 一种嵌入式系统软件的非干涉测试方法. 北京航空航天大学学报,2004(7)
2杨彦明. 软件动态测试的一种新方法. 微计算机应用, 2003(7)
3Brey Barry B. Intel微处理器结构、编程与接口. 第6版. 金惠华译. 北京:电子工业出版社,2004
4李华. MCS51系列单片机实用接口技术. 北京:北京航空航天大学出版社,1993
5Rajsuman Rochit. SoC设计与测试. 于敦山译. 北京:北京航空航天大学出版社,2003
6Ron Patton. 软件测试. 周矛滨,姚静译. 北京:机械工业出版社,2002
