Board logo

标题: 自动实现半导体器件系统强化测试的方法 [打印本页]

作者: yuyang911220    时间: 2016-12-24 15:09     标题: 自动实现半导体器件系统强化测试的方法

检验芯片的各项功能需要编写诊断软件,目的是确保器件的各项功能按要求工作,但是无论各项测试有多么详尽,它都无法找出大部分系统层次的问题。因此,要利用系统级强化测试(stress testing)来使多种功能以高强度和随机的方式共同执行,从而迫使这些设计问题浮出表面。本文将探讨用于检验半导体器件设计的系统强化测试方法。
强化测试
        强化测试是指将产品置于比实际正常应用苛刻得多的条件下使用,其目的是通过各种方式对设备进行考验,迅速发现其设计缺陷。例如,对于一件机械产品,可能让它 面对恶劣的环境条件,如高压、高温和震动。如果该产品能在这样的条件下成功经受一个月的考验,那么在正常使用条件下,它应该能工作长得多的时间。
        同样的概念也适用于芯片的设计。此时,强化测试的表现形式是执行诊断软件,其目的是使大量的芯片功能同时、连续、随机、密集地工作,其程度远远超过芯片正常 使用时的状况。这些测试通常连续运行,大多数时候无人照管,夜间和周末也不停止。通过这些测试,可以在产品发货之前迫使隐藏的系统问题尽快地暴露出来。
        为什么强化测试对半导体设计如此重要呢?为了解释这一问题,假设一个半导体器件常常为了不同用途而应用在各种电子系统之中,因此,这些电子产品将被几千甚至 几百万用户使用,每个用户使用产品的方式各不相同。在如此大量的使用中,当芯片上的功能和事件出现某种在器件测试过程中从未遇到过的顺序或组合时,可能就 会发生问题。这些问题通常表现为:不时被锁住、数据出错或其它难以复现的异常现象。如果这些问题出现太多(或者在执行重要任务的产品中仅仅偶然出现),用 户将会认为这些产品是不可靠甚至不稳定的。
强化测试概念的引出
        最初尝试创建系统 强化测试时,方法是研究和编写直接激活尽可能多的芯片功能并使它同时执行软件,使用定时器中断并让它执行随机测试,同时主程序不停地复制数据,并随机地不 时启动其它芯片操作。当想出向芯片内引入更多无序和随机事件的招数时,便将它添加到软件中去。很快就可以发现,虽然陆续发现了许多问题,但它大多发生在自 己编写的软件上。
        由于不时使用同一块存储区域或外设资源,测试软件中的测试功能相互干扰。例如,当一个测试正在使用某一通用I/O时,另一个随机启动的测试却更改了它的状态。由此不时导致的故障耗用了大量的调试时间。
        第二次,尝试开发组织得非常好的强化测试软件。它安排随机选择的测试功能轮流运行,在许多地方将中断锁住,以防止软件冲突和保证其它安全措施。这种谨慎的编 程使得测试非常稳定,但与直接测试相比,同样不能有效地发现芯片的问题,因为它是按照一种很大程度上可预期的顺序方式来执行测试。毕竟测试的目的是为了测 试半导体器件的设计,而不是为了获得稳定的测试软件。
        在理论上希望避免这两种极端情况。测试的根本目的是为了暴露芯片中系统 级的相互作用问题,为了达到这个目的,就必须将操作搞乱,使得许多不同事件以随机方式发生。其中的诀窍是,以一种有组织的方式来保持测试的无序特点,从而 获得可靠的测试软件,并可进行扩展,还可以尽可能地帮助调试。要达到这些目的,需要仔细进行考虑和规划。这就是构建一个强化测试框架的思路。
测试框架
        本文介绍一个软件框架(framework)的设计,读者可以使用这个框架来为半导体器件构建一个可扩展的强化测试。虽然本文没有提供完整的框架,但这些内容应当能够激发读者的灵感来帮助构建自己的强化测试框架。
        软件框架通过提供一个公共操作引擎和环境来简化特定类型的应用开发工作,具体的应用经由一个定义好的接口来与框架连接。强化测试框架也采用了同样的思路,它提供一个软件引擎来处理强化测试的基本操作和公共功能。
        强化测试框架本身不测试任何芯片功能,但它允许嵌入测试事件模块。测试事件模块是实现一项具体的半导体器件测试或事件的函数,通常要使用一组随机产生的测试参数。执行强化测试时,框架引擎将随机选择并以不同方式来启动这些测试事件模块。
        这个框架还为测试事件模块提供了基本服务供其使用,包括保留系统资源的功能、选择随机测试参数的功能和数据记录功能。大部分预先规划和设计都位于框架本身内 部,因为框架处理强化测试复杂和“混乱无序”的一面。然后,根据需要增加单个测试事件模块,扩展强化测试。由于框架负责处理公共的强化测试软件部分,测试 事件模块的开发人员可以专注于为目标芯片功能编写优秀的测试程序。图1为强化测试框架各个组成部分的高层次示意图。
        随机测试池是强化测试的核心部分,实际的半导体器件测试就位于其中。它是为了对芯片的某项具体功能启动事件和(或)执行测试而编写的测试事件模块的集合。开发新的 测试事件模块时,可将它添加到随机测试池中,以便在下一次运行强化测试时将其包含在内。本文后面还将更详细地介绍测试事件模块,因为这是为芯片开发并由框 架启动和支持的实际半导体器件测试。
        执行过程中,强化测试引擎随机地从池中选择和运行测试事件模块。为了使测试变得更加杂乱无序(从而对器件设计施加更大的强化测试),框架采用异步时隙来按照任意时间间隔随机选择和启动测试。
        “时隙”使用一个硬件定时器来实现,器件或测试板卡上的多个定时器可以拥有各自的时隙。框架为每个时隙定时器选择随机的时间间隔,当时隙截止时,引擎中断当前 的测试模块,定时器的中断处理程序将选择另一个模块来执行,同时引擎为下一个时隙操作选择另一个随机的时间间隔。这样,测试将以一种交织的风格执行,引发 各种各样的执行方式,同时还实现了执行的并行性,这一点将在后面看到。
        选择和启动一项测试的框架代码很简单,因为测试事件模块只不过是一个C语言函数而已。列表1是启动程序的一段代码。一般而言,框架保持有一组C函数,这些函数即为测试模块,读者可以选择任意一个索引来查看函数并加以执行。
