测试基准m(1)-testbench_第1页
测试基准m(1)-testbench_第2页
测试基准m(1)-testbench_第3页
测试基准m(1)-testbench_第4页
测试基准m(1)-testbench_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

1、TestbenchTestbench设计设计 主讲人:姜小波本章目录本章目录 TestbenchTestbench设计设计TestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生 时钟信号时钟信号 复位信号复位信号 复杂周期性信号复杂周期性信号 两相关性信号两相关性信号 一般激励信号一般激励信号 典型错误典型错误 TestbenchTestbench综合应用实例综合应用实例 高级高级TestbenchTestbench设计设计高级高级TestbenchTestbench概述概述文件的读写文件的读写VCDVCD数据库文件数据库文

2、件断言语句断言语句(Assert)(Assert)高级高级TestbenchTestbench实例实例TestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生TestbenchTestbench实例实例TestbenchTestbench设计初步设计初步数字系统设计方法数字系统设计方法 基于中小规模集成电路的设计方法电路运行速度快,实时性好。然而过程过于繁琐复杂,不适用于大型的数子系统设计; 基于MCU的设计方法较为直观人性化,然而MCU的性能难以满足某些特定场合(如高速情况下)的应用需求; 基于PLD的EDA设计则是一种一种

3、全新的设计思想与设计理念全新的设计思想与设计理念。l兼具了中小规模集成电路设计与MCU设计方式的优点;l在顶层设计上采用多种输入描述方法,具有MCU方式设计的灵活性、直观性;l底层硬件逻辑设计由EDA工具自动完成保证了设计效率;l功能开发上是软件实现的,物理机制为纯硬件电路;l纯硬件的物理机制使其具有更强的抗干扰能力、更快的运行速度。真实世界VHDL SIMULATOR 数字系统设计数字系统设计Test Bench . ?!VHDL test benchTestbenchTestbench简介简介编写编写TestbenchTestbench目的目的 对使用硬件描述语言(HDL)设计的电路进行仿

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

5、计初步激励激励信号信号待测试待测试实例实例波形、波形、数据数据输入输入输出输出Testbench是VHDL程序之一,它遵循VHDL基本程序的框架,也具有自身的独特性TestbenchTestbench的基本结构的基本结构结结构构体体描描述述库的调用库的调用程序包的调用程序包的调用空实体空实体被测试被测试元件元件的的声明声明TestbenchTestbench的基本结构的基本结构LIBRARY IEEE;LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_1164.all;ENTITY TB ENTITY TB ISISEND

6、ENTITY;END ENTITY;ARCHITECTURE ARCHITECTURE behavbehav OFOF TB TB ISISCOMPONENTCOMPONENT Entity_Under_TestEntity_Under_Test PORTPORT()() -端口列表端口列表END COMPONENTEND COMPONENTBEGINBEGIN-局部信号的声明局部信号的声明DUT:DUT: Entity_Under_TestEntity_Under_Test port mapport map()() Gen1Gen1:PROCESS ():PROCESS () END PRO

7、CESS; END PROCESS; Gen2Gen2:PROCESS :PROCESS ()() END PROCESS END PROCESS; ;END END behavbehav; ;局部信号声明局部信号声明例化例化被被测试测试元件元件产生激励信号产生激励信号TestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生TestbenchTestbench实例实例TestbenchTestbench设计初步设计初步时钟信号的产生时钟信号的产生复位信号的产生复位信号的产生复杂周期性信号的产生复杂周期性信号的产生使用使用DEL

8、AYEDDELAYED属性产生两相关性信号属性产生两相关性信号一般激励信号的产生一般激励信号的产生典型错误典型错误激励信号的产生激励信号的产生激励信号的产生激励信号的产生时钟信号的产生时钟信号的产生 时钟信号是同步设计中最重要的信号之一。是属于周期性出现的信号。时钟信号分类:(1)对称时钟信号(占空比为50%)(2)非对称时钟信号(占空比不是50% )Testbench中产生时钟信号方式:(1)并行的信号赋值语句(2)单独process进程clk1、clk2和clk3有何区别?试用并行赋值语句产生上述时钟信号激励信号的产生激励信号的产生时钟信号的产生时钟信号的产生 使用并行的信号赋值语句产生时

