数字系统设计:Testbench设计_第1页
数字系统设计:Testbench设计_第2页
数字系统设计:Testbench设计_第3页
数字系统设计:Testbench设计_第4页
数字系统设计:Testbench设计_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Testbench设计 本章目录Testbench设计Testbench简介Testbench基本结构激励信号的产生时钟信号复位信号复杂周期性信号两相关性信号一般激励信号典型错误 Testbench综合应用实例高级Testbench设计高级Testbench概述文件的读写VCD数据库文件断言语句(Assert)高级Testbench实例Testbench简介Testbench基本结构激励信号的产生Testbench实例Testbench设计初步数字系统设计方法基于中小规模集成电路的设计方法电路运行速度快,实时性好。然而过程过于繁琐复杂,不适用于大型的数字系统设计;基于MCU的设计方法较为直观人

2、性化,然而MCU的性能难以满足某些特定场合(如高速情况下)的应用需求;基于PLD的EDA设计则是一种全新的设计思想与设计理念。兼具了中小规模集成电路设计与MCU设计方式的优点;在顶层设计上采用多种输入描述方法,具有MCU方式设计的灵活性、直观性;底层硬件逻辑设计由EDA工具自动完成保证了设计效率;功能开发上是软件实现的,物理机制为纯硬件电路;纯硬件的物理机制使其具有更强的抗干扰能力、更快的运行速度。真实世界VHDL SIMULATOR 数字系统设计Test Bench . ?!VHDL test benchTestbench简介编写Testbench目的 对使用硬件描述语言(HDL)设计的电路

3、进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符。 编写Testbench进行测试的过程 1)实例化需要测试的设计(DUT,Design Under Test); 2)产生模拟激励(波形);3)将产生的激励加入到被测试模块并观察其输出响应;4)将输出响应与期望进行比较,从而判断设计的正确性。输出响应可以以波形方式显示或存储测试结果到文件中Testbench简介Testbench基本结构激励信号的产生Testbench实例Testbench设计初步激励信号待测试实例波形、数据输入输出Testbench是VHDL程序之一,它遵循VHDL基本程序的框架,也具有自身的独特性Testben

4、ch的基本结构结构体描述库的调用程序包的调用空实体被测试元件的声明Testbench的基本结构LIBRARY IEEE;USE IEEE.std_logic_1164.all;ENTITY TB ISEND ENTITY;ARCHITECTURE behav OF TB ISCOMPONENT Entity_Under_Test PORT() -端口列表END COMPONENTBEGIN-局部信号的声明DUT: Entity_Under_Test port map() Gen1:PROCESS () END PROCESS; Gen2:PROCESS () END PROCESS;END b

5、ehav;局部信号声明例化被测试元件产生激励信号Testbench简介Testbench基本结构激励信号的产生Testbench实例Testbench设计初步时钟信号的产生复位信号的产生复杂周期性信号的产生使用DELAYED属性产生两相关性信号一般激励信号的产生典型错误激励信号的产生激励信号的产生时钟信号的产生 时钟信号是同步设计中最重要的信号之一。是属于周期性出现的信号。时钟信号分类:(1)对称时钟信号(占空比为50%)(2)非对称时钟信号(占空比不是50% )Testbench中产生时钟信号方式:(1)并行的信号赋值语句(2)单独process进程clk1、clk2和clk3有何区别?试用

6、并行赋值语句产生上述时钟信号激励信号的产生时钟信号的产生 使用并行的信号赋值语句产生时钟信号激励信号的产生时钟信号的产生 使用并行的信号赋值语句产生时钟信号signal clk1: std_logic := 0;signal clk2: std_logic;signal clk3:std_logic;constant clk_period : time := 40 ns;clk1 = not clk1 after clk_period/2;clk2 = 0 after clk_period/4 when clk2=1 else 1 after 3*clk_period/4 when clk2=

