《有效测试平台的编写》译文

有效测试平台的编写

摘要

本应用笔记主要是针对那些初次接触硬件描述语言(HDL)验证流程,对测试平台编写没有足够经验的逻辑设计者。

测试平台(Testbench)是用来验证硬件描述语言(HDL)设计工作的主要手段。这篇应用性的文字为布置和构建有效测试平台的工作提供了指导。它还为开发任意设计的自测试平台提供了算法。

这篇应用性文章包含的所有设计文件可以在以下FTP站点上获得:
PC:ftp://ftp.xilinx.com/pub/applications/xapp199.zip
UNIX:ftp://ftp.xilinx.com/pub/applications/xapp199.tar.gz

介绍

随着设计尺寸和复杂度的增加,数字设计验证的困难程度也在增加。为了面对这种挑战,验证工程师们要依靠多种验证工具和方法。对于那些设计大规模的、百万门级的设计,工程师们通常会使用一系列的形式化验证工具。然而,对于小规模的设计,设计工程师们通常发现了带有测试平台的硬件描述语言(HDL)的仿真器工作最佳。

测试平台技术已经成为验证高级语言(HLLHigh Level language)的标准验证方法。典型情况下,测试平台执行以下任务:

          例化在测试下的的设计(DUTDesign Under Test)。

          在模型中添加了测试矢量,对DUT进行仿真。

          把输出结果送到终端或者波形窗口来完成可视化的检查。

          随意对实际仿真结果和预期结果进行比较。

典型情况下,一般测试程序是用工业标准的VHDL或者Verilog HDL来编写的。测试平台调用功能设计,然后对其进行仿真。复杂的测试平台还执行其它功能——举个例子,它们包含一些逻辑,而这些逻辑可以决定设计中选择合适的设计激励,或者是比较实际仿真和预期的结果。

这篇笔记的剩下部分描述了一个完好的测试平台的结构,而且还提供了一个自测试平台的例子——它可以自动比较实际仿真结果和预期结果。

1显示了一个标准的HDL检验流程,基本上就按照上面所说的步骤。既然测试平台是用VHDLVerilog来编写的,那么测试平台验证流程就可以经由平台式工具和自动化工具。而且,既然VHDLVerilog都是标准的非专利的语言,那么用VHDLVerilog编写的验证程序组就可以很容易地在以后的设计中被重复利用。

1  利用测试平台的HDL验证流程

测试平台构造

测试平台可以用 VHDL Verilog 来编写。既然测试平台只能用于仿真工作,那么适用于逻辑综合的 RTL 级语言的语法规则就不会对它构成限制。所有的行为结构都能被使用。因此,测试平台程序就可以用多种形式来编写,使它更容易被维护。

1中列出了所有测试平台都包含的几个基本部分。正如上面提及的,测试平台一般还有其它的功能,例如在终端的可视化功能和内建的错误检查机制。

1:测试平台的基本部分

VHDL

Verilog

实体和结构体描述

模块化描述

信号描述

信号描述

高层次设计例化

高层次设计例化

添加激励信号

添加激励信号

下面的例子中将涉及几个常用的测试平台结构。    

产生时钟信号

用系统时钟信号来产生逻辑顺序的设计必须能够生成一个时钟脉冲。迭代的时钟信号能很容易地在VHDLVerilog的源程序代码中实现。下面就是产生时钟信号的VHDLVerilog的例子:

(代码略)

添加激励

为了获得测试平台的验证结果,必须DUT添加激励信号。同步激励模块被用来产生必要的激励。有两种方法可用:一种是绝对时间激励,另外一种则是相对时间激励。在第一种方法中激励信号的值相对于仿真时间零点是确定的。相比较而言,相对时间激励则提供了初始值,等下一个事件到来时才会再次触发激励。根据设计者的需要,两种方法可以结合在一个测试平台中使用。

2和表3提供了在VHDLVerilog的源程序代码中使用这两种方法的实例。

2:绝对时间激励示例

(代码略)

3:相对时间激励示例