9、钟信号激励信号的产生激励信号的产生时钟信号的产生时钟信号的产生 使用并行的信号赋值语句产生时钟信号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=0 else 1; -此值实际上是定义clk2的起始值cl

10、k3 = 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 clk2

11、: 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;常量只在该进程中起

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

13、et2_gen:processbegin reset2 = 0; wait for 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

14、10 ns, 1 after 20 ns, 0 after 25 ns; period2 =1 after 10 ns,0 after 20 ns, 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

15、;wait for 10 ns; period1 =1;wait for 5 ns; period1 =0;wait for 10 ns;end process;period2_gen:processbegin 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;激励信号的产生激励信号的产生使用使用DELAYEDDELAYED属性产生两相关性信号属性产生两相关性信

16、号 period1和period2信号具有怎样的相关性?试用delayed属性产生上述信号delayed是VHDL的预定义属性,使用它可以产生两个相关性的信号激励信号的产生激励信号的产生使用使用DELAYEDDELAYED属性产生两相关性信号属性产生两相关性信号 delayed是VHDL的预定义属性,使用它可以产生两个相关性的信号signal period1,period2: std_logic; period1 = 1 after 30 ns when period1=0 else 0 after 20 ns when period1=1 else 0; period2 = period1d

17、elayed(10 ns);激励信号的产生激励信号的产生一般的激励信号一般的激励信号 一般的激励信号通常在process进程中定义,而在process进程中一般需要使用wait语句比较test_vector1和test_vector2的异同,并用process进程实现之激励信号的产生激励信号的产生一般的激励信号一般的激励信号 一般的激励信号通常在process进程中定义,而在process进程中一般需要使用wait语句signal test_vector1: std_logic_vector (1 downto 0);signal test_vector2: std_logic_vector

18、(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 = 10; wait;end process;激励信号的产生激励信号的产生一般的激励信号一般的激励信号 产生test_vector中所有可能的输入情况signal test_vector3: std_logic_vector (3 downto 0

19、) := 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 for 10 ns; test_vector3 = test_vector3 + 1;end process;TB4:processbegin wait for 10 ns; test_vector4 = test

20、_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; test_vector6 = test_vector6 + 1; wait for 10 ns;end process;比较四个process的异同,试画出各个test_vector波形激励信号的产生激励信号的产生

21、一般的激励信号一般的激励信号 产生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 process;激励信号的产生激励信号的产生一般的激励信号一般的激励信号 产生test_vector中所有可能的输入情况TB5:processbegin test_vector5 = 0000; wa

22、it 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中所有可能的输入情况如上图所示,2bit的test_ab和test_sel是否覆盖了所有的输入情况?试用VHDL产生上述信号激励信号的产生激励信号的产生一般的激励信号一

23、般的激励信号 产生两个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_logic_vector (1 downto 0);signal test_sel: std_logic_ve

24、ctor (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 process; gen2:process begin wait for 200 ns;

25、 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_vector = 000; wait; end process; g

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

27、的设计与验证时序逻辑电路:六进制计数器的设计与验证TestbenchTestbench实例实例2 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 o

28、f adder_2 is signal sint:std_logic_vector(2 downto 0);signal 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基本程序的框架,也具有自身的独特性

29、被测元件的声明注意:此处并非adder_2_tb被测元件的例化TestbenchTestbench实例实例2 2位全加器的验证(续)位全加器的验证(续)TB: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

30、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=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;对此加法器进行全面的测试验证的方法一方法方法一一当加法器位数增加时,要覆盖所有可能的输入,此方法需要罗列的情况倍数增加,代码书写将会非常麻烦TestbenchTestbench实例实例2 2位全加器的验证(续)位全加器的验证(续)a_t=01

31、;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=00;b_t=00;cin_t=0

32、;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;对此加法器进行全面的测试验证的方法一方法方法一一TestbenchTestbench实例实例2 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 =

33、a_t + 1; end loop; b_t = b_t + 1; end loop; cin_t = not cin_t; end loop; end process;end tb;对此加法器进行全面的测试验证的方法二方法方法二二TestbenchTestbench实例实例2 2位全加器的验证(续)位全加器的验证(续)仿真结果通过对波形进行分析可知,本设计功能正确TestbenchTestbench实例实例六进制计数器的设计六进制计数器的设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ent

34、ity 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(clk) 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

35、)+1; end if; end if; end if; qclk,en=en,clr=clr,q=q); 库、程序包的调用Testbench实体(空实体)定义被测元件的声明被测元件的例化TestbenchTestbench实例实例六进制计数器的验证(续)六进制计数器的验证(续)clk_gen:process begin wait for clk_period/2; clk=1; wait for clk_period/2; clk=0; end process;clr_gen:process begin clr=0; wait for 15 ns; clr=1; wait; end proc