7、0 else 1; -此值实际上是定义clk2的起始值clk3 = 0 after clk_period/4 when clk3=1 else 1 after 3*clk_period/4 when clk3=0 else 0;clk1为对称时钟信号,其初始值在信号定义时赋值;clk2和clk3为非对称时钟信号,其初值在并行赋值语句中给予激励信号的产生时钟信号的产生 使用process进程产生时钟信号clk1和clk2有何区别?试用process进程产生上述时钟信号激励信号的产生时钟信号的产生 使用process进程产生时钟信号signal clk1: std_logic;signal clk

8、2: std_logic; clk1_gen:process constant clk_period : time := 40 ns; begin clk1 = 1; wait for clk_period/2; clk1 = 0; wait for clk_period/2; end process;clk2_gen:process constant clk_period : time := 20 ns; begin clk2 = 0; wait for clk_period/4; clk2 = 1; wait for 3*clk_period/4; end process;常量只在该进程中

9、起作用常量只在该进程中起作用激励信号的产生 数字系统往往需要复位信号对系统进行复位,以便初始化系统。Testbench中产生复位信号方式:(1)并行赋值语句(2)在进程中设定复位信号的产生 激励信号的产生复位信号的产生 试分别用并行赋值语句、process进程产生上图中的reset1和reset2信号激励信号的产生复位信号的产生 signal reset1: std_logic;signal reset2: std_logic;reset1 = 0,1 after 20 ns, 0 after 40 ns;reset2_gen:processbegin reset2 = 0; wait for

10、 20 ns; reset2 = 1; wait for 40 ns; reset2 = 0; wait;end process;激励信号的产生复杂周期性信号的产生 观察period1和period2信号的周期是多少?试用进程的方法产生该信号激励信号的产生复杂周期性信号的产生 signal period1,period2: std_logic := 0;TB:processbegin period1 =1 after 5 ns, 0 after 10 ns, 1 after 20 ns, 0 after 25 ns; period2 =1 after 10 ns,0 after 20 ns,

11、1 after 25 ns, 0 after 30 ns; wait for 35 ns;end process;方法一激励信号的产生复杂周期性信号的产生 方法二signal period1,period2: std_logic;period1_gen:processbegin period1 =0;wait for 5 ns; period1 =1;wait for 5 ns; period1 =0;wait for 10 ns; period1 =1;wait for 5 ns; period1 =0;wait for 10 ns;end process;period2_gen:proce

12、ssbegin period2 =0;wait for 10 ns; period2 =1;wait for 10 ns; period2 =0;wait for 5 ns; period2 =1;wait for 5 ns; period2 =0;wait for 5 ns;end process;激励信号的产生使用DELAYED属性产生两相关性信号 period1和period2信号具有怎样的相关性?试用delayed属性产生上述信号delayed是VHDL的预定义属性,使用它可以产生两个相关性的信号激励信号的产生使用DELAYED属性产生两相关性信号 delayed是VHDL的预定义属性

13、,使用它可以产生两个相关性的信号signal period1,period2: std_logic; period1 = 1 after 30 ns when period1=0 else 0 after 20 ns when period1=1 else 0; period2 = period1delayed(10 ns);激励信号的产生一般的激励信号 一般的激励信号通常在process进程中定义,而在process进程中一般需要使用wait语句比较test_vector1和test_vector2的异同,并用process进程实现之激励信号的产生一般的激励信号 一般的激励信号通常在proc

14、ess进程中定义,而在process进程中一般需要使用wait语句signal test_vector1: std_logic_vector (1 downto 0);signal test_vector2: std_logic_vector (1 downto 0);TB1:processbegin test_vector1 = 01; wait for 10 ns; test_vector1 = 10; wait for 20 ns;end process;TB2:processbegin test_vector2 = 01; wait for 10 ns; test_vector2 =

15、10; wait;end process;激励信号的产生一般的激励信号 产生test_vector中所有可能的输入情况signal test_vector3: std_logic_vector (3 downto 0) := 0000;signal test_vector4: std_logic_vector (3 downto 0) := 0000;signal test_vector5: std_logic_vector (3 downto 0);signal test_vector6: std_logic_vector (3 downto 0);TB3:processbegin wait

