- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
SoC设计中基于PCI子系统的一体化验证解决方案
据统计,百万门级SoC的NRE费用已达到100万美元,因此在SoC正式投产前开展全面完整的测试非常必要。本文将着重讨论典型PCI子系统设计中的验证策略及实现方法。包括功能和性能验证在内的验证策略充分应用了直接和伪随机测试生成方法、协议检查器和功能覆盖分析手段,以期创造客观公正的测试过程。
随着采用即插即用IP的系统级芯片(SoC)设计逐步进入实用阶段,元件与系统兼容性测试问题变得越来越突出。问题的关键在于,IP的使用(比如各种各样的外围元件互连接口PCI)对功能性验证来说基本没有什么帮助。另外,随着IP硬件和软件的日趋复杂,对协议兼容性和系统级验证的要求也越来越高。PCI具有强大的互连机能,专门用于连接各种高性能外围设备,如图形处理器、全运动视频处理器、SCSI和LAN等接口卡。目前为止全球已有70多个PCI组织(PCI工贸协会),而PCI也成为全世界最受欢迎的总线标准之一。
对于SoC设计人员来说,在SoC中嵌入PCI接口来桥接片上总线和片外PCI本地总线的确是一个非常好的解决方案。事实上,全球有许多ASIC和IP供应商已开始供应包含单主、单从和主从控制器在内的各种PCI和PCI-X接口控制器,而且这些控制器均支持同步和异步PCI接口。创建PCI子系统验证环境的首要目标是要实现适用于最新PCI总线接口元件和周边器件的可复用高效即插即用型验证环境。
PCI子系统验证会遇到包括PCI本地总线要求和系统级要求在内的很多挑战。PCI本地总线结构功能十分强大,而且这种复杂的数据处理没有固定的持续时间。另外,每个设计都会采纳一系列供应商提出的实现方案,因此每个IP内核或外围器件都有其特有的性能。而且PCI子系统是一种多层次的硬件/软件系统,系统内的整体总线性能、带宽和反应时间取决于系统负载特性、总线速度和带宽(如图1所示)。
模块测试环境
下面所要讨论的PCI子系统验证策略实现了模块化可复用的测试开发和覆盖分析环境,该环境适用于PCI接口和子系统级的功能验证。利用简单的网表实例和器件功能与地址结构可以简化新元件和器件的集成。此外,所有的测试发生器、处理器、监视器和协议检查器都是在PCI级开发完成的。
PCI测试环境提供了完整的基于“PCI信号和系统测试综合论坛”的PCI元件兼容性测试套件。每项测试都需要进行严格的PCI协议检查、功能覆盖测试以及PCI器件与系统级功能的分析。功能覆盖测试尤其重要,其结果可以用来客观地评估器件和系统功能通过验证的程度,而且还能用来控制闭环测试。
除了基本的兼容性测试外,PCI测试环境还支持测试开发,利用伪随机处理发生器还可以验证外围设备的核心功能和性能。这些伪随机处理发生器可以改变多种处理参数,如命令类型、脉冲长度、目标地址、器件请求速率以及重试率。最后,由于PCI子系统本质上是一个多层次的硬件/软件系统,因此需要尽早地把诊断和器件驱动器与硬件模型仿真集成起来,这样可以简化软件的开发和调试。由于主机运行的是本地操作系统和驱动器,因此需要通过中间处理器才能与PCI设备的硬件仿真协同工作。
PCI总线协议需要接受全面的PCI2.2和PCI-X总线处理规则检查。本文讨论的验证策略采用了严格的客观的验证方法,要求为每项测试指标定义一组客观的通过/失败标准。由于所定义的测试标准能满足被测器件的性能要求,同时也满足业界标准和规范,因此测试标准中的数据能与业界实际应用保持一致。
与业界规范的一致性
测试文件是在一系列兼容性测试的基础产生的,而这些符合PCI组织及系统测试综合论坛规定的兼容性测试又分为三个等级,它们是:PCI元件接口级;PCI系统接口级;独立于器件的核心功能级。
元件接口兼容性基础测试是PCI国际组织定义的,其根据就是专用于元件的主从协议测试方案下的PCI2.2兼容性检查表及该表的PCI-X附录。这个项目有限的协议测试方案是与主从器件所用的元件协议检查表一起使用的,可作为PCI本地总线规范2.2的协议兼容性测试的简化规范,并且有助于设计检查。当然前提条件是配置寄存器需要设置为适当的状态,并由协议检查器监视PCI总线。上述协议测试方案主要用于仿真环境,但也可用于硬件测试环境。
系统测试开坛(系统测试-接口)的PC99测试技术规范第4章--PCI测试规范提供了有关系统接口兼容性测试的内容。另外,在论坛所提供的测试规范中还有许多针对不同设备类型如网卡、调制解调器等的专门测试技术规范。
独立于设备的系统兼容性测试需要考虑包括应用软件、专用驱动器和设备特殊机能在内的多种硬件和软件协议间的相互关系和影响,而且必须在功能和性能测试的基础上做系统级结构兼容性测试。另外,兼容性测试需要具体到兼容性测试覆盖矩阵中的每个PCI元件和系统级性能。矩阵对照测试的依据是:
硬件和系统功能;各种芯片、电路板以及当前使用的系统级仿真模型配置
兼容性测试覆盖范围
根据协议检查器和功能覆盖模型的通过/失败标准所制定的测试实现方法和测试结果,就很容易跟踪PCI结构性特点以及芯片、电路板的测试范围(大量随机案例),并有利于开展系统级验证测试。
验证环境的具体实现过程还确定了另外的目标,包括:利用以数据处理为主,且适用于功能测试发生器、结果检查器和结构性参考模型,可以提高编写和复用测试的效率;利用集成的仿真及功能覆盖分析来开展闭环随机测试,并向验证小组不断提供有益的帮助。
硬件/软件接口的验证
在PCI子系统验证中有三种关键的硬件软件接口必须正常工作,它们是:PCI设备驱动器、PCI基本输入输出系统(BOIS)以及用于支撑PCI自动配置的主操作系统。诊断程序将利用PCI驱动器和PCI BOIS程序来配置和执行存储器及I/O总线周期,以测试主机及设备的操作过程,如正常的读、写和中断。
本文采用了Avery设计系统公司提供的Verilog-C Kernel(VCK)和C语言来作为建立自动化测试平台、覆盖分析和软硬件协同仿真环境的主要工具。利用这些工具建立起的测试环境所支持的关键验证技术和方法有:并行测试的自动化流水作业;伪随机测试;用于处理器/测试开发的增强型Verilog HDL和C/C++(VCI API);灵活的软硬件协同仿真;稳定的功能覆盖分析和协议检查;可升级性能的并行仿真。
Avery公司的VCK验证环境支持验证合作基础设施(VCI),因此能够满足多种多样的分布式功能性验证要求,包括基于C语言的测试开发,分布式并行仿真以及对主机和嵌入式系统的软硬件协同仿真。VCK可直接支持VCI功能,另外,基于ANSI C语言的应用程序接口(API)可与C/C++程序及Verilog PLI库一起使用,因此任何标准的Verilog仿真器都能实现对VCI的支持。
覆盖分析和协议检查器
在大规模特别是包含有伪随机验证环境的验证测试中,覆盖测试的自动化是非常重要的,它能让人很好地理解有大量测试案例的复杂测试过程。具体来说,覆盖测试可用来正确评估测试的整体进程,去除那些重复的低效的测试案例,确定尚没有被测试过的区域,并能识别那些回归组件测试(regression suites)。另外,覆盖测试可以划分为两大类,即代码覆盖(基于程序)测试和功能覆盖(特殊处理有关)测试。
代码覆盖测试会在仿真过程期间测试设计中哪些部分已经运行了测试程序,某个高级行为会指示所有的状态机控制器、数据通道和控制,从而给出是否至少以一个工作模式经过测试的信息。代码覆盖工具还会测试累积性仿真,并对状态值和状态变换、数据和控制值以及线覆盖实施跟踪。
功能覆盖测试方法需要用到监视器和声明检查器。通过收集仿真过程中有关临时相关性组合所产生的信息以及状态条件和次序信息,监视器可以管理整个验证过程。因此可以用这种方式在结构性能的测试操作范围内对一项测试或一组测试作出评估。根据仿真过程中测得的覆盖水平,可以往功能测试项目中动态增加更多的伪随机测试案例,或者增加全新的测试。覆盖分析数据可以保存在数据库中以备今后更好地集中、分类和分析。监视器可提供不止一种的特殊功能覆盖分析方法。
然而,现在仍不能保证这些固定的、伪随机性的功能测试能用预期的所有系统操作模式来试验设计。此外,用于PCI的小型覆盖监视器子系统包含有总线命令类型、目标地址、数据处理类型(消息、延迟、分支与合并)和长度、终止和故障条件。
在仿真期间,协议检查器会在协议、结构和算法没有遭到破坏的前提下对系统性能和假设条件进行验证。而在复杂的并行系统中,协议规则的相互影响是非常微妙的,很容易遗漏一些问题,因此需要为每个协议规则制作通过/失败声明。一份协议规则必须支持信号与事件之间复杂的临时性关系,而PCI协议规则的一个小型化子集需要包含器件选择时序、最大处理长度、数据相位时序和终止及重试信息。
伪随机测试基础
开展系统级兼容性验证最重要的是要利用随机测试产生偏僻案例和重点测试,一般可以通过系统性地产生大量高度相关的处理特性来完成。在尝试了所有的人工测试后就会发现,伪随机测试方法能提供更有效的途径来提高功能覆盖水平。伪随机测试是一种高效率的智能化测试方法,它不像穷举测试需要长时间的仿真。从这些非常有用的随机方法中可以发现限制性随机案例、循环案例、边界案例和一些加权案例算法。另外,对多个结构化参数之间固有关系的充分理解能改进随机案例的品质,并提高设计人员的设计效率。
伪随机测试过程有三个步骤。首先,需要根据给定的测试规范选择结构化性能特点;其次,要获得可支持测试内容包括随机参数的测试样板;第三,需要开发一个能实现测试样板与硬件模型之间物理接口的处理器。当仿真过程同时用到多个随机测试发生器时,由于子系统中相互独立的功能间会出现较为复杂的关系,因此常常会产生很多问题,这也是PCI子系统的功能与性能验证所用的随机测试中的重要因素。
可增强鲁棒性测试的Verilog扩展
Verilog硬件描述语言(HDL)中通常都有测试发生器、协议检查器和监视器的代码。Verilog支持并行处理,其数据类型可支持硬件实现、通用数据类型,其任务与函数可改进模块性能。然而,与一般的编程语言相比,Verilog语言缺乏用户可定义的数据结构、宏、强大的随机函数以及可互处理的同步原始对象,如锁、互斥体和旗语。在测试平台的开发中,无论是Verilog还是与它同类的一般性编程语言都无法提供有效的表达方法来开发高效的伪随机测试、临时协议检查器和功能覆盖监视器。
Verilog HDL验证语言扩展(VLE)是VCK的一个子集,它能提供一些必需的函数与数据类型,可用于开发人工指导测试和自动伪随机指导测试以及结果检查器、功能覆盖图和协议检查器。幸运的是,由于VLE是Verilog语言的扩展,设计人员能很容易地学会VLE新功能的用法。VLE的基础是IEEE 136?-1995 Verilog HDL标准中提到的Verilog用户自定义任务和函数语法。VLE具有以下一些性能特点:
1. 列表功能支持用于保持内容集的新数据类型。所提供的列表是可变的、未排序的,包含所有Verilog和VLE能支持的数据类型,甚至也包括列表类型。同时列表也支持范围符号(range notation),因此可提供数值范围的定义。
2. 随机变量函数能将一个或多个随机值发生器声明为标准的包括VLE记录类型在内的Verilog数据类型。同时它还支持不少随机数字发生器算法,包括简单随机、加权分布、边界案例以及在不重复的情况下能一次穷举所有值的循环再生算法。合法的随机值子集被定义为列表函数。此外,利用随机变量组和其它特殊的随机变量相关函数可创建复杂的相关性,并且通过调用更新函数(update function)可给随机变量赋值。
3. 信号历史函数可提供对信号历史的访问,包括变量值和修改次数。查询函数能在指定的仿真时间访问变量历史,或者访问可查寻到前面N个数值的数值修改历史索引。
4. 协议和临时检查任务所提供的函数可用于检查变量与表达式之间的临时关系。
5. 旗语任务所提供的同步函数可用于控制对共享资源的访问,并具有延缓和即时两种选项。另外,这是一种计数式旗语,对资源的访问不具备排他性。
6. 任务增强功能支持引用性调用,并能通过创建任务变量的保护性拷贝支持并发调用。任务变量现在已包含了存储器和记录类型(表1)。
7. 记录函数具有声明和访问记录的功能。这里的记录非常类似于C语言中的结构或者C++中的容器对象(container object),记录的每个域可以是任何Verilog或VLE数据类型,甚至可以是记录类型。记录数据类型提供了功能强大的用户自定义Verilog结构。另外,可直接映射为C结构的“$c_record”能被直接创建。
功能覆盖函数(profile function)用于分析仿真的功能覆盖,而功能覆盖监视器可以跟踪变量中数值的变化,包括状态机的变化。功能覆盖函数可以声明功能覆盖监视器、设置变量的合法值、控制人工和自动的功能覆盖测试升级,还能声明功能覆盖方程并报告功能覆盖结果。
功能覆盖测试可以在仿真期间动态地进行,并支持覆盖面的扩大。
软件抽象级测试
虽然利用基于VLE的自动化测试平台可以改善硬件测试性能,但系统兼容性方面仍需慎重考虑软硬件之间的相互作用。ASIC和SoC的复杂结构给芯片处理器、固件和RTOS(实时操作系统)的设计敲响了警钟。系统综合测试的重点在于固件和设备驱动器的调试,因此这两个因素形成了基于软件的应用程序、高层协议堆栈、RTOS和独立嵌入式系统的硬件平台结构之间的标准接口。
系统兼容性验证需要开发工作于软件抽象级的测试,并提供与系统设备的软件数据表示模型和算法更好的一致性。诊断测试程序是在软硬件协同仿真环境下运行的,该仿真环境采用了基于VCI API的硬件软件处理器。SoC设计中的即插即用IP元件的生命力最大程度上要取决于验证环境的质量和完整性,PCI本地总线标准中提供了一个理想的案例可作参考。PCI组织和系统测试综合论坛已明确客观地定义了PCI元件与系统级兼容性验证的具体要求。
[Integrated System Design]
上一篇:利用反向驱动电流检测技术提高在线测试性能
下一篇:验证复用技术确保设计符合预定要求