36、ess;en_gen:process begin en=0; wait for 25 ns; en=1; wait; end process; end rtl; 仿真结果TestbenchTestbench设计进阶设计进阶高级高级TestbenchTestbench概述概述文件的读写文件的读写VCDVCD数据库文件数据库文件断言语句断言语句(Assert)(Assert)高级高级TestbenchTestbench实例实例TestbenchTestbench设计进阶设计进阶高级高级TestbenchTestbench概述概述文件的读写文件的读写VCDVCD数据库文件数据库文件断言语句断言语句(

37、Assert)(Assert)高级高级TestbenchTestbench实例实例高级高级TestbenchTestbench概述概述简单简单TestbenchTestbench高级高级TestbenchTestbench简单简单TestbenchTestbench概述概述 在前一节内容中,我们所看到的验证方法都是在前一节内容中,我们所看到的验证方法都是比较简单的,这里称为简单比较简单的,这里称为简单TestbenchTestbench,一般结构,一般结构如下图所示。如下图所示。激励激励信号信号待测试待测试实例实例波形、波形、数据数据输入输入输出输出 所输出的结果以波形或者数据显示,需要人工所

38、输出的结果以波形或者数据显示,需要人工分析其结果的正确性,如果被测信号数量较多且时分析其结果的正确性,如果被测信号数量较多且时序负责,工作量会非常巨大。序负责,工作量会非常巨大。高级高级Testbench概述概述激励激励信号信号待测试实待测试实例例输入输入输出输出高级高级TestbenchTestbench是在简单是在简单TestbenchTestbench基础上改进过来基础上改进过来的,能够自动读入测试矢量文件、完成输出值和期的,能够自动读入测试矢量文件、完成输出值和期望值的比较等功能。如下图所示望值的比较等功能。如下图所示输出值输出值和期望和期望值比较值比较测试矢量文件测试矢量文件测试结果

39、测试结果(Yes/NoYes/No)更智能化,减少人更智能化,减少人工分析的繁琐!工分析的繁琐!载入期望值载入期望值TestbenchTestbench设计进阶设计进阶高级高级TestbenchTestbench概述概述文件的读写文件的读写VCDVCD数据库文件数据库文件断言语句断言语句(Assert)(Assert)高级高级TestbenchTestbench实例实例文件的读写文件的读写文件定义文件定义TEXTIOTEXTIO介绍介绍TEXTIOTEXTIO数据类型及过程数据类型及过程代码示例代码示例n仿真时,仿真时,VHDL允许设计人员从文件加载数据或将数据允许设计人员从文件加载数据或将数

40、据存储到文件中。比如用户定义的测试矢量可以保存在文存储到文件中。比如用户定义的测试矢量可以保存在文件中,然后在仿真时从文件中读取这些测试矢量。另外件中,然后在仿真时从文件中读取这些测试矢量。另外,仿真的结果也可以保存在文件中。,仿真的结果也可以保存在文件中。nVHDL标准中的文件标准中的文件I/O主要是由主要是由TEXTIO程序包提供程序包提供,用于仿真,综合工具不能综合,用于仿真,综合工具不能综合n如果想在仿真时候进行文件操作,必须引入标准库如果想在仿真时候进行文件操作,必须引入标准库STD中的中的TEXTIO定义的定义的程序程序包包,该程序包中包含了文件输该程序包中包含了文件输入输出所需的