16、 for 10 ns; test_vector3 = test_vector3 + 1;end process;TB4:processbegin wait for 10 ns; test_vector4 = test_vector4 + 1; wait for 10 ns;end process;TB5:processbegin test_vector5 = 0000; wait for 10 ns; test_vector5 = test_vector5 + 1;end process;TB6:processbegin test_vector6 = 0000; wait for 10 ns;

17、 test_vector6 = test_vector6 + 1; wait for 10 ns;end process;比较四个process的异同,试画出各个test_vector波形激励信号的产生一般的激励信号 产生test_vector中所有可能的输入情况TB3:processbegin wait for 10 ns; test_vector3 = test_vector3 + 1;end process;TB4:processbegin wait for 10 ns; test_vector4 = test_vector4 + 1; wait for 10 ns;end proces

18、s;激励信号的产生一般的激励信号 产生test_vector中所有可能的输入情况TB5:processbegin test_vector5 = 0000; wait for 10 ns; test_vector5 = test_vector5 + 1;end process;TB6:processbegin test_vector6 = 0000; wait for 10 ns; test_vector6 = test_vector6 + 1; wait for 10 ns;end process;激励信号的产生一般的激励信号 产生两个test_vector中所有可能的输入情况如上图所示,2b

19、it的test_ab和test_sel是否覆盖了所有的输入情况?试用VHDL产生上述信号激励信号的产生一般的激励信号 产生两个test_vector中所有可能的输入情况double_loop: process begin test_ab =00; test_sel =00; for I in 0 to 3 loop for J in 0 to 3 loop wait for 10 ns; test_ab = test_ab + 1; end loop; test_sel = test_sel + 1; end loop; end process; signal test_ab: std_log

20、ic_vector (1 downto 0);signal test_sel: std_logic_vector (1 downto 0);在testbench中可以用for循环(因为testbench不需综合),但在设计中不推荐使用for循环激励信号的产生典型错误 signal test_vector : STD_LOGIC_VECTOR(2 downto 0); signal reset : STD_LOGIC;gen1:process begin reset = 1; wait for 100 ns; reset = 0; test_vector = 000; wait; end pro

21、cess; gen2:process begin wait for 200 ns; test_vector = 001; wait for 200 ns; test_vector = 011; end process;该程序是否有错?假如没错,请分析test_vector和reset的时序激励信号的产生典型错误 signal test_vector : STD_LOGIC_VECTOR(2 downto 0); signal reset : STD_LOGIC;gen1:process begin reset = 1; wait for 100 ns; reset = 0; test_vect

22、or = 000; wait; end process; gen2:process begin wait for 200 ns; test_vector = 001; wait for 200 ns; test_vector = 011; end process;同一个信号在两个进程中进行赋值,在某些时间段内发生了冲突,所以会出现不定状态同一信号不推荐在不同的进程中赋值Testbench简介Testbench基本结构激励信号的产生Testbench实例Testbench设计初步Testbench实例组合逻辑电路:2位全加器的设计与验证时序逻辑电路:六进制计数器的设计与验证Testbench实例

23、2位全加器的设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity adder_2 isport(cin:in std_logic; a,b:in std_logic_vector(1 downto 0); s:out std_logic_vector(1 downto 0); cout:out std_logic);end adder_2;architecture beh of adder_2 is signal sint:std_logic_vector(2 downto 0);si

24、gnal aa,bb:std_logic_vector(2 downto 0);beginaa=0 & a(1 downto 0);bb=0 & b(1 downto 0);sint=aa+bb+cin;s(1 downto 0)=sint(1 downto 0);coutcin_t,a=a_t,b=b_t,s=s_t,cout=cout_t);库、程序包的调用Testbench实体(空实体)定义Testbench是VHDL程序之一, 它遵循VHDL基本程序的框架,也具有自身的独特性被测元件的声明注意:此处并非adder_2_tb被测元件的例化Testbench实例2位全加器的验证(续)TB:

