一种全覆盖的微处理器测试用例包自动生成方法

文档序号:6482237阅读:152来源:国知局
专利名称:一种全覆盖的微处理器测试用例包自动生成方法
技术领域
本发明涉及微处理器的自动测试方法,尤指全覆盖的微处理器测试用例包自动生成 方法。
背景技术
在微处理器的开发过程中,对其功能进行准确而严密的测试是十分关键的。功能验 证的主要方式是基于指令集的测试验证。由于指令组合数量巨大,测试员手工方式编写 测试用例效率低、覆盖率低, 一般不作为主要方法。目前,由程序自动生成测试用例是 微处理器功能测试的主要形式,可以分为两种形式化方法和随机方法。
形式化方法是指对待测部件建立抽象状态机模型,根据其状态转换及相应激励,采 用约束求解、符号执行等技术自动生成测试用例。形式化方法生成的测试用例覆盖率高, 但由于存在状态爆炸问题,其扩展性较差, 一般只用来测试处理器中的某个部件,例如 流水线或Cache协议。
微处理器整体功能验证目前大部分釆用随机方法。随机方法是首先建立指令模板 库,然后在满足约束条件下随机抽取其中的指令组成测试用例。目前随机方法研究较多 且应用广泛,并且结合专家系统、模型检验、定理证明等其他技术有效提高了测试程序 的覆盖率。但是现有的随机方法仍然存在很多问题,如有的系统要求用户根据处理器特 性编写大量的配置文件,或者根据微处理器的硬件设计进行详细建模。而芯片的用户由 于无法掌握这些信息,从而不能对芯片进行充分测试,只能通过运行大型Benchmark或 自己开发用户级测试程序进行验收。
无论是形式化方法还是随机方法,生成的测试用例都无法覆盖到全部的指令组合, 无法确保检测到微处理器的所有错误。而对于某些特定领域(例如航空航天领域)的专 用芯片,芯片的功能验证要求极为严格,不能遗漏任何的功能验证, 一个微小的错误都 有可能会造成极为严重的后果。因此,形式化方法和随机方法这些非全覆盖的测试用例 生成方法不适合这类特定领域。此外,特定领域的专用芯片涉及的指令数目比一般的通 用处理器小,更加适合生成全覆盖的测试用例,不易产生指令组合爆炸问题
发明内容
本发明要解决的技术问题在于针对微处理器随机测试方法无法确保覆盖全部指令 组合以及用户难以使用的问题,提出一种全覆盖的微处理器测试用例包自动生成方法, 使用户在不了解处理器硬件设计细节的情况下,实现对微处理器全部指令组合的自动测 试,提高小指令数情况下测试用例的覆盖率,弥补随机测试方法的不足。
为了解决上述技术问题,本发明的技术方案为根据微处理器指令集,将每条指令
的标识ID (identification),指令的汇编名称、源操作数类型和目的操作数类型构成一 条指令模板,M条指令模板构成大小为M的指令模版库。根据用户需测试的指令数7V, 从指令模板库中任意选出iV条指令模板,按顺序排列成长度为JV的指令模板组合,共 可形成似w个指令模板组合。采用实例化方法将每个指令模板组合实例化成对应的指令 组合,MW个指令模板组合实例化成MW个指令组合。初始化函数、指令组合和状态输 出代码顺序构成一条测试用例,共有MW条测试用例。将M^条测试用例打包构成测试
用例包。
具体技术方案为-
设用户需测试的指令数为iV。
第一步、构建初始化函数Init。 Init是测试用例的一部分,负责对指令组合在测试 过程中所涉及的测试用例计数器、内存、运算部件和各类寄存器进行初始化,以消除任 何会导致不确定状态的因素。Init的流程是
1.1 设置测试用例计数器,用于标识已运行过的测试用例和定位出错的测试用 例,在运行环境构建开始时将测试用例计数器初值设为零。
1.2 分配数据内存,包括源操作数和目的操作数使用的内存,根据数据类型分
配不同的内存大小,类型包括单字定点、单字浮点、双字定点和双字浮占。
"、、o
1.3 对于运算部件,通过连续执行空转指令(NOP)排空流水线。
1.4 对于寄存器,依照状态寄存器、源寄存器和目的寄存器分别进行处理。状 态寄存器是指诸如处理器状态寄存器(Processor State Register, PSR)、浮 点状态寄存器(Floating-Point Status Register, FSR)等表示系统运行状态 的寄存器;源寄存器是指在指令组合中用来装载源操作数的寄存器;目的 寄存器是指在指令组合中用来放置结果的寄存器。对以上三种寄存器的初 始化过程如下
1.4.1对状态寄存器中会被指令执行影响到的位清零;1.4.2对源寄存器赋初值。源寄存器作为测试用例自动生成过程的输入,
必须赋予初值,初值的选择要使指令能正常执行; 1.4.3对目的寄存器清零。目的寄存器作为测试用例自动生成过程的输 出,是指令组合执行完毕后状态的一部分,初始化时需要全部清零。 为避免代码过度膨胀,将Init组织为单独的函数,在指令组合执行之前进行调用。 第二步、构建状态输出函数Output。 Output是测试用例的一部分,负责输出每条指 令组合执行时的状态寄存器、目的寄存器和访存指令涉及的内存值,以便验证指令组合 执行结果的正确性。
同样为了避免代码过度膨胀,将Output组织为单独的函数,在指令组合执行之后 进行调用。
第三步、建立包含M条指令模板的指令模板库,M是微处理器指令集中指令的条 数。测试用例中的每条指令都源自于该指令模板库。每条指令模板由指令ID、指令的 汇编名称、源操作数类型和目的操作数类型构成。指令ID为枚举类型常量,指令的汇 编名称为字符串常量,对应指令的汇编语法,源操作数和目的操作数类型为整型、浮点 类型等所有常用数据结构。指令模板中使用操作数类型而非操作数,便于在实例化指令 时重用寄存器,减少寄存器压力,消除指令组合内的源寄存器和目的寄存器冲突。
第四步、根据第三步建立的指令模板库,构造大小为M"的指令模板组合集合X。 构造方法是从指令模板库中任取iV条指令模板构成一条指令模板组合,共形成M^条 指令模板组合,所有指令组合构成大小为MW的指令模板组合集合X。
第五步、判断集合X是否为空,若为空,执行第九步,若不为空,执行第六步;
第六步、从集合X中任选一个待实例化的指令模板组合x, X-X-{x},即从集合X 中删除x;
第七步、顺序对指令模板组合x中的每一条指令模板i进行实例化,得到实例化后 的指令为i',相应得到x实例化后的指令组合x',具体过程如下
指令模板i中的指令ID和指令汇编名称是唯一的,无需实例化,实例化指令模板i 只需对源操作数类型和目的操作数类型进行,这两项的实例化过程均采用静态寄存器映 射的方式实现。
7.1如果指令模板i为CALL指令,执行步骤7.6;如果指令模板i为跳转指令,执
行步骤7.7;否则,执行步骤7.2; 7.2根据源或目的操作数类型将所有寄存器划分成若干子集;7.3设指令模板i的目的操作数类型对应的寄存器子集为J, X'中位于i'之前的 所有指令的目的操作数所分配的全部寄存器集合为L, J=J-L;
7.4为指令模板i的每个源操作数根据其类型分配对应寄存器集合中的一个寄存
器,为指令模板i的每个目的操作数根据其类型分配J集合中的一个寄存器。 如果指令个数过多,寄存器无法划分成足够的子集时,则采用经典的寄存器分 配算法(如图着色法或线形扫描算法)为指令模板i的源操作数和目的操作数
进行动态映射分配;
7.5如果指令i'和i'的前一条指令之间存在依赖关系,则在它们之间插入空指令, 转第九步;
7.6对CALL指令进行实例化,方法是
7.6.1为了能够控制跳转后的行为,不对后面的指令产生副作用,创建叶子函 数,叶子函数是位于调用图中叶子位置的函数,即不再调用其他函数。 叶子函数除空指令和返回语句外不包含任何其他指令,其地址作为 CALL指令的操作数,并在叶子函数入口地址处设置标号一cvt—lp,使函 数返回时可继续执行CALL指令的下一条指令;
7.6.2将CALL指令模板中的源操作数实例化为空,目的操作数实例化为7.6.1 中定义的标号一cvt—lp。生成带目标地址—cvt—lp的调用函数指令,形式为 "call —cvt一lp,,。
7.6.3转第八步;
7.7对跳转指令进行实例化,方法是跳转指令分为无条件跳转指令和条件跳转指
令。无条件跳转指令直接跳转到目标地址,条件跳转指令读取状态寄存器的值, 根据其内容判断指令是否跳转。测试用例中的跳转指令和一般程序中的跳转指 令不同,无论哪种跳转指令,均不能改变指令组合中指令的执行顺序,即跳转 指令结束之后,应该顺序执行指令组合中的下一条指令。为了能够使测试用例 实现对跳转指令的功能测试,同时又不改变指令组合中指令的执行顺序,必须 进行"伪跳转"。"伪跳转"仅执行跳转动作,跳转结束后返回原指令组合中跳 转指令的下一条指令。采用跳转表实现"伪跳转",跳转表是记录指令组合中 跳转指令信息的表,其每一项代表一条跳转指令信息,具体包括标号、指令和
目标地址。标号代表该表项的入口地址,为每条跳转指令跳转的目标地址;指 令代表跳转指令;目标地址代表跳转指令结束跳转时返回指令组合下一条指令的地址。每条跳转指令跳转到跳转表中对应的一项,再根据目标地址跳回指令 组合中的下一条指令,完成跳转功能。跳转指令实例化方法具体子步骤 7.7.1如果跳转指令为指令组合中的第一条跳转指令,建立该指令组合的跳转 表,初始化跳转表,建立第一条表项内容;如果不是第一条跳转指令,则 在跳转表中增加一条表项内容。按如下方法填写跳转表表项内容标号部 分填写表项的入口地址;指令部分填写无条件跳转指令;目标地址部分填 写指令组合中跳转指令的下一条指令地址。 7.7.2实例化跳转指令模板,跳转指令模板的源操作数类型实例化为空,目的操 作数类型实例化为步骤7.7.1中填写的跳转表表项的标号。 第八步、将第一步获得的初始化函数Init、第七步获得的指令组合以及第二步获得
的状态输出函数Output顺序连接成一条测试用例,返回第五步;
第九步、将全部测试用例打包构成测试用例包,输出该测试用例包。
与现有技术相比,釆用本发明可达到以下技术效果
1. 作为随机方法的补充,可以确保指令组合全部覆盖,满足特定领域对微处理器 进行完整功能验证的需求;
2. 由于不涉及微处理器内部设计细节,本发明可以使微处理器用户对芯片进行初 步功能测试,其结果可作为芯片验收时的参考。