41、基本子程序。入输出所需的基本子程序。“USE STD.TEXTIO.ALL”文件的读写文件的读写nTEXTIO 是是VHDL 标准库标准库STD 中的一个程序包中的一个程序包 (Package)。在该包中定义了三个类型:)。在该包中定义了三个类型:LINE 类型、类型、TEXT类型以及类型以及SIDE 类型。另外,还有一个子类型类型。另外,还有一个子类型(subtype)WIDTH。此外,。此外, 在该程序包中还定义了一在该程序包中还定义了一些访问文件所必须的过程(些访问文件所必须的过程(Procedure)。)。TEXTIO介绍介绍TEXTIO数据类型数据类型LINETEXTSIDEWIDT

42、H进程进程READLINEWRITELINEREADWRITEn数据类型数据类型LINETEXTIO数据类型数据类型LINE为存取类型的变量,它表示该变量是指向字符串为存取类型的变量,它表示该变量是指向字符串的指针,它是的指针,它是TEXTIO 中所有操作的基本单元。中所有操作的基本单元。读文件时,先按行(读文件时,先按行(LINE)读出一行数据,)读出一行数据,再用再用LINE 操作来读取各种数据类型的数据;写文件时,操作来读取各种数据类型的数据;写文件时, 先将先将各种的数据类型组合成各种的数据类型组合成LINE,再将,再将LINE 写入文件。写入文件。在用户使用时,在用户使用时, 必须注

43、意只有变量才可以是存取类型,必须注意只有变量才可以是存取类型, 而信号则不能是存取类型。例如,而信号则不能是存取类型。例如, 我们可以定义我们可以定义variable DLine : LINE;但不能定义成但不能定义成signal DLine : LINE;n数据类型数据类型TEXTTEXT 为为ASCII 文件类型。文件类型。 定义成为定义成为TEXT 类型的文件类型的文件是长度可变的是长度可变的ASCII 文件。文件。需要注意的是需要注意的是VHDL87 和和VHDL93 在使用文件方面有较在使用文件方面有较大的差异,在编译时注意选中对应的标准。大的差异,在编译时注意选中对应的标准。TEX

44、TIO数据类型数据类型n数据类型数据类型SIDESIDE 只能有两种状态,即只能有两种状态,即right 和和left,分别表示将数据,分别表示将数据从左边还是右边写入行变量。该类型主要是在从左边还是右边写入行变量。该类型主要是在TEXTIO 程序程序包包含的过程中使用。包包含的过程中使用。n数据类型数据类型WIDTHWIDTH 为自然数的子类型。所谓子类型表示其取值范围为自然数的子类型。所谓子类型表示其取值范围是父类型范围的子集。是父类型范围的子集。TEXTIO数据类型数据类型TEXTIO文件定义文件定义n文件可以通过它所存储的内容来进行区分文件可以通过它所存储的内容来进行区分ntype t

45、ext 是字符串文件;是字符串文件;ntype IntegerFileType 是整数型文件;是整数型文件;nVHDL 1987中的文件定义中的文件定义nfile infile: text is in “inputdata.txt”;nfile outfile: text is out “outputdata.txt”;nVHDL 1993中的文件定义中的文件定义nfile infile: text open read_mode is “inputdata.txt”;nfile outfile: text open write_mode is “outputdata.txt”;TEXTIO文件

46、定义文件定义n二进制二进制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 io93;ARCHITECTURE behavioral OF io93 ISBEGIN PROCESS IS TYPE INTEGERFILETYPE IS FILE OF INTEGER; FI