25、processbegina_t=01;b_t=00;wait for 10 ns;b_t=01;wait for 10 ns;b_t=10;wait for 10 ns;b_t=11;wait for 10 ns;a_t=10;b_t=00;wait for 10 ns;b_t=01;wait for 10 ns;b_t=10;wait for 10 ns;b_t=11;wait for 10 ns;a_t=11;b_t=00;wait for 10 ns;b_t=01;wait for 10 ns;b_t=10;wait for 10 ns;b_t=11;wait for 10 ns;a_t

26、=00;b_t=00;cin_t=1;wait for 10 ns;b_t=01;wait for 10 ns;b_t=10;wait for 10 ns;b_t=11;wait for 10 ns;对此加法器进行全面的测试验证的方法一方法一当加法器位数增加时,要覆盖所有可能的输入,此方法需要罗列的情况倍数增加,代码书写将会非常麻烦Testbench实例2位全加器的验证(续)a_t=01;b_t=00;wait for 10 ns;b_t=01;wait for 10 ns;b_t=10;wait for 10 ns;b_t=11;wait for 10 ns;a_t=10;b_t=00;wa

27、it for 10 ns;b_t=01;wait for 10 ns;b_t=10;wait for 10 ns;b_t=11;wait for 10 ns;a_t=11;b_t=00;wait for 10 ns;b_t=01;wait for 10 ns;b_t=10;wait for 10 ns;b_t=11;wait for 10 ns;a_t=00;b_t=00;cin_t=0;wait for 10 ns;b_t=01;wait for 10 ns;b_t=10;wait for 10 ns;b_t=11;wait for 10 ns;end process;end tb;对此加法

28、器进行全面的测试验证的方法一方法一Testbench实例2位全加器的验证(续)TB:process begin a_t =00; b_t =00; cin_t =0; for K in 0 to 1 loop for I in 0 to 3 loop for J in 0 to 3 loop wait for 10 ns; a_t = a_t + 1; end loop; b_t = b_t + 1; end loop; cin_t = not cin_t; end loop; end process;end tb;对此加法器进行全面的测试验证的方法二方法二Testbench实例2位全加器的验

29、证(续)仿真结果通过对波形进行分析可知,本设计功能正确Testbench实例六进制计数器的设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt6 is port (clr,en,clk:in std_logic; q:out std_logic_vector(2 downto 0) ); end entity;architecture rtl of cnt6 is signal tmp:std_logic_vector(2 downto 0); begin process(cl

30、k) begin if(clkevent and clk=1) then if(clr=0)then tmp=000; elsif(en=1) then if(tmp=101)then tmp=000; else tmp=unsigned(tmp)+1; end if; end if; end if; qclk,en=en,clr=clr,q=q); 库、程序包的调用Testbench实体(空实体)定义被测元件的声明被测元件的例化Testbench实例六进制计数器的验证(续)clk_gen:process begin wait for clk_period/2; clk=1; wait for

31、 clk_period/2; clk=0; end process;clr_gen:process begin clr=0; wait for 15 ns; clr=1; wait; end process;en_gen:process begin en=0; wait for 25 ns; en=1; wait; end process; end rtl; 仿真结果Testbench设计进阶高级Testbench概述文件的读写VCD数据库文件断言语句(Assert)高级Testbench实例Testbench设计进阶高级Testbench概述文件的读写VCD数据库文件断言语句(Assert)

32、高级Testbench实例高级Testbench概述简单Testbench高级Testbench简单Testbench概述 在前一节内容中,我们所看到的验证方法都是比较简单的,这里称为简单Testbench,一般结构如下图所示。激励信号待测试实例波形、数据输入输出 所输出的结果以波形或者数据显示,需要人工分析其结果的正确性,如果被测信号数量较多且时序复杂,工作量会非常巨大。高级Testbench概述激励信号待测试实例输入输出高级Testbench是在简单Testbench基础上改进过来的,能够自动读入测试矢量文件、完成输出值和期望值的比较等功能。如下图所示输出值和期望值比较测试矢量文件测试结果