(代码略)

 VHDLprocess模块和Veriloginitial模块在文件中是并发执行的。尽管如此,但是在每个(prcessinitial)模块中,事件的执行是有先后顺序的,正如它们的书写顺序那样。这就意味着在每一个并发模块中激励信号的顺序是从仿真时间零点开始的。应该使用多个模块,将复杂激励信号序列分解成可读性更强和更容易维护的代码。

显示结果

Verilog中通过$display$monitor关键字可以很容易地显示结果。虽然VHDL中没有与其等价的专用显示命令,但是它提供了std_textio包,此包允许输入输出(I/O)列队改向到终端窗口显示(见后续的自测试平台)。

(代码略)

关键字$display可以把小括号中引号内的文本(“…..”)输出到终端窗口。关键字$monitor的作用则不同,因为它的输出是靠信号事件来驱动的。在这个例子中变量$realtime(被用户定义为当前仿真时间)在信号列表中触发结果的显示。信号列表开始于变量$realtime,紧跟着的是其它信号变量的名字(clockresetload等等),也将显示这些信号的值。一个格式化说明符列表就是以关键字“%”为开始的,它是用来控制在完成显示功能时,每一个信号值在列表中显示的格式。格式化列表是有位置性的——每一个格式化说明符在列表中都依次和一个持续信号的名称相对应。例如,说明符%t设定了已显示的$realtime值的时间格式,第一个说明符%b规定了clock的值以二进制格式表示。Verilog还提供了另外一些格式化说明符,例如,%h表示十六进制,%d表示十进制,%o表示八进制(参见Verilog格式化说明符完整列表)。

其格式化显示的结果如图2

2  反映在终端的仿真结果

简单测试平台

简单测试平台例化了用户的设计,然后再向其添加激励信号。测试平台输出结果以图形的形式显示在仿真器的波形窗口或以文本形式发送到用户终端或带滚边的文本文件。

下面就是用一个简单的Verilog设计程序,其描述的是一个移位寄存器:

(代码略)

紧接着下面这个简单的测试平台例子对移位寄存器设计进行了例化。

(代码略)

在上面的测试平台中,例化设计,设置时钟,然后添加激励。所有的过程模块开始于仿真时间零点并且都是并发的。符号 # 规定了在下一个激励到来前应用的延迟。$stop命令符用来指示仿真器终止仿真工作(所有的测试平台都应该包含一个终止命令)。最后,$monitorASCII的格式把结果返回到屏幕或者一个带滚边的文本编辑器。

下面就是一个VHDL测试平台,它对上述的Verilog移位寄存器进行例化,还提供了激励信号。

(代码略)

除了它将输出结果返回到终端的命令之外,上述的VHDL测试平台在功能上就类似前面所述的那个Verilog测试平台。在VHDL程序中,std_textio包用来在终端显示信息,这将在下一章节讲述。

自动化验证

自动验证测试平台结果是被推荐的,尤其对于较大规模的设计。自动化减少了检查设计程序正确性所需的时间,而且将人为错误降低到最少。

几种常用的自动化测试平台验证方法:

1、    数据库比较
首先必须创建一个包含预期输出结果(黄金矢量文件)的数据库文件。接着,捕获仿真的输出结果并将它和黄金矢量文件中的参考矢量相比较。然而,因为没有提供从输出到输入文件的指针,所以这种方法的一个缺点就是很难由一个错误的输出结果追溯到错误源。