(列表1)
测试模块
        如前所述,测试事件模块是一个函数,它针对半导体器件的某个具体特性执行一个动作或一次检验。虽然框架将测试模块作为一个C函数来激活,但如果需要,模块也 可以调用汇编级代码。框架的编写方式使得设计人员可以开发新的模块并添加到测试池中,供强化测试期间框架随机选择。后面框架实例中的测试模块是void C函数,它不需要任何参数。在框架支持功能的帮助下,模块本身可以启动测试并调用相应的功能来记录结果。
测试事件模块共有三种类型:

1. 纯事件

2. 检验测试

3. 延迟检验测试
        正如其名称所表明的那样,纯事件模块启动一个系统事件后不做任何检验工作,包括以某种方式改变系统或启动某项后台功能。那么,启动一个事件而不执行任何检验 有什么意义呢?为了解释这个问题,来考察一个测试事件模块,它仅仅切换处理器高速缓存的当前设置。每次框架随机选择这个模块时,高速缓存就从1切换到0或 从0切换到1。这增加了一个变化因素,因为对于运行时需要用到这个高速缓存的测试模块而言,它的值有时为1有时为0。
        第二种测试事件模块是检验测试,它执行一个动作,并在测试模块函数退出之前对这个动作进行检验。例如,这种测试可以用任意数据来填充随机选择的存储器区域,然后采用任意CPU读写宽度来将这个区域复制到一个随机的目的存储器区域,再检验其结果。
        第三种测试模块是延迟检验测试,这是功能最强的测试,虽然通常只能用于可以对总线进行控制的芯片功能(换句话说,运行在CPU的后台)。这种测试模块将启动 一个测试然后退出,使得在原测试继续运行时,其它测试模块可以执行。在大多数情况下,测试的完成用一个中断来表示。当中断发生时,中断处理程序将检验测试 的结果。
        延迟检验测试的例子如DMA (直接存储器访问)传输。可以编写一个测试模块来选择随机的源、目的存储器区域和DMA通道。这个测试模块可以用任意数值来填充源存储器,并配置一个用来 检验测试结果的DMA结束中断处理程序。这个中断处理程序即为“延迟检验测试”,它可访问包含有被启动测试的详细信息的数据结构,在被调用时,它还将检验 测试的结果。
测试框架实例
        为了展示这些测试的强大功能,来考察一个简单的测试框架实例,它包含以下四个测试模块。
1) 简单的基于CPU的存储器复制(TE_CPU_COPY):

        将随机数据样式填充到一个任意大小的随机源地址存储器块中,然后使用一种随机混合的读写宽度来将数据样式复制到任意选择的目的地址。复制完成后,检验目的区域中的数据是否包含了先前选择的数据样式。
2) DMA存储器---存储器复制(TE_DMA_M2M):

        将任意数据样式填充到随机源地址的任意大小的存储器块中,然后任意选择一个存储器---存储器DMA通道,编程为将源地址的数据样式复制到随机选择的目的地址。当DMA结束中断发生时,检查两个存储器区域是否匹配。
3) DMA---外设(TE_DMA_M2P):

        将任意数据样式填充到随机源地址的任意大小的存储器块中,然后任意选择一个存储器---存储器DMA通道,编程为将数据样式复制到特定外设的任意端口号中。当DMA结束中断发生时,检查外设的FIFO中是否包含了正确的数据(或者被发送到外设)。
4) 高速缓存切换(TE_CACHE):

        将高速缓存从1切换到0或从0切换到1并退出。这个测试模块是一个纯事件测试模块,运行时不执行检验操作。
        假设框架有三个时隙定时器用来启动测试事件模块,那么启动它的main( )例程位于时隙0,具体运行时可能与列表2所示类似。
(列表2)
        运行开始时执行存储器复制测试。执行过程中,时隙2定时器在复制中途定时截止。此时,高速缓存测试事件模块被启动,它切换高速缓存的状态并退出。复制测试在 高速缓存处于新设置的状况下继续执行。在测试完成之前,时隙1定时器又截止,此时一个DMA存储器---端口测试模块被启动,它设置任意的DMA通道并退 出。现在,DMA已在后台执行,而原来的复制测试又重新运行。随后又发生一个时隙3定时器中断,使用DMA通道5启动存储器---存储器传输并退出。这种 安排还可以继续下去,但已经可以看到,通过这个测试,可以让所有的DMA通道同时运行,高速缓存随机切换,而且CPU在测试过程中随机访问不同的存储器区 域。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0