33、(Yes/No)更智能化,减少人工分析的繁琐!载入期望值Testbench设计进阶高级Testbench概述文件的读写VCD数据库文件断言语句(Assert)高级Testbench实例文件的读写文件定义TEXTIO介绍TEXTIO数据类型及过程代码示例仿真时,VHDL允许设计人员从文件加载数据或将数据存储到文件中。比如用户定义的测试矢量可以保存在文件中,然后在仿真时从文件中读取这些测试矢量。另外,仿真的结果也可以保存在文件中。VHDL标准中的文件I/O主要是由TEXTIO程序包提供,用于仿真,综合工具不能综合如果想在仿真时候进行文件操作,必须引入标准库STD中的TEXTIO定义的程序包,该程序

34、包中包含了文件输入输出所需的基本子程序。“USE STD.TEXTIO.ALL”文件的读写TEXTIO 是VHDL 标准库STD 中的一个程序包 (Package)。在该包中定义了三个类型:LINE 类型、TEXT类型以及SIDE 类型。另外,还有一个子类型(subtype)WIDTH。此外, 在该程序包中还定义了一些访问文件所必须的过程(Procedure)。TEXTIO介绍TEXTIO数据类型LINETEXTSIDEWIDTH进程READLINEWRITELINEREADWRITE数据类型LINETEXTIO数据类型LINE为存取类型的变量,它表示该变量是指向字符串的指针,它是TEXTIO

35、 中所有操作的基本单元。读文件时,先按行(LINE)读出一行数据,再用LINE 操作来读取各种数据类型的数据;写文件时, 先将各种的数据类型组合成LINE,再将LINE 写入文件。在用户使用时, 必须注意只有变量才可以是存取类型, 而信号则不能是存取类型。例如, 我们可以定义variable DLine : LINE;但不能定义成signal DLine : LINE;数据类型TEXTTEXT 为ASCII 文件类型。 定义成为TEXT 类型的文件是长度可变的ASCII 文件。需要注意的是VHDL87 和VHDL93 在使用文件方面有较大的差异,在编译时注意选中对应的标准。TEXTIO数据类型

36、数据类型SIDESIDE 只能有两种状态,即right 和left,分别表示将数据从左边还是右边写入行变量。该类型主要是在TEXTIO 程序包包含的过程中使用。数据类型WIDTHWIDTH 为自然数的子类型。所谓子类型表示其取值范围是父类型范围的子集。TEXTIO数据类型TEXTIO文件定义文件可以通过它所存储的内容来进行区分type text 是字符串文件;type IntegerFileType 是整数型文件;VHDL 1987中的文件定义file infile: text is in “inputdata.txt”;file outfile: text is out “outputdat

37、a.txt”;VHDL 1993中的文件定义file infile: text open read_mode is “inputdata.txt”;file outfile: text open write_mode is “outputdata.txt”;TEXTIO文件定义二进制I/O文件(VHDL 1993)支持read(f, value), write(f, value)和 endfile(f)操作VHDL 93支持FILE_OPEN()和FILE_CLOSE ()操作直接和间接的文件打开操作;USE STD.TEXTIO.ALL;ENTITY io93 ISEND ENTITY io

38、93;ARCHITECTURE behavioral OF io93 ISBEGIN PROCESS IS TYPE INTEGERFILETYPE IS FILE OF INTEGER; FILE dataout:INTEGERFILETYPE; VARIABLE count:INTEGER:=0; VARIABLE fstatus:FILE_OPEN_STATUS; BEGIN FILE_OPEN(fstatus,dataout,myfile.txt,WRITE_MODE); FOR j IN 1 TO 8 LOOP WRITE(dataout,count); count:=count+2