图l是本发明的总流程图。 具体实施方案
图1是本发明的总流程图。
步骤l)、构建初始化函数Init:将初始化代码构成单独的初始化函数,供测试用例 调用;
步骤2)、构建状态输出函数Output;
步骤3)、根据微处理器指令的描述建立包含M条指令模板的指令模板库; 步骤4)、构造大小为M^的指令模板组合集合X;
步骤5)、判断集合X是否为空,若为空,执行步骤9),若不为空,执行步骤6); 步骤6)、从集合X中任选一个待实例化的指令模板组合x, X=X-{x};步骤7)、将步骤6)中获得的指令模板组合X中的每一条指令模板i进行实例化, 得到X对应的一条指令组合X';
步骤8)、将步骤l)获得的初始化代码、步骤7)获得的指令组合以及步骤2)获
得的状态输出代码顺序连接成一条测试用例,返回步骤5);
步骤9)、将全部测试用例打包构成测试用例包,输出该测试用例包,结束。
权利要求
1.一种全覆盖的微处理器测试用例包自动生成方法,其特征在于包括以下步骤第一步、构建初始化函数Init,Init是测试用例的一部分,负责对指令组合在测试过程中所涉及的测试用例计数器、内存、运算部件和各类寄存器进行初始化,Init的流程是1.1设置测试用例计数器,用于标识已运行过的测试用例和定位出错的测试用例,在运行环境构建开始时将测试用例计数器初值设为零;1.2分配数据内存,包括源操作数和目的操作数使用的内存,根据数据类型分配不同的内存大小;1.3对于运算部件,通过连续执行空转指令NOP排空流水线;1.4对于寄存器,依照状态寄存器、源寄存器和目的寄存器分别进行处理状态寄存器是指表示系统运行状态的寄存器;源寄存器是指在指令组合中用来装载源操作数的寄存器;目的寄存器是指在指令组合中用来放置结果的寄存器,对以上三种寄存器的初始化过程如下1.4.1对状态寄存器中会被指令执行影响到的位清零;1.4.2对源寄存器赋初值,初值的选择要使指令能正常执行;1.4.3对目的寄存器清零;第二步、构建状态输出函数Output,Output是测试用例的一部分,负责输出每条指令组合执行时的状态寄存器、目的寄存器和访存指令涉及的内存值;第三步、建立包含M条指令模板的指令模板库,M是微处理器指令集中指令的条数,测试用例中的每条指令都源自于该指令模板库;每条指令模板由指令ID、指令的汇编名称、源操作数类型和目的操作数类型构成,指令ID为枚举类型常量,指令的汇编名称为字符串常量,对应指令的汇编语法,源操作数和目的操作数类型为常用数据结构;第四步、根据指令模板库构造大小为MN的指令模板组合集合X,N为用户需测试的指令数,构造方法是从指令模板库中任取N条指令模板构成一条指令模板组合,共形成MN条指令模板组合,所有指令组合构成大小为MN的指令模板组合集合X;第五步、判断集合X是否为空,若为空,执行第九步,若不为空,执行第六步;第六步、从集合X中任选一个待实例化的指令模板组合x,X=X-{x};第七步、顺序对指令模板组合x中的每一条指令模板i进行实例化,方法是采用静态寄存器映射的方式实现i的源操作数类型和目的操作数类型的实例化,得到实例化后的指令为i’,相应得到x实例化后的指令组合x’,具体过程是7.1如果指令模板i为CALL指令,执行步骤7.6;如果指令模板i为跳转指令,执行步骤7.7;否则,执行步骤7.2;7.2根据源或目的操作数类型将所有寄存器划分成若干子集;7.3设指令模板i的目的操作数类型对应的寄存器子集为J,x’中位于i’之前的所有指令的目的操作数所分配的全部寄存器集合为L,J=J-L;7.4为指令模板i的每个源操作数根据其类型分配对应寄存器集合中的一个寄存器,为指令模板i的每个目的操作数根据其类型分配J集合中的一个寄存器;7.5如果指令i’中i’的前一条指令之间存在依赖关系,则在它们之间插入空指令,转第九步;7.6对CALL指令进行实例化,方法是7.6.1创建叶子函数,叶子函数除空指令和返回语句外不包含任何其他指令,其地址作为CALL指令的操作数,并在叶子函数入口地址处设置标号_cvt_lp,使函数返回时可继续执行CALL指令的下一条指令;7.6.2将CALL指令模板中的源操作数实例化为空,目的操作数实例化为7.6.1中定义的标号_cvt_lp,生成带目标地址_cvt_lp的调用函数指令,形式为“call_cvt_lp”;7.6.3转第八步;7.7对跳转指令进行实例化,方法是7.7.1如果跳转指令为指令组合中的第一条跳转指令,建立该指令组合的跳转表,初始化跳转表,建立第一条表项内容;如果不是第一条跳转指令,则在跳转表中增加一条表项内容;跳转表是记录指令组合中跳转指令信息的表,每一项代表一条跳转指令信息,包括标号、指令和目标地址,标号代表该表项的入口地址,为每条跳转指令跳转的目标地址;指令代表跳转指令;目标地址代表跳转指令结束跳转时返回指令组合下一条指令的地址;填写跳转表表项内容的方法是标号部分填写表项的入口地址;指令部分填写无条件跳转指令;目标地址部分填写指令组合中跳转指令的下一条指令地址;7.7.2实例化跳转指令模板,跳转指令模板的源操作数类型实例化为空,目的操作数类型实例化为跳转表表项的标号;第八步、将第一步获得的初始化函数Init、第七步获得的指令组合以及第二步获得的状态输出函数Output顺序连接成一条测试用例,返回第五步;第九步、将全部测试用例打包构成测试用例包,输出该测试用例包。
2.如权利要求l所述的一种全覆盖的微处理器测试用例包自动生成方法,其特征在于在指令个数过多,寄存器无法划分成足够的子集时,采用经典的寄存器分配算法为指令模板i的源操作数和目的操作数进行动态映射分配。
全文摘要
本发明公开了一种全覆盖的微处理器测试用例包自动生成方法,目的是解决微处理器形式化方法和随机测试方法无法覆盖全部指令组合的问题。技术方案是将每条指令的标识、指令的汇编名称、源操作数类型和目的操作数类型构成指令模板,M条指令模板构成大小为M的指令模版库;根据用户需测试的指令数N,从指令模板库中选择N条指令模板,按序排列成指令模板组合,形成M<sup>N</sup>个指令模板组合;采用实例化方法将每个指令模板组合实例化成指令组合;将初始化函数Init、指令组合以及状态输出函数Output顺序连接成一条测试用例,将所有测试用例打包构成测试用例包。采用本发明可以确保覆盖全部的测试用例,满足某些特定领域专用芯片不能避免遗漏任何功能验证的要求。
文档编号G06F11/36GK101673236SQ20091004452
公开日2010年3月17日 申请日期2009年10月13日 优先权日2009年10月13日
发明者易会战, 杜云飞, 杨灿群, 锋 王, 赵克佳, 娟 陈, 春 黄 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1