1、TestbenchTestbench设计设计 主讲人:姜小波本章目录本章目录 VHDLVHDL仿真概述仿真概述VHDLVHDL仿真作用与工具仿真作用与工具VHDLVHDL仿真类型仿真类型仿真延时仿真延时延时模型延时模型仿真流程图仿真流程图仿真模型的基本结构仿真模型的基本结构 仿真测试平台文件(仿真测试平台文件(TestbenchTestbench)TestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生 时钟信号时钟信号 复位信号复位信号 复杂周期性信号复杂周期性信号 两相关性信号两相关性信号 一般激励信号一般激励信号 典型错
2、误典型错误 TestbenchTestbench综合应用实例综合应用实例VHDLVHDL仿真概述仿真概述仿真仿真.?!仿真仿真仿真简介仿真简介n仿真是指在软件环境下,验证电路的行为和设计意图是否仿真是指在软件环境下,验证电路的行为和设计意图是否一致。一致。n简化的仿真验证系统框图如下:简化的仿真验证系统框图如下:TestVector测试向量DUT测试内容Testbench测试模板仿 真 系统软件、硬 件 运行比 较 判 断输 出、存储结果 仿真简介仿真简介n仿真与验证主要包括仿真与验证主要包括3个方面的内容:个方面的内容:第一是仿真系统的组织原则,主要是如何有效的测试目标系第一是仿真系统的组织
3、原则,主要是如何有效的测试目标系统的理论和方法;统的理论和方法;第二是测试模板与测试向量的设计;第二是测试模板与测试向量的设计;最后是仿真工具的使用。最后是仿真工具的使用。n一般来说,仿真分为三种类型,即功能仿真、综合后功能仿真一般来说,仿真分为三种类型,即功能仿真、综合后功能仿真和时序仿真,分别对应于设计输入后、综合完成后、布局布线和时序仿真,分别对应于设计输入后、综合完成后、布局布线完成后等步骤,这些步骤也是仿真的切入点。完成后等步骤,这些步骤也是仿真的切入点。仿真简介(续仿真简介(续2)1、功能仿真、功能仿真功能仿真也称为前仿真,主旨在于验证电路功能是否符合设计要求,功能仿真也称为前仿真
4、,主旨在于验证电路功能是否符合设计要求,其特点是不考虑电路门延时与路径延时,考察重点为电路在理想环境其特点是不考虑电路门延时与路径延时,考察重点为电路在理想环境下的行为和设计构想是否一致。下的行为和设计构想是否一致。可综合可综合FPGA仿真代码是用仿真代码是用RTL级代码语言描述的,功能仿真的输入级代码语言描述的,功能仿真的输入是设计的是设计的RTL代码,也就是代码,也就是HDL源文件与源文件与Testbench.。2、综合后仿真、综合后仿真综合后仿真的主旨在于验证综合后的电路结构是否与设计意图相符,综合后仿真的主旨在于验证综合后的电路结构是否与设计意图相符,是否存在歧义综合结果。是否存在歧义
5、综合结果。综合后仿真的输入是从综合得到的一般性逻辑网表抽象出的仿真模型综合后仿真的输入是从综合得到的一般性逻辑网表抽象出的仿真模型和综合产生的延时文件,综合时的延时文件仅仅能估算门延时,而不和综合产生的延时文件,综合时的延时文件仅仅能估算门延时,而不包含布线延时信息,所以延时信息不十分准确。包含布线延时信息,所以延时信息不十分准确。仿真简介(续仿真简介(续3)3、时序仿真、时序仿真时序仿真也称为布局布线后仿真或者后仿真,是指电路已经映射到特时序仿真也称为布局布线后仿真或者后仿真,是指电路已经映射到特定的工艺环境后,综合考虑电路的路径延时与门延时的影响,验证电定的工艺环境后,综合考虑电路的路径延
6、时与门延时的影响,验证电路的行为是否能够在一定时序条件下满足设计构想的功能。路的行为是否能够在一定时序条件下满足设计构想的功能。时序仿真主要目的在于验证电路是否存在时序违规,其输入为从布局时序仿真主要目的在于验证电路是否存在时序违规,其输入为从布局布线抽象出的门级网表、布线抽象出的门级网表、Testbench以及扩展名为以及扩展名为SDO的标准延时文的标准延时文件。件。一般来说,时序仿真是必选步骤,通过时序仿真能检查设计时序与一般来说,时序仿真是必选步骤,通过时序仿真能检查设计时序与FPGA的实际运行情况是否一致,确保设计的可靠性和稳定性。的实际运行情况是否一致,确保设计的可靠性和稳定性。仿真
7、测试平台文件仿真测试平台文件(Testbench)(Testbench)TestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生TestbenchTestbench实例实例仿真测试平台文件仿真测试平台文件TestbenchTestbenchTestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生TestbenchTestbench实例实例仿真测试平台文件仿真测试平台文件TestbenchTestbenchTest Bench.?!VHDL test bench
8、TestbenchTestbench简介简介编写编写TestbenchTestbench目的目的 对使用硬件描述语言(HDL)设计的电路进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符。编写编写TestbenchTestbench进行测试的过程进行测试的过程 1)实例化需要测试的设计(DUT,Design Under Test);2)产生模拟激励(波形);3)将产生的激励加入到被测试模块并观察其输出响应;4)将输出响应与期望进行比较,从而判断设计的正确性。u输出响应可以以波形方式显示或存储测试结果到文件中TestbenchTestbench简介简介TestbenchTestben
9、ch基本结构基本结构激励信号的产生激励信号的产生TestbenchTestbench实例实例仿真测试平台文件仿真测试平台文件TestbenchTestbench激励激励信号信号待测试待测试实例实例波形、波形、数据数据输入输入输出输出TestbenchGenerate StimulusUUTMonitor ResponseTestbenchTestbench的基本结构的基本结构结结构构体体描描述述库的调用库的调用程序包的调用程序包的调用空实体空实体被测试元件的被测试元件的声明声明TestbenchTestbench的基本结构的基本结构LIBRARY IEEE;LIBRARY IEEE;USE I
10、EEE.std_logic_1164.all;USE IEEE.std_logic_1164.all;ENTITY TB ISENTITY TB ISEND ENTITY;END ENTITY;ARCHITECTURE ARCHITECTURE behav behav OFOF TB TB ISISCOMPONENTCOMPONENT Entity_Under_Test Entity_Under_Test PORTPORT()()-端口列表端口列表END COMPONENTEND COMPONENTBEGINBEGIN-局部信号的声明局部信号的声明DUT:Entity_Under_Test D
11、UT:Entity_Under_Test port mapport map()()Gen1Gen1:PROCESS():PROCESS()END PROCESS;END PROCESS;Gen2Gen2:PROCESS():PROCESS()END PROCESS;END PROCESS;END END behav;behav;局部信号声明局部信号声明例化被测试元件例化被测试元件产生激励信号产生激励信号TestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生TestbenchTestbench实例实例仿真测试平台文件仿真测试平
12、台文件TestbenchTestbench时钟信号的产生时钟信号的产生复位信号的产生复位信号的产生复杂周期性信号的产生复杂周期性信号的产生使用使用DELAYEDDELAYED属性产生两相关性信号属性产生两相关性信号一般激励信号的产生一般激励信号的产生典型错误典型错误激励信号的产生激励信号的产生激励信号的产生激励信号的产生时钟信号的产生时钟信号的产生 时钟信号是同步设计中最重要的信号之一。是属于周期性出现的信号。时钟信号分类:(1)对称时钟信号(占空比为50%)(2)非对称时钟信号(占空比不是50%)Testbench中产生时钟信号方式:(1)并行的信号赋值语句(2)单独process进程clk
13、1、clk2和clk3有何区别?试画出其波形激励信号的产生激励信号的产生时钟信号的产生时钟信号的产生 使用并行的信号赋值语句产生时钟信号signal clk1:std_logic:=0;signal clk2: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;clk3=0 after clk_period/4 when clk3
14、=1 else 1 after 3*clk_period/4 when clk3=0 else 0;激励信号的产生激励信号的产生时钟信号的产生时钟信号的产生 使用并行的信号赋值语句产生时钟信号signal clk1:std_logic:=0;signal clk2: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;-此值实际上是
15、定义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进程产生时钟信号signal clk1:std_logic;signal clk2:std_logic;clk1_gen:process constant clk_period:time:=40 ns;begin clk1=1;wait for cl
16、k_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;clk1和clk2有何区别?试画出其波形激励信号的产生激励信号的产生时钟信号的产生时钟信号的产生 使用process进程产生时钟信号signal clk1:std_logic;signal clk2:std_logic;clk1_gen:pr
17、ocess 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;常量只在该进程中起作用常量只在该进程中起作用激励信号的产生激励信号的产生 数字系统往往需要复位信号对系统进行复位,以便
18、初始化系统。Testbench中产生复位信号方式:(1)并行赋值语句(2)在进程中设定复位信号的产生复位信号的产生 激励信号的产生激励信号的产生复位信号的产生复位信号的产生 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 20 ns;reset2=1;wait for 40 ns;reset2=0;wait;end process;reset1和reset2信号波形一样吗?为什么?试画出其波
19、形激励信号的产生激励信号的产生复位信号的产生复位信号的产生 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 20 ns;reset2=1;wait for 40 ns;reset2=0;wait;end process;激励信号的产生激励信号的产生复杂周期性信号的产生复杂周期性信号的产生 signal period1,period2:std_logic:=0;TB:processbegin
20、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,1 after 25 ns,0 after 30 ns;wait for 35 ns;end process;period1和period2信号的周期是多少?试画出其波形激励信号的产生激励信号的产生复杂周期性信号的产生复杂周期性信号的产生 signal period1,period2:std_logic:=0;TB:processbegin period1=1 after 5 ns,0 after
21、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;激励信号的产生激励信号的产生使用使用DELAYEDDELAYED属性产生两相关性信号属性产生两相关性信号 period1和period2信号具有怎样的相关性?试画出其波形delayed是VHDL的预定义属性,使用它可以产生两个相关性的信号signal period1,period2:std_logic;period1=1 after 30 ns w
22、hen period1=0 else 0 after 20 ns when period1=1 else 0;period2=period1delayed(10 ns);激励信号的产生激励信号的产生使用使用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=period1de
23、layed(10 ns);激励信号的产生激励信号的产生一般的激励信号一般的激励信号 一般的激励信号通常在process进程中定义,而在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_
24、vector2=01;wait for 10 ns;test_vector2=10;wait;end process;比较test_vector1和test_vector2的异同,试画出其波形激励信号的产生激励信号的产生一般的激励信号一般的激励信号 一般的激励信号通常在process进程中定义,而在process进程中一般需要使用wait语句signal test_vector1:std_logic_vector(1 downto 0);signal test_vector2:std_logic_vector(1 downto 0);TB1:processbegin test_vector1=
25、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):=0000;signal test_vector4:std_logic_vector(3 downto 0):=0
26、000;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_vector4+1;wait for 10 ns;end process;TB5:processbegin test_vector5=0000;wait
27、 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波形激励信号的产生激励信号的产生一般的激励信号一般的激励信号 产生test_vector中所有可能的输入情况TB3:processbegin wait for 10 ns;test_vector3=test_vector3+1
28、;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;wait for 10 ns;test_vector5=test_vector5+1;end process;TB6:processbegin test_vector6=0000;wait for 10 ns;test_vec
29、tor6=test_vector6+1;wait for 10 ns;end process;激励信号的产生激励信号的产生一般的激励信号一般的激励信号 产生两个test_vector中所有可能的输入情况分析test_ab和test_sel的时序,试画出其波形signal test_ab:std_logic_vector(1 downto 0);signal test_sel:std_logic_vector(1 downto 0);double_loop:process begin test_ab =00;test_sel =00;for I in 0 to 3 loop for J in 0
30、 to 3 loop wait for 10 ns;test_ab=test_ab+1;end loop;test_sel=test_sel+1;end loop;end process;激励信号的产生激励信号的产生一般的激励信号一般的激励信号 产生两个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
31、+1;end loop;end process;激励信号的产生激励信号的产生典型错误典型错误 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;test_vector=001;wait for 200 ns;test_vector=011;end process;该程序
32、是否有错?假如没错,请分析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;gen2:process begin wait for 200 ns;test_vector=001;wait for 200 ns;test_vector=011;end pr
33、ocess;一个信号不能在两个进程中进行赋值TestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生TestbenchTestbench实例实例仿真测试平台文件仿真测试平台文件TestbenchTestbenchTestbenchTestbench实例实例组合逻辑电路:2位全加器的设计与验证时序逻辑电路:六进制计数器的设计与验证TestbenchTestbench实例实例2 2位全加器的设计位全加器的设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_un
34、signed.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 issignal 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 d
35、ownto 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);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 n
36、s;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=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;对此加法器进行全面的测试验证的方法一当加法器位数增加时,要覆盖所有可能的输入,此方法需要罗列的情况倍数增加,代码
37、书写将会非常麻烦TestbenchTestbench实例实例2 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;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
38、;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;对此加法器进行全面的测试验证的方法一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
39、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;对此加法器进行全面的测试验证的方法二TestbenchTestbench实例实例2 2位全加器的验证(续)位全加器的验证(续)仿真结果TestbenchTestbench实例实例六进制计数器的设计六进制计数器的设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned
40、.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(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)+
41、1;end if;end if;end if;qclk,en=en,clr=clr,q=q);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 process;en_gen:process begin en=0;wait for 25 ns;en=1;wait;
42、end process;end rtl;本章小结本章小结 VHDLVHDL仿真概述仿真概述VHDLVHDL仿真作用与工具仿真作用与工具VHDLVHDL仿真类型仿真类型仿真延时仿真延时延时模型延时模型仿真流程图仿真流程图仿真模型的基本结构仿真模型的基本结构 仿真测试平台文件(仿真测试平台文件(TestbenchTestbench)TestbenchTestbench简介简介TestbenchTestbench基本结构基本结构激励信号的产生激励信号的产生 时钟信号时钟信号 复位信号复位信号 复杂周期性信号复杂周期性信号 两相关性信号两相关性信号 一般激励信号一般激励信号 典型错误典型错误 TestbenchTestbench综合应用实例综合应用实例