39、; END LOOP; WAIT; END PROCESS; END ARCHITECTURE behavioral;TEXTIO文件定义二进制I/O文件(VHDL 1987)支持read(f,value), write(f, value)和 endfile(f)操作直接和间接的文件打开操作;USE STD.TEXTIO.ALL;ENTITY io87 ISEND ENTITY io87;ARCHITECTURE behavioral OF io87 ISBEGIN PROCESS TYPE INTEGERFILETYPE IS FILE OF INTEGER; FILE dataout:IN

40、TEGERFILETYPE IS OUT output.txt; VARIABLE check:INTEGER:=0; BEGIN FOR count IN 1 TO 10 LOOP check:=check+1; WRITE(dataout,check); END LOOP; WAIT; END PROCESS; END behavioral;TEXTIO 提供了基本的用于访问文本文件的过程。类似于 C,VHDL 提供了重载功能, 即完成相近功能的不同过程可以有相同的过程名, 但其参数列表不同, 或参数类型不同或参数个数不同。TEXTIO 提供的基本过程有:procedure READLIN

41、E(文件变量;行变量); -用于从指定文件读取一行数据到行变量中。procedure WRITELINE(文件变量;行变量); -用于向指定文件写入行变量所包含的数据。procedure READ(); -可重载,用于从行变量中读取相应数据类型的数据。procedure WRITE(); -可重载,用于将数据写入行变量。TEXTIO读写过程TEXTIO使用例程在ModelSim的输出结果如下:打开文件写入信息USE STD.TEXTIO.ALL;ENTITY formatted_io ISEND formatted_io;ARCHITECTURE behavioral OF formatted