2、    波形图比较
波形图比较既能自动实现也可以人工实现。自动化方法则需要用一个测试平台比较器来比较黄金波形和测试平台输出波形。Xilinx公司的HDL Bencher工具可以用来实现自动的波形比较(详情请参见http://www.xilinx.com.cn/products/software/statecad/index.htm)。

3、    自测试平台

自测试平台并非是在仿真结束时才比较,而是在工作期间内就比较实际输出结果和预期输出结果。因为有用的错误跟踪信息可以内建于测试平台之中,以便看到错误出在哪里,而且纠正错误的时间也显著地减少了。更多的自测试平台信息将在下一部分中介绍。

自测试平台

自测试平台通过在其文件中放置一系列的预期矢量来实现自检。这些矢量在规定的运行时间间隔内和实际的仿真结果相比较。如果实际结果和预期的向匹配,则仿真成功。否则,测试平台会报告其差异。

由于可以在同一个时钟边沿或者几个时钟周期后,比较预期结果和实际的仿真结果,因而,在同步时钟设计中更容易使用自测试平台。对比方法当然也要依赖于不同的设计特性。例如,存储器输入输出系统的测试平台就应该在每个新数据写入或者从存储器向本地读出数据时对结果进行检查。类似的,如果某个设计中使用了大量的组合模块,那么就应该在确定预期输出结果时,就必须考虑它们的组合延迟。

在一个自测试平台中,通过在规定的时间间隔内比较预期输出结果和实际输出结果来完成自检。这种技术在中小规模的设计中很有效。然而,因为可能的输出组合随设计复杂度成指数形式增加,因此对于大规模设计来说,要编写一个自测试平台就非常困难,而且会花费大量的时间。

下面就是用VHDLVerilog书写的简单的自测试平台:

Verilog实例:

以下设计的例化和预期结果已经确定。在后面的代码中,将比较预期结果和实际仿真结果,而且会将结果返回到终端。如果结果没有失配之处,那么将会显示 “end of good simulation”信息。如果结果不匹配,那么会产生包含失配的预期和实际结果的错误报告。

(代码略)

这个简单的自测试平台设计可以适用于任何一种测试情况——当然重复使用时,预期输出结果的值和信号名必须要修改。如果不需要在每个时钟沿进行验证,也可以根据需要修改for循环。

如果仿真成功,将会在终端显示器上显示如下信息:

3  Verilog示例验证

VHDL实例:

VHDL程序中,它的矢量文件中包含了预期的结果。VHDLtextio包被用来从矢量文件中读出数据,并且显示出错信息。这是一个用VHDL编写的秒表设计的测试平台示例。

(代码略)

下面的矢量文件将和上面的测试平台一起使用。它包含了预期的仿真结果。

(代码略)

如果检查到错误,该错误就会显示在仿真器的提示符后面。图4显示了在MTI副本窗口的错误信息。

4  仿真器提示符形式的错误报告

测试平台的编写准则

本章节提供了测试平台的编写准则。正如通过规划一个电路设计可以获得更好的工作性能,那么规划一个测试平台布局也可以改善仿真验证结果。

1、    编写测试平台前了解仿真器。

虽然通常使用的仿真工具都符合HDL工业标准,但是这些标准并不处理一些重要的仿真问题。不同的仿真器有不同的特征、能力和性能特性,并产生不同的仿真结果。

       事件驱动和周期驱动的仿真

仿真器可以使用事件驱动和周期驱动两种仿真方法工作。事件驱动的仿真器是当输入、信号或者门的值发生变化时,才安排仿真事件。在事件驱动的仿真器中,延迟值与门电路及连线相联系以实现最佳的时序仿真。周期驱动的仿真器定位于同步设计。它们优化组合逻辑并在时钟周期内分析结果。这种特性使周期驱动的仿真器较事件驱动的仿真器拥有更快更多的存储效率。但是周期驱动的仿真器不允许详细的时序规定,精密度不高。想要了解更多的关于这两种方法的差别,请参见http://www.ednmag.com/ednmag/reg/1996/070496/14df4.htm.

       事件安排

事件驱动的仿真器矢量使用不同的算法安排仿真事件。因此,发生在同一仿真时间的事件或许被安排以不同的序列(在每个事件之间插入三角脉冲),该序列决定于仿真器所使用的算法。为了避免算法的依赖性和确保结果正确,一个事件驱动的测试平台应该指定一个明确的激励次序。

2、    避免使用无限循环

当一个事件被添加到一个事件驱动的仿真器上时,CPU和存储器的使用率就变高了,仿真的进程就会变慢。如果对测试平台没有其它特殊的要求,就不应该在设计中使用无限循环来产生激励。典型的情况下,时钟信号可以在一个无限循环(例如:Verilog中的forever循环)内部设定,但是别的信号事件就不能这样来确定。

3、    将激励分解到各个逻辑块

在一个测试平台内部,所有的initial模块(Verilog)和process模块(VHDL)都是并发运行的。如果互不相关的激励被分解到各个独立的模块,那么测试平台激励序列的应用和检查就变得更加容易。既然每一并发模块的运行都和仿真时间零点有关,那么激励信号通过独立模块就非常容易。独立激励模块的使用可以更容易地创建、维护和更新测试平台(参见高级测试平台技术,下面就是这种技术的示例)。

4、    避免显示无关紧要的数据

大型设计的测试平台或许包含了数以万计的事件和信号,而显示大量的数据会很大程度上降低仿真工作的速度。最好的方法就是相隔多个时钟周期才抽取一次相关的信号,这样可以保证有足够的仿真速度。

Xilinx仿真流程

1、    结构描述(VHDL

一个VHDL结构语句允许实体基于综合或仿真的目的,被连接到特定的结构上。在Xilinx核心发生器的VHDL功能仿真流程中,结构语句被用来把核心仿真模型绑定到设计中,否则仿真工作就不能正常进行。举一个使用结构语句的例子,看上面的自测试平台中的VHDL源代码。Xilinx核心发生器的设计中关于结构语句的详细信息可以在Modesim VHDL 仿真指导中找到,参见http://support.xilinx.com/support/techsup/tutorials31.htm#Modesim.

2、    基于仿真,初始化RAM模块

默认情况下,Xilinx VirtexRAM模块在所有的数据位置上被初始化为零值,也是从时间零值开始初始化的。为了完成一个post-NGDBuildpost-MAP或者Post-PAR(时序)的仿真工作,RAM模块初始值可以在用户的约束文件(UCF)中被设定,或者通过中断(INIT)特性在NGDBuild的输入设计文件中设定。为了进行综合前或者综合后(pre-NGDBuild)的功能仿真,结构语句必须向RAM模块提供初始值。接下来就是一个结构语句对RAM模块进行初始化的例子。

(代码略)

高级测试平台技术

1、    用任务和进程来分解激励模块

当要创建一个更大的测试平台时,激励信号就应该被分解,以便于代码清晰明了和容易修改。任务(Verilog)或者进程(VHDL)能被用来分解信号。在接下来的例子中,测试平台对一个SDRAM控制器设计添加激励。这个设计包含一些要反复使用的激励信号的模块,所以测试平台声明了独立的任务去分解激励信号,而这些任务文件待会将要在测试平台中被调用以完成独立的功能设计。

Verilog实例:

(代码略)

这些任务文件为设计打的功能性地址读写,数据读写,或者空操作设立了独立的单元。一但被设定,这些任务就可以如下所示在激励过程中被调用:

(代码略)

VHDL示例:

下面就是针对同一设计的VHDL测试平台,它被分解成若干独立的进程:

(代码略)

 将激励信号分解成若干独立的任务模块的方法使激励信号流通很容易实现,而且使代码的可读性更好。

2、    仿真过程中双向信号的控制

大多数设计使用的都是双向信号,他们在同一个测试平台中必须被区别对待。

 VHDL示例:

 下面就是一个双向信号的VHDL例子:

(代码略)

为了存取上面这个例子中的双向DATA信号,测试平台可以如下设置:

(代码略)

双向总线可以由测试平台控制,其值也可以通过信号data_top来存取。

Verilog示例:

下面就是一个推断的双向总线的Verilog例子:

(代码略)

Verilog测试平台可如下设置:

(代码略)

在上面这个测试平台中,信号data_in向双向DATA信号提供激励,信号data_outDATA信号的值进行读回操作。

3、    仿真过程中的存储器初始化问题

请参考上面的Xilinx仿真流程细节。

有用的语言结构

1、    Verilog

有用的Verilog语言结构,例如在前面的Verilog测试平台例子中讨论的$monitor$display$time。本章节将讨论其它一些在测试平台中用到的结构。

  force/release

force release语句能用来释放寄存器或连线上的程序赋值。这些结构一般被用来强制特定的设计行为。一旦一个强制性的值被释放,那么这个信号将维护它的原状态,直到一个新的值通过程序赋值传递进来。下面就是一个关于force release使用的示例:

(代码略)

  assign/deassign

assigndeassign语句类似于force release语句,但是assign/deassign在设计中只能适用于寄存器。它们通常被用来设置输入值。类似于force语句,assign语句覆盖通过程序语句传送的值。下面就是一个关于assigndeassign语句使用的示例:

(代码略)

  timescales

timescales指令是用来为测试平台确定单元时间节奏的。它也影响仿真器的精确度。这个指令的语法如下:‘timescale reference_time/precision

Reference_time是测量的单元时间。Precision决定着延迟程度的精确度,而且也为仿真过程设置单元时间节奏。下面就是一个使用‘timescale的例子:

(代码略)

如果在仿真中使用时序延迟值,仿真运行的精确度就比最小延迟(为了合并延迟)高。例如,如果在仿真程序库中使用9ps的延迟,那么仿真精度就必须是用1ps以适应9ps的延迟。

  读存储器初始化文件

Verilog提供了$readmemb$readmemh命令来读ASCII格式文件,以初始化存储器内容。这个命令也可以在仿真中用来初始化XilinxBlockRAM或者SelectRAM元件。其语法格式如下:

$readmemb (“”,design_instance);

MIF是由coregen生成的存储器初始化文件,其内容由用户来定义。

2、    VHDL

除了在前面讨论过的VHDL命令(assert/wait/report)外,下面还有一些有助于测试平台生成的命令:

  meminifile

VHDL提供了一个meminifile记录,它可用来向存储器模块输入数值。其语法格式如下:

FILE meminifile: TEXT IS IN “”;

MIF是由coregen生成的存储器初始化文件,其内容由用户确定。

编码风格指导

下面的编码风格指导有助于创建更容易理解和维持的代码:

1、    缩进式书写

缩进式代码通常具有更佳的可读性。推荐的缩进宽度是三或四个空格。五个以上空格就会显得右边的空白处过于狭小,而少于三个的又显得缩进不够。

2、    文件命名

通常源文件名都包含文件扩展名“.v”Verilog)和“.vhd”VHDL)。如果这些标准的扩展名被改变,一些编辑器和过滤器就不能识别源文件。