47、LE 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; END LOOP; WAIT; END PROCESS; END ARCHITECTURE behavioral;TEXTIO文件定义文件定义n二进制二进制I/O文件(文件(VHDL 198

48、7)支持支持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:INTEGERFILETYPE IS OUT output.txt; VARIABLE check:INTEGER:=0; BEGIN

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

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

51、URE behavioral OF formatted_io ISBEGIN PROCESS IS 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/

52、O); WRITELINE(outfile,buf); WRITE(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 ARCHITECTUR

53、E behavioral;TestbenchTestbench设计进阶设计进阶高级高级TestbenchTestbench概述概述文件的读写文件的读写VCDVCD数据库文件数据库文件断言语句断言语句(Assert)(Assert)高级高级TestbenchTestbench实例实例VCDVCD数据库文件数据库文件VCDVCD数据库数据库用用VCDVCD文件记录仿真数据文件记录仿真数据操作提示操作提示VCDVCD文件样式文件样式利用利用ModelSimModelSim查看查看VCDVCD文件文件VCD数据库数据库nVCD数据库是仿真过程中数据库是仿真过程中数据信号变化数据信号变化的记录。它只记的

54、记录。它只记录用户指定的信号。其后缀名一般为录用户指定的信号。其后缀名一般为(*.vcd)。nVCD文件的作用如下:文件的作用如下:1、存储波形;、存储波形;2、波形数据交换;、波形数据交换;3、用于测试,很多测试工具都可以读入、用于测试,很多测试工具都可以读入VCD文件,然后文件,然后根据根据VCD文件产生激励,并且比对输出结果,实现对芯文件产生激励,并且比对输出结果,实现对芯片的测试。片的测试。用用VCD文件记录仿真数据文件记录仿真数据n在在VHDL中没有像中没有像Verilog HDL那样,直接提供一系列的函那样,直接提供一系列的函数来生成数来生成VCD文件,但我们可以借助文件,但我们可

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

56、象:添加记录对象:vcd add -r -in -out -inout -internal -ports -file -dumpports .例:例:vcd add testbench2/uut/* (把把testbench2/uut/模块中的所有对象添模块中的所有对象添加到加到vcd数据库中数据库中)暂停、开始记录:暂停、开始记录:vcd off (暂停)vcd on (开始)操作提示操作提示1、在、在ModelSim中建立一个工程,并编译好模块文件和中建立一个工程,并编译好模块文件和Testbench文件文件。2、载入、载入Testbench的顶层模块进行仿真,这个时候的顶层模块进行仿真,

57、这个时候ModelSim会载入需会载入需要调用的模块,但仿真还没有开始要调用的模块,但仿真还没有开始3、建立、建立VCD文件:在命令框中输入文件:在命令框中输入“vcd file mylog.vcd ”(mylog.vcd 可以是可以是VCD文件的文件名,可以根据自己的意愿更改,但后文件的文件名,可以根据自己的意愿更改,但后缀名必须为缀名必须为*.vcd)4、添加要记录的对象:在命令框中输入、添加要记录的对象:在命令框中输入“vcd add testbench2/uut/* ”就可以把就可以把testbench2/uut里面的所有对象,都添加到记录的进程中。里面的所有对象,都添加到记录的进程中

58、。5、点击、点击run all按钮运行仿真,直至仿真结束。按钮运行仿真,直至仿真结束。6、可以利用、可以利用ModelSim的的vcd2wlf命令把命令把VCD文件转换为文件转换为WLF格式的波格式的波形文件,这样可以利用形文件,这样可以利用ModelSim的波形查看器窗口查看数据。也可以的波形查看器窗口查看数据。也可以利用其它工具打开或者调用。利用其它工具打开或者调用。VCD文件样式文件样式n利用利用ModelSim的的vcd命令生成的命令生成的VCD文件的样式如文件的样式如下下(省略了部分数据省略了部分数据)$dateSat Oct 08 11:16:56 2011$end$version

59、ModelSim Version 6.5b$end$timescale1ns$end$scope 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

60、 6 sum 4 $end$var wire 1 7 sum 3 $end$var wire 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文件文件n如上面的文件格式所示,如上面的文件格式所示,VCD文件仅仅是文本文件,需要用文件仅仅是文本文件,需要用波形查看器才可以直观地观察里面的数据波形。波形查看器才可

温馨提示

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

评论

0/150

提交评论