42、_io ISBEGIN PROCESS FILE outfile:TEXT; VARIABLE fstatus:FILE_OPEN_STATUS; VARIABLE count:INTEGER:=5; VARIABLE value:BIT_VECTOR(3 DOWNTO 0):=X6; VARIABLE buf:LINE; BEGIN FILE_OPEN(fstatus,outfile,myfile.txt,write_mode); WRITE(buf,STRING(This is an example of formatted I/O); WRITELINE(outfile,buf); WR

43、ITE(buf,STRING(The First Parameter is =); WRITE(buf,count); WRITE(buf, ); WRITE(buf,STRING(The Second Parameter is =); WRITE(buf,value); WRITELINE(outfile,buf); WRITE(buf,STRING(.and so on); WRITELINE(outfile,buf); FILE_CLOSE(outfile); WAIT; END PROCESS; END ARCHITECTURE behavioral;Testbench设计进阶高级Te

44、stbench概述文件的读写VCD数据库文件断言语句(Assert)高级Testbench实例VCD数据库文件VCD数据库用VCD文件记录仿真数据操作提示VCD文件样式利用ModelSim查看VCD文件VCD数据库VCD数据库是仿真过程中数据信号变化的记录。它只记录用户指定的信号。其后缀名一般为(*.vcd)。VCD文件的作用如下:1、存储波形;2、波形数据交换;3、用于测试,很多测试工具都可以读入VCD文件,然后根据VCD文件产生激励,并且比对输出结果,实现对芯片的测试。用VCD文件记录仿真数据在VHDL中没有像Verilog HDL那样,直接提供一系列的函数来生成VCD文件,但我们可以借助

45、ModelSim的vcd命令来实现用VCD文件记录仿真数据。ModelSim的vcd命令使用方式如下:(更详细的参数说明,请查看ModelSim SE Reference Manual)建立vcd文件:vcd file -dumpports -direction -map -no_strength_range -nomap -unique 例:vcd file mylog.vcd (建立一个名为mylog.vcd的VCD文件)用VCD文件记录仿真数据添加记录对象:vcd add -r -in -out -inout -internal -ports -file -dumpports .例:vc

46、d add testbench2/uut/* (把testbench2/uut/模块中的所有对象添加到vcd数据库中)暂停、开始记录:vcd off (暂停)vcd on (开始)操作提示1、在ModelSim中建立一个工程,并编译好模块文件和Testbench文件。2、载入Testbench的顶层模块进行仿真,这个时候ModelSim会载入需要调用的模块,但仿真还没有开始3、建立VCD文件:在命令框中输入“vcd file mylog.vcd ”(mylog.vcd 可以是VCD文件的文件名,可以根据自己的意愿更改,但后缀名必须为*.vcd)4、添加要记录的对象:在命令框中输入“vcd ad

47、d testbench2/uut/* ”就可以把testbench2/uut里面的所有对象,都添加到记录的进程中。5、点击run all按钮运行仿真,直至仿真结束。6、可以利用ModelSim的vcd2wlf命令把VCD文件转换为WLF格式的波形文件,这样可以利用ModelSim的波形查看器窗口查看数据。也可以利用其它工具打开或者调用。VCD文件样式利用ModelSim的vcd命令生成的VCD文件的样式如下(省略了部分数据)$dateSat Oct 08 11:16:56 2011$end$versionModelSim Version 6.5b$end$timescale1ns$end$sc

48、ope module testbench2 $end$scope module uut $end$var wire 1 % a 4 $end$var wire 1 & a 3 $end$var wire 1 a 2 $end$var wire 1 ( a 1 $end$var wire 1 - b 4 $end$var wire 1 . b 3 $end$var wire 1 / b 2 $end$var wire 1 0 b 1 $end$var wire 1 1 cin $end$var wire 1 6 sum 4 $end$var wire 1 7 sum 3 $end$var wir

49、e 1 8 sum 2 $end$var wire 1 9 sum 1 $end$var wire 1 : cout $end$upscope $end$upscope $end$enddefinitions $end#0$dumpvars1!11#1$1%1&11(0)0*0+0!0:09070503利用ModelSim查看VCD文件如上面的文件格式所示,VCD文件仅仅是文本文件,需要用波形查看器才可以直观地观察里面的数据波形。在ModelSim中需要把VCD文件转换为wlf格式的文件,才可以用波形查看器查看。以上一页完整的VCD文件mylog.vcd为例。在ModelSim的命令框中输入:

50、vcd2wlf mylog.vcd mylog.wlf即可生成名为mylog.wlf的波形文件,直接用ModelSim打开即可Testbench设计进阶高级Testbench概述文件的读写VCD数据库文件断言语句(Assert)高级Testbench实例断言语句(Assert)断言语句的使用方法断言语句的应用实例ModelSim中的断言警告级别的设置断言语句(Assert)断言语句(Assert)语句可以在仿真的过程中,检查一个条件并报告信息。根据所选择的严重级别和仿真工具的设置,在ASSERT语句报告了信息后,继续执行(警告级别WARNING)或者停止(错误ERROR和致命错误FAILURE

51、)。默认的严重级别为ERROR。断言语句的使用方法下面的例子是断言语句在仿真时的应用,它判断了仿真的时间,如果当前时间为1000ns,则仿真完成,使用ERROR严重级别终止仿真过程。PROCESSBEGINASSERT(NOW=1000ns)REPORT “Simulation completed successfully”SEVERITY ERROR;END PROCESS;断言语句判断条件的判断结果为FALSE,则执行后面的报告及严重级语句,否则跳过这些错误报告语句并继续执行。当(NOW=1000ns)不成立时,执行这两条语句断言语句的使用方法可以使用ASSERT语句设定一个判断条件,以便

52、对仿真的某个结果或值做出响应,例如下面的实例程序。PROCESS(q)BEGINASSERT(q/=“1001”)REPORT “The shifter gets the result!”SEVERITY ERROR;END PROCESS;如果信号q等于“1001”,则终止仿真,并输出“The shifter gets the result!”。断言语句的应用实例下面以一个简单的实例来讲述使用断言语句来响应一个仿真的过程。【例1-1】4位加减计数器的仿真计数器的位数为4位带有CLR清零端当DIR信号为高电平时,计数器为加1计数器;低电平时为减1计数器;LIBRARY IEEE;USE IEE

53、E.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY counter IS PORT(CLK,CLR,DIR:IN STD_LOGIC; CT_RESULT:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END counter;ARCHITECTURE Behav OF counter ISSIGNAL TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(CLK,CLR) BEGIN IF(CLR=1) THEN -清零 TMP=0000; ELSIF(CLKEVEN

54、T AND CLK=1) THEN IF(DIR=1) THEN -当DIR为高电平时,计数器为加1计数器 TMP=TMP+1; ELSE TMP=TMP-1; -当DIR为低电平时,计数器为减1计数器 END IF; END IF; END PROCESS; CT_RESULTCLK, CLR=CLR, DIR=DIR, CT_RESULT=CT_RESULT ); CLK_GEN:PROCESS BEGIN CLK=1; WAIT FOR CLK_PERIOD/2; CLK=0; WAIT FOR CLK_PERIOD/2; END PROCESS; TB:PROCESS BEGIN CL

55、R=1; DIR=1; WAIT FOR 20 NS; CLR=0; WAIT FOR 280 NS; DIR=0; WAIT FOR 320 NS; WAIT;-WAIT FOREVER END PROCESS;4位加减计数器Testbench例化待测试的实体,并连接激励信号时钟产生进程激励信号产生进程 PROCESS(CT_RESULT) BEGIN ASSERT(CT_RESULT/=1001) REPORT The conuter gets to nine! SEVERITY ERROR; END PROCESS; END BEHAV; 4位加减计数器TestbenchASSERT语句

56、分析:这个例子的断言语句用于判断计数的结果是否等于“1001”,条件判断使用了“不等于(/=)”逻辑,如果判断条件为FALSE,即计数值等于“1001”时,报告错误。仿真测试结果# * Error: The conuter gets to nine!# Time: 840 ns Iteration: 3 Instance: /counter_tb在ModelSim的输出窗口中输出以下信息:在ModelSim的输出波形如图:红色标记处就是断言语句输出错误信息的时刻ModelSim中的断言警告级别ModelSim中设定了以下断言警告级别(从高到低) Fatal、Failure、Error、Warn

57、ing、Note/Info在ModelSim中,对于哪个级别及以上的警告会让仿真停止呢? 答案:ModelSim里面有相关的选项设置,默认情况下为“Failure”级别及以上(即Failure 和Fatal )。因此,在默认设置下,我们的例程中Error级别的警告不会中断仿真的进程。ModelSim中的断言警告级别若需要更改ModelSim断言的设置,请执行以下步骤。根据需要设置Testbench设计进阶高级Testbench概述文件的读写VCD数据库文件断言语句(Assert)高级Testbench实例高级Testbench实例高级Testbench实例下面的仿真实例将综合运用前文所述的AS

58、SERT断言语句和文件操作TEXTIO程序包。待验证的实体是一个8位加法器,仿真用的Testbench文件从文本文件中读取激励信号矢量,并将仿真的结果和文本文件中的期望值进行比较,自动完成验证过程。激励信号8位加法器输入输出输出值和期望值比较测试矢量文件测试结果(Yes/No)期望值8位加法器实体- Single-bit adder-library IEEE;use IEEE.std_logic_1164.all;entity adder is port (a : in std_logic; b : in std_logic; cin : in std_logic; sum : out std

59、_logic; cout : out std_logic);end adder;- description of adder using concurrent signal assignmentsarchitecture rtl of adder isbegin sum = (a xor b) xor cin; cout = (a and b) or (cin and a) or (cin and b);end rtl;- N-bit adder- The width of the adder is determined by generic N-library IEEE;use IEEE.s

60、td_logic_1164.all;entity adderN is generic(N : integer := 16); port (a : in std_logic_vector(N downto 1); b : in std_logic_vector(N downto 1); cin : in std_logic; sum : out std_logic_vector(N downto 1); cout : out std_logic);end adderN;8位加法器实体(续)- structural implementation of the N-bit adderarchitec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论