3、    信号命名

在同等条件下,推荐给用户的信号优先级较低。Verilog对条件很敏感,因此误置的大写符号会导致设计在综合和仿真时失败。而且兼容的信号名字的书写格式风格使信号很容易在源文件中被寻址。要使用简洁的具有描述性的信号名称。简洁的名字很容易书写,描述性的名字有助于提示信号功能。

4、    注释

可以自由地对测试平台代码进行注释。注释对继续使用代码和重新使用代码的后续使用者的价值是巨大的。此外,VerilogVHDL代码结构是含糊的,在重要的细节处加注释代码,可以增加源代码的清晰度和可重用性。

5、    设计结构

要为每一个模块或实体保留一个物理文件。独立的模块或实体对应单独的文件,使得该设计更容易维护。

要想获得其它信息,请参考硬件描述语言(HDL)参考书,很多书中都包含了广泛的代码指导。

参考FPGA设计可重用手册,参见http://www.Xinlinx.com/ipcenter/designreuse/xrfg.htm

结论

测试平台提供给工程师们一个便携的、可更新的验证流程。可交叉式语言仿真器的使用,使设计者可以使用他们的HDL语言来验证VerilogVHDL设计。高级的行为语言便于创建结构简单且源代码最少的的测试平台。设计工作也得益于测试平台的自检功能,它可以在仿真过程中自动验证设计结果的正误。

    Xilinx Foundation ISE v3.1被设计来提供流畅的完整的HDL设计流程。SynplicitySynplifySynopsis FPGA ExpressXilinxSynthesis TechnologyXST),连同Xilinx的基本软件一起可以更完美地综合代码程序。Foundation ISE可以和ModelsimXEPESE)整合起来仿真设计,XilinxHDL平台能自动生成测试平台,而且它的StateCad能生成状态机代码。关于其具体信息,参见http://www.Xilinx.com/xlnx/xil_prodcat_landingpage.jsp.


原文:《Writing Efficient Testbenches》

作者:Mujtaba Hamid

你可能感兴趣的:(测试,平台,语言,工作,终端,存储)