1、1 1第8章 仿真测试平台 第8章 仿真测试平台 8.1 VHDL仿真概述 8.2 几种常见的Test Bench模型 8.3 ASSERT语句 2 2第8章 仿真测试平台 8.1 VHDL仿真概述仿真概述当一个设计完成后,需要对设计的正确性进行测试和验证。前面的章节都是通过Quartus软件自带的图形仿真工具进行仿真验证的。但是,当需要测试的向量很多时,如果仅靠画波形的手工方式,会相当耗费精力。实际上,VHDL作为硬件描述语言,既可以用于电路系统的设计,也可以用于电路系统的测试和验证。这时就可以使用测试平台(TB,Test Bench)来完成测试。TB其实就是一个与所设计的电路系统程序相对应
2、的激励程序,用来为设计提供激励。当然,TB既可以采用VHDL语言,也可以采用Verilog语言来实现。总地来说,VHDL Test Bench就是一段用于验证设计功能正确性的VHDL代码。3 3第8章 仿真测试平台 一般来说,仿真器通常需要两个输入:设计块(即DUT,Design Unit Test)和激励块(即TB,Test Bench)。TB能够完成以下几点目标:(1)在测试中实例化DUT。(2)为DUT产生激励。(3)产生参考输出,并与DUT的输出进行比较。(4)自动提供测试通过或失败的提示。下面先以一个简单的实例来感性认识TB的使用。设计一个具有异步清零功能的十进制计数器,能够完成09
3、的计数,并能够产生进位信号。第6章中曾采用状态机的方式实现该例,本章采用IF语句实现,具体代码见例8-1。4 4第8章 仿真测试平台【例8-1】5 5第8章 仿真测试平台 6 6第8章 仿真测试平台 使用VHDL语言编写TB,由于测试设计只用来进行仿真,不受综合中仅能使用RTL语言子集这样的语法约束。因此它可以使用所有的行为级结构,即所有基本语法都是适用的(包括一些不能被综合的语法)。例8-1的十进制计数器所对应的TB见例8-2。7 7第8章 仿真测试平台【例8-2】8 8第8章 仿真测试平台 9 9第8章 仿真测试平台 从例8-2可总结出TB的基本结构:包含一个不需要定义输入/输出端口的空实
4、体和一个带有被测试元件声明、例化、激励产生的结构体。例8-2的L5L6是TB的实体定义,实体名为cnt_tb,它与外界没有任何接口,只和DUT通过信号进行连接,不需要定义输入/输出端口;L10L15是被测试元件DUT的声明;L17L20声明了与DUT相连接的信号;L23是元件例化;L24确定了时钟信号clk的周期为50 ns,每隔25 ns值取反,其初始值为“1”(由L17定义);L25L27确定了信号reset的取值,初始值为“0”,240 ns后取值为“1”,360ns后取值为“0”。DUT和TB的结构关系如图8-1所示,它们之间通过内部信号进行交互。10 10第8章 仿真测试平台 图8-
5、1 DUT和Test Bench结构示意 11 11第8章 仿真测试平台 从本章开始均采用不再自带图形仿真工具的Quartus11.1版本,直接调用Modelsim完成仿真的形式。本例需要将设计文件cnt.vhd和测试平台文件cnt_tb.vhd都保存于同一文件夹、同一工程内。设置设计文件cnt.vhd为顶层实体,然后选择菜单AssignmentsSettings,打开如图8-2所示对话框。在左边的Category栏中选择EDA Tool SettingsSimulation,即可打开仿真设置对话框。在其中选择Compile test bench,然后单击Test Benches按钮,打开图8
6、-3所示对话框。单击New,添加测试文件,弹出图8-4所示新建测试平台设置对话框。在Test bench name栏中输入测试12 12第8章 仿真测试平台 平台实体的名称,即cnt_tb,则Top level module in test bench栏也会出现相同的名称。在Use test bench to perform VHDL timing simulation前的方框内打勾,则Design instance name in test bench栏变亮,在其中填入例化名u1。Simulation period栏可根据需要选择是根据激励变化确定仿真时间还是自定义仿真时间,本例选择Run
7、simulation until all vector stimuli are used。在File name栏右侧单击“”按钮,添加测试平台文件cnt_tb.vhd。设置完成后,单击OK,会发现图8-3所示的窗口已经包含相关设置信息,如图8-5所示,单击OK返回。13 13第8章 仿真测试平台 图8-2 仿真设置对话框 14 14第8章 仿真测试平台 图8-3 添加测试文件 15 15第8章 仿真测试平台 图8-4 新建测试平台设置 16 16第8章 仿真测试平台 图8-5 已添加测试平台 17 17第8章 仿真测试平台 将顶层设计文件cnt.vhd进行全程编译,无误后选择菜单ToolsRu
8、n Simulation Tool,即可调用Modelsim进行RTL仿真或门级仿真。例8-1的十进制计数器仿真结果见图8-6和图8-7。可以看到,当reset=“1”时,输出立即清零。计数器能够实现09的计数,并产生进位信号cout。相关实验步骤或一些细节可参见EDA技术与VHDL设计实验指导一书的5.3节。该例给读者展示了一个简单使用TB的示范,由于例子比较简单,并不能突出当测试向量巨大时TB的优点。18 18第8章 仿真测试平台 图8-6 例8-1十进制计数器仿真结果(1)19 19第8章 仿真测试平台 图8-7 例8-1十进制计数器仿真结果(2)2020第8章 仿真测试平台 8.2 几
9、种常见的几种常见的Test Bench模型模型TB产生激励的方式,主要有以下三种:(1)激励直接在TB中产生。(2)由其他硬件或软件模型产生激励。(3)从单独的文件中读入激励。21 21第8章 仿真测试平台 很明显,例8-1所采用的形式是激励直接在TB中产生,该方式导致TB的可重用性比较差,只能针对该DUT。对于大型设计,目前比较流行的形式是利用Matlab产生激励文件,由TB读入该激励文件并将相应的激励信息传递给DUT,DUT产生的输出可以以文件的形式进行存储,或直接与Matlab产生的理想输出进行比较。下面以一个移位寄存器的例子来讲解几种不同形式的TB模型。2222第8章 仿真测试平台 8
10、.2.1 简单简单Test Bench1移位寄存器实例移位寄存器实例简单的TB模型中只有相应的DUT被例化,激励在TB中直接产生,其模型结构见图8-8。例8-2即为一个简单的TB模型。例8-3是移位寄存器DUT的VHDL代码,例8-4是其对应的简单TB。2323第8章 仿真测试平台 图8-8 简单TB模型 2424第8章 仿真测试平台【例8-3】2525第8章 仿真测试平台 2626第8章 仿真测试平台【例8-4】2727第8章 仿真测试平台 2828第8章 仿真测试平台 例8-4的仿真结果见图8-9和图8-10。从图8-9中可以明显观察到din变化的时间;图8-10显示在时钟clk的上升沿时
11、,数据依次左移,最右位补“1”的过程。2929第8章 仿真测试平台 图8-10 例8-4TB移位寄存器仿真结果(2)图8-9 例8-4TB移位寄存器仿真结果(1)3030第8章 仿真测试平台 2直接产生激励信号的各种方式直接产生激励信号的各种方式激励信号一般可分为两类:周期性的激励信号和时序变化的激励信号。周期性的激励信号最典型的代表就是时钟信号,而时序变化的激励信号包括复位信号reset、清零信号clear以及其他一些输入信号等。(1)周期性激励信号的产生。时钟信号是最典型的周期性信号,既可以使用并行信号赋值语句来产生,也可以在进程中产生;既可以产生占空比是50%的时钟信号,也可以产生占空比
12、任意的时钟信号。例8-5采用并行信号赋值语句中的条件信号赋值语句建立了一个占空比是75%的时钟信号clk。31 31第8章 仿真测试平台【例8-5】CONSTANT period:TIME:=50 ns;clk=0 AFTER 3*period/4 WHEN clk=1 ELSE 1 AFTER period/4 WHEN clk=0 ELSE 0;3232第8章 仿真测试平台 将例8-5改为在进程中实现,见例8-6。【例8-6】CONSTANT period:TIME:=50 ns;PROCESSBEGINclk=1;WAIT FOR 3*period/4;clk=0;WAIT FOR pe
13、riod/4;END PROCESS;3333第8章 仿真测试平台 仍然以移位寄存器为例,二者仿真结果相同,见图8-11,所不同的是时钟信号clk的占空比由50%变为75%。需要注意的是,如果采用例8-4所示并行信号赋值语句,则时钟信号的初值必须明确声明为“1”或者“0”。例8-7显示了一个周期性的信号,其周期为70 ns,波形见图8-12。一般来说,为实现信号的周期性变化,一般采用WAIT语句。3434第8章 仿真测试平台 图8-11 时钟信号占空比为75%3535第8章 仿真测试平台【例8-7】PROCESSBEGINs=0,1 AFTER 10ns,0 AFTER 20ns,1 AFTE
14、R 40ns,0 AFTER 45ns;WAIT FOR 70ns;END PROCESS;3636第8章 仿真测试平台(2)时序变化的激励信号的产生。时序变化的激励信号也可以通过并行赋值语句和进程两种方式产生。例8-8采用并行赋值语句显示了一个复位信号reset的变化,仿真开始时,其值为“0”;60ns后,其值变为“1”;再经过30ns后,其值变为“0”。例8-9在进程中定义复位信号reset,采用WAIT语句来实现。二者仿真结果完全一致,如图8-13所示。需要注意的是,例8-9中最后一句WAIT语句的作用,如果不加该条语句,仿真结果又会如何变化,请读者自行分析。【例8-8】reset=0,
15、1 AFTER 60ns,0 AFTER 90ns;3737第8章 仿真测试平台【例8-9】PROCESSBEGINreset=0;WAIT FOR 60ns;reset=1;WAIT FOR 30ns;reset=0;WAIT;-一直等待END PROCESS;3838第8章 仿真测试平台 图8-13 例8-8和例8-9复位信号reset仿真结果 3939第8章 仿真测试平台 例8-10显示了使用预定义属性DELAYED来产生一个延时一定时间的激励信号。信号s较信号reset延时50 ns,仿真波形见图8-14。【例8-10】s=resetDELAYED(50ns);还有一类比较特殊的激励信
16、号,称为动态激励信号,即输入的激励信号与DUT的行为相关,受其影响或由其决定。例8-11仍然以例8-3中的移位寄存器为DUT,置数信号load由移位结果控制,当移位结果全1时,load=“1”允许置数。4040第8章 仿真测试平台 图8-14 使用预定义属性产生延时一定时间的激励信号 41 41第8章 仿真测试平台【例8-11】4242第8章 仿真测试平台 4343第8章 仿真测试平台 例8-11的仿真结果见图8-15。可以看到,当q移位为“11111111”时,延时60 ns后,load由“0”变为“1”,允许置数,重新将“00110011”置入;q置数成功后,再次触发进程,此时由于q不等于
17、“11111111”,则执行L32,延时60 ns后,load由“1”变为“0”。4444第8章 仿真测试平台 图8-15 例8-11TB移位寄存器仿真结果 4545第8章 仿真测试平台 8.2.2 带有独立源的带有独立源的Test Bench将产生激励的模块作为一个文件,与DUT一起,在TB中进行例化,就称为带有独立源的TB,其结构模型见图8-16。该模型比较适合于具有复杂输入、简单输出的设计;激励信号由独立源Source产生。4646第8章 仿真测试平台 图8-16 带有独立源的TB模型 4747第8章 仿真测试平台 仍然以例8-3所设计的移位寄存器为DUT,在此,再设计一个计数器,其计数
18、输出作为移位寄存器的置数初值,即移位寄存器的激励由计数器产生,结构模型如图8-17所示。当置数信号load=“1”时,计数器count停止计数,将当前计数结果作为激励信号传递给移位寄存器;同时,由于load=“1”,移位寄存器允许置数,并将在下一个时钟上升沿到来时开始移位操作。计数器的VHDL代码见例8-12,TB见例8-13。4848第8章 仿真测试平台 图8-17 由计数器产生激励信号 4949第8章 仿真测试平台【例8-12】5050第8章 仿真测试平台 51 51第8章 仿真测试平台【例8-13】5252第8章 仿真测试平台 5353第8章 仿真测试平台 例8-13的仿真结果见图8-1
19、8和图8-19。其中,图8-19是图8-18当load第二次由“0”变“1”时的放大。可以看到,当第一次load=“1”后,计数器进行一次清零,重新开始计数,直到第二次load=“1”时,计数结果为“00001111”,将其传递给DUT作为置数初值,然后在时钟信号clk的上升沿进行移位。需要注意的是,如果采用带有独立源的TB模型,则在Quartus软件中设置TB时,需要添加产生激励的源文件,如图8-20所示。5454第8章 仿真测试平台 图8-19 例8-13TB仿真结果(2)图8-18 例8-13TB仿真结果(1)5555第8章 仿真测试平台 图8-20 添加产生激励的源文件 5656第8章
20、 仿真测试平台 当然,如果激励的变化与电路的行为相关,即8.2.1节中提到的动态激励信号,则带有独立源Source的动态激励模型框图如图8-21所示。如果输出端较为复杂,也需要由单独的模块(输出模块Sink)产生或者变化,则模型框图可变为如图8-22所示,该模型也可以由电路影响激励的变化。5757第8章 仿真测试平台 图8-21 电路响应影响激励变化 5858第8章 仿真测试平台 图8-22 带有独立源和输出模块的TB模型 5959第8章 仿真测试平台 8.2.3 使用使用TEXTIO的的Test Bench对于大型设计项目,输入、输出比较复杂,单靠输入波形或直接产生激励的形式难以验证结果的正
21、确性。这时,采用文本文件存储激励的形式更加方便,能够有效地提高效率。TEXTIO是VHDL标准库STD中的一个程序包,它提供了VHDL与磁盘文件直接访问的桥梁,可以利用它来读取存储在磁盘中的文件或者将仿真数据写入磁盘文件并存储。6060第8章 仿真测试平台 TEXTIO的使用是通过TB来进行的,即可以在TB中调用TEXTIO来进行仿真。常用的做法是,将所有的输入激励保存在文件中,仿真时,可以直接读取文件中的激励数据产生相应的波形或是将仿真结果存储到文件中;也可以将其他软件计算出来的结果保存在另一个文件中,自动将仿真结果与预先计算的结果进行比较,给出一定的信息来确定结果的正确与否。使用TEXTI
22、O的TB模型见图8-23。61 61第8章 仿真测试平台 图8-23 使用TEXTIO的TB模型 6262第8章 仿真测试平台 1TEXTIO概述概述TEXTIO是VHDL标准库STD中的一个程序包;当然,Synopsys公司加入IEEE库中的std_logic_textio程序包也定义了相关内容。所不同的是,定义在STD库中的TEXTIO程序包针对INTEGER、BIT、BIT_VECTOR、STRING、TIME等定义在VHDL标准程序包STANDARD中的预定义数据类型;而std_logic_textio程序包针对定义在IEEE库中的STD_ULOGIC、STD_LOGIC以及它们的矢量
23、类型的预定义数据类型。6363第8章 仿真测试平台 TEXTIO提供了用于访问文件的过程,具有重载性,即过程名相同,但参数类型或个数不同,详细定义请参见附录A。PROCEDURE READLINE(指定文件,行变量);表示从指定文件读取一行数据到行变量中。PROCEDURE READ(行变量,数据变量,GOOD);表示从指定行读取相应数据类型的数据。GOOD为可选项,返回BOOLEAN类型,用于表明过程是否正确执行,正确则返回TURE。PROCEDURE WRITELINE(指定文件,行变量);表示向指定文件写入行变量所包含的数据。6464第8章 仿真测试平台 PROCEDURE WRITE(
24、行变量,数据变量,写入方式,位宽);表示将数据写入行变量;写入方式表示写在行变量的左边还是右边,其值只能是left或者right;位宽表示写入数据时所占的宽度。在TEXTIO中定义了几种数据类型,包括:数据类型LINE、TEXT、SIDE和子类型WIDTH。(1)数据类型LINE。其源代码定义如下:TYPE LINE IS ACCESS STRING;6565第8章 仿真测试平台 定义LINE 为存取类型的变量,它表示该变量是指向字符串的指针,是TEXTIO 中所有操作的基本单元。读文件时,先按行(LINE)读出一行数据,再对LINE 操作来读取各种不同数据类型的数据;写文件时,先将各种数据类
25、型组合成LINE,再将LINE 写入文件。需要注意的是,只有变量才可以是存取类型,而信号则不能是存取类型。例8-14声明了两个变量line_in和line_out,其类型都是LINE。【例8-14】VARIABLE line_in :LINE;VARIABLE line_out :LINE;6666第8章 仿真测试平台(2)数据类型TEXT。其源代码定义如下:TYPE TEXT IS FILE OF STRING;定义TEXT是文件类型,长度可变。例8-15和例8-16都定义了两个文件类型的变量file_input和file_output,用于访问对应的文件datain.txt和dataout
26、.txt。不同的是,例8-15采用的是VHDL87标准,而例8-16采用的是VHDL93标准,两个标准在文件使用方面有较大的差别,使用时应注意选择相应的标准。6767第8章 仿真测试平台【例8-15】FILE file_input:TEXT IS IN“datain.txt”;FILE file_output:TEXT IS OUT“dataout.txt”;【例8-16】FILE file_input :TEXT OPEN READ_MODE IS“datain.txt”;FILE file_output :TEXT OPEN WRITE_MODE IS dataout.txt;6868第8
27、章 仿真测试平台(3)数据类型SIDE。其源代码定义如下:TYPE SIDE IS(right,left);定义了SIDE为一种枚举类型,取值只有right和left两种,分别表示将数据从左和从右写入行变量中。例8-17显示了将output_data从左边写入LINE变量line_out,位宽为8。【例8-17】WRITE(line_out,output_data,left,8);(4)子类型WIDTH。其源代码定义如下:SUBTYPE WIDTH IS NATURAL;数据类型WIDTH用于指定写入LINE变量的位宽。6969第8章 仿真测试平台 2移位寄存器实例移位寄存器实例这里仍然以例8
28、-3移位寄存器的例子,采用TEXTIO的方法来实现测试验证,其原理框图如图8-24所示。文件datain.txt提供移位寄存器的置数初值din,在传递给DUT之前,进行数据类型的变化,由BIT_VECTOR变化为符合DUT中声明的数据类型STD_LOGIC_VECTOR。再按照时钟节拍,将DUT的输出数据写入到输出文件dataout.txt。当然,在写入前,也需要进行数据类型的变换。7070第8章 仿真测试平台 图8-24 使用TEXTIO的移位寄存器TB原理框图 71 71第8章 仿真测试平台 首先将存储输入激励的datain.txt文件保存于移位寄存器工程同一文件夹下,datain.txt
29、文件内有三个激励输入,分别是:“00001101”、“00000101”和“00001001”,见图8-25。对于大型设计,更好的方式是采用C语言或者Matlab产生激励。例8-18读取datain.txt中的激励,并将其传递给信号din,作为置数初值。7272第8章 仿真测试平台 图8-25 提供激励的文件datain.txt 7373第8章 仿真测试平台【例8-18】7474第8章 仿真测试平台 7575第8章 仿真测试平台 7676第8章 仿真测试平台 7777第8章 仿真测试平台 例8-18中L5声明了STD库中的TEXTIO程序包。L28L35确定了4次有效的置数信号(load=“1
30、”)。进程p0从datain.txt读出激励,并传递给din,使用了断言语句ASSERT,当文件读完后,会出现警告信息。进程p1将DUT的输出经过转化后写入文件dataout.txt。需要注意的是,L55声明了文件类型变量file_out,可以访问的对应保存输出结果的文件是dataout.txt,这里必须要写明文件路径和文件名,且在工程同一文件夹内保存有空dataout.txt文件。7878第8章 仿真测试平台 例8-18的仿真结果如图8-26和图8-27所示。可以看到,“00001101”、“00000101”、“00001001”分别被作为初值置入,然后在时钟信号clk的上升沿开始进行移位
31、操作。在1200 ns时,由于文件数据已经读完,执行断言语句L47L49,在Modelsim的Transcript窗口显示文件结束的警告信息,如图8-28所示。例8-18也可打开IEEE库中的std_logic_textio程序包,直接对数据类型STD_LOGIC进行操作,避免数据类型的转换,请读者自行完成相应的代码和仿真测试。7979第8章 仿真测试平台 图8-27 例8-18TB仿真结果(2)图8-26 例8-18TB仿真结果(1)8080第8章 仿真测试平台 图8-28 文件结束的警告信息 81 81第8章 仿真测试平台 在工程保存目录下找到文件dataout.txt,打开文件即可观察输
32、出结果,如图8-29所示。如果改变datain.txt中的激励数据,如将“00001101”改为“00000111”,则仿真结果也会发生改变,见图8-30。输出结果文件dataout.txt也会发生相应的改变,如图8-31所示。8282第8章 仿真测试平台 图8-29 文件dataout.txt仿真输出结果 8383第8章 仿真测试平台 图8-30 改变激励后文件dataout.txt仿真输出结果 8484第8章 仿真测试平台 图8-31 改变激励数据后的仿真结果 8585第8章 仿真测试平台 当然,对于大型的设计项目,自动化的测试结果验证将更加高效,它减少了检查设计正确性所需的时间,并将人为
33、错误减少到最小。可以采用其他软件编程生成理想化的输出结果(又称为“黄金向量”文件Golden Design),将其保存在一个文件中;然后,将仿真输出结果自动与“黄金向量”文件中的数据进行比较。例8-19显示了如何将仿真结果与保存在result.txt文件中的理想结果进行比较,并返回比较信息。如果比较数据不同,则会在Modelsim的Transcript窗口中出现警告信息,如图8-32所示,提示在25 ns时两个数据出现不一致。8686第8章 仿真测试平台【例8-19】8787第8章 仿真测试平台 8888第8章 仿真测试平台 8989第8章 仿真测试平台 9090第8章 仿真测试平台 图8-3
34、2 提示数据不一致的警告信息 91 91第8章 仿真测试平台 8.3 ASSERT语句语句ASSERT语句(断言语句)主要用于代码的调试、仿真,属于不可综合的语句。软件在综合时断言语句将被忽略或报警,它不会产生硬件电路。当仿真发生错误时,断言语句可以报告信息,其语句格式如下:ASSERT 条件表达式REPORT 出错信息SEVERITY 错误等级;9292第8章 仿真测试平台 关键词ASSERT后的条件表达式是布尔类型的表达式,当条件表达式取值为假时,表示运行出错,于是执行REPORT子句报告错误信息,并由SEVERITY子句指定错误级别。断言语句对错误判断给出的错误信息和等级,都是设计者预先
35、在代码编写时决定的,VHDL并不自动生成这些错误信息。断言语句的使用要注意以下几点:(1)条件表达式必须由设计者给出,没有默认格式。(2)出错信息必须是由双引号括起来的字符。(3)错误等级必须是预定义的四种等级之一,包括:Note(通报)、Warning(警告)、Error(错误)以及Failure(失败)。如果错误等级是Failure,则会在发生错误时结束编译。9393第8章 仿真测试平台 例8-20是一个使用VHDL语言描述的基本RS触发器。由基本RS触发器的功能可知,当输入信号r和s取值均为“1”时,输出q和qb也均为“1”,破坏了触发器正常工作时的互补输出关系,导致触发器失效。因此,从
36、电路正常工作的角度来考虑,这种情况是不允许出现的。例8-21是基本RS触发器的测试平台,其中使用ASSERT语句检测RS触发器的r和s两个输入端不能同时为“1”。9494第8章 仿真测试平台【例8-20】9595第8章 仿真测试平台【例8-21】9696第8章 仿真测试平台 9797第8章 仿真测试平台 从例8-21的TB中r和s的取值设置可以发现,在时间50 ns到100 ns的区间内,r和s的取值都是“1”。图8-33是基本RS触发器的仿真结果,图8-34是在Modelsim的Transcript窗口中报告的错误信息,与预先设定一致。如果将例8-21中的错误等级改为“Failure”,则仿真结果如图8-35所示,可以看到从50 ns处就结束了。9898第8章 仿真测试平台 图8-34 基本RS触发器错误信息报告 图8-33 基本RS触发器仿真结果 9999第8章 仿真测试平台 图8-35 错误等级“Failure”的仿真结果
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。