《testbench设计初步.ppt》由会员分享,可在线阅读,更多相关《testbench设计初步.ppt(53页珍藏版)》请在三一办公上搜索。
1、Testbench设计,主讲人:姜小波,本章目录,VHDL仿真概述VHDL仿真作用与工具VHDL仿真类型仿真延时延时模型仿真流程图仿真模型的基本结构仿真测试平台文件(Testbench)Testbench简介Testbench基本结构激励信号的产生时钟信号复位信号复杂周期性信号两相关性信号一般激励信号典型错误 Testbench综合应用实例,VHDL仿真概述,仿真.?!,仿真,仿真简介,仿真是指在软件环境下,验证电路的行为和设计意图是否一致。简化的仿真验证系统框图如下:,仿真简介,仿真与验证主要包括3个方面的内容:第一是仿真系统的组织原则,主要是如何有效的测试目标系统的理论和方法;第二是测试模
2、板与测试向量的设计;最后是仿真工具的使用。一般来说,仿真分为三种类型,即功能仿真、综合后功能仿真和时序仿真,分别对应于设计输入后、综合完成后、布局布线完成后等步骤,这些步骤也是仿真的切入点。,仿真简介(续2),1、功能仿真功能仿真也称为前仿真,主旨在于验证电路功能是否符合设计要求,其特点是不考虑电路门延时与路径延时,考察重点为电路在理想环境下的行为和设计构想是否一致。可综合FPGA仿真代码是用RTL级代码语言描述的,功能仿真的输入是设计的RTL代码,也就是HDL源文件与Testbench.。2、综合后仿真综合后仿真的主旨在于验证综合后的电路结构是否与设计意图相符,是否存在歧义综合结果。综合后仿
3、真的输入是从综合得到的一般性逻辑网表抽象出的仿真模型和综合产生的延时文件,综合时的延时文件仅仅能估算门延时,而不包含布线延时信息,所以延时信息不十分准确。,仿真简介(续3),3、时序仿真时序仿真也称为布局布线后仿真或者后仿真,是指电路已经映射到特定的工艺环境后,综合考虑电路的路径延时与门延时的影响,验证电路的行为是否能够在一定时序条件下满足设计构想的功能。时序仿真主要目的在于验证电路是否存在时序违规,其输入为从布局布线抽象出的门级网表、Testbench以及扩展名为SDO的标准延时文件。一般来说,时序仿真是必选步骤,通过时序仿真能检查设计时序与FPGA的实际运行情况是否一致,确保设计的可靠性和
4、稳定性。,仿真测试平台文件(Testbench),Testbench简介Testbench基本结构激励信号的产生Testbench实例,仿真测试平台文件Testbench,Testbench简介Testbench基本结构激励信号的产生Testbench实例,仿真测试平台文件Testbench,Test Bench.?!,VHDL test bench,Testbench简介,编写Testbench目的,对使用硬件描述语言(HDL)设计的电路进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符。,编写Testbench进行测试的过程,1)实例化需要测试的设计(DUT,Design Un
5、der Test);2)产生模拟激励(波形);3)将产生的激励加入到被测试模块并观察其输出响应;4)将输出响应与期望进行比较,从而判断设计的正确性。,输出响应可以以波形方式显示或存储测试结果到文件中,Testbench简介Testbench基本结构激励信号的产生Testbench实例,仿真测试平台文件Testbench,激励信号,待测试实例,波形、数据,输入,输出,Testbench,Generate Stimulus,UUT,Monitor Response,Testbench的基本结构,结构体描述,库的调用,程序包的调用,空实体,被测试元件的声明,Testbench的基本结构,LIBRAR
6、Y 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 behav;,局部信号声明,例化被测试元件,产生激励信号,Testbench简介Testbench基本结构激励信号的产
7、生Testbench实例,仿真测试平台文件Testbench,时钟信号的产生复位信号的产生复杂周期性信号的产生使用DELAYED属性产生两相关性信号一般激励信号的产生典型错误,激励信号的产生,激励信号的产生,时钟信号的产生,时钟信号是同步设计中最重要的信号之一。是属于周期性出现的信号。,时钟信号分类:(1)对称时钟信号(占空比为50%)(2)非对称时钟信号(占空比不是50%),Testbench中产生时钟信号方式:(1)并行的信号赋值语句(2)单独process进程,clk1、clk2和clk3有何区别?试画出其波形,激励信号的产生,时钟信号的产生,使用并行的信号赋值语句产生时钟信号,sign
8、al 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=1 else 1 after 3*clk_period/4 when clk3=0 else 0;,激励信号的产生,时钟信号的产生,使用并行的
9、信号赋值语句产生时钟信号,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;-此值实际上是定义clk2的起始值clk3=0 after clk_period/4 when clk3=1 else 1 after 3*clk_period/4 when cl
10、k3=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 clk_period/2;clk1=0;wait for clk_period/2;end process;,clk2_gen:process constant clk_period:tim
11、e:=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:process constant clk_period:time:=40 ns;begin clk1=1;wait for clk_period/2;clk1=0;wait for clk_period/2;
12、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;,常量只在该进程中起作用,常量只在该进程中起作用,激励信号的产生,数字系统往往需要复位信号对系统进行复位,以便初始化系统。,Testbench中产生复位信号方式:(1)并行赋值语句(2)在进程中设定,复位信号的产生,激励信号的产生,复位信号的产生,signal reset1:std_logic;signal reset
13、2: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信号波形一样吗?为什么?试画出其波形,激励信号的产生,复位信号的产生,signal reset1:std_logic;signal reset2:std_logic;reset1=0,1 after 20 ns,0 after 40 ns;reset2_gen:processb
14、egin 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 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 pro
15、cess;,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,1 after 25 ns,0 after 30 ns;wait for 35 ns;end process;,激励信号的产生,使用DELAYED属性产生两相关性信号,period1和p
16、eriod2信号具有怎样的相关性?试画出其波形,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=period1delayed(10 ns);,激励信号的产生,使用DELAYED属性产生两相关性信号,delayed是VHDL的预定义属性,使用它可以产生两个相关性的信号,signal period1,period2:std_logic;per
17、iod1=1 after 30 ns when period1=0 else 0 after 20 ns when period1=1 else 0;period2=period1delayed(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
18、;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_vector1和test_vector2的异同,试画出其波形,激励信号的产生,一般的激励信号,一般的激励信号通常在process进程中定义,而在process进程中一般需要使用wait语句,signal test_vector1:std_logic_vector(1 downto 0);signal
19、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=10;wait;end process;,激励信号的产生,一般的激励信号,产生test_vector中所有可能的输入情况,signal test_vector3:std_logic_vector(3 downt
20、o 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 for 10 ns;test_vector3=test_vector3+1;end process;,TB4:processbegin wait for 10 ns;test_vector4=test_vector4+1;wa
21、it 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波形,激励信号的产生,一般的激励信号,产生test_vector中所有可能的输入情况,TB3
22、: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;wait for 10 ns;test_vector5=test_vector5+1;end process;,TB6:process
23、begin test_vector6=0000;wait for 10 ns;test_vector6=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_se
24、l=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;,激励信号的产生,一般的激励信号,产生两个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
25、 loop;test_sel=test_sel+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;
26、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;,gen2:process begin wait for 200 ns;test_vector=001;wait for 200 ns;test_vector=0
27、11;end process;,一个信号不能在两个进程中进行赋值,Testbench简介Testbench基本结构激励信号的产生Testbench实例,仿真测试平台文件Testbench,Testbench实例,组合逻辑电路:2位全加器的设计与验证,时序逻辑电路:六进制计数器的设计与验证,Testbench实例,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_vect
28、or(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,如何写Testbench对此加法器进行全面的测试验证?,Testbench实例,2位全加器的验证,library ieee;use ieee.std_logic_1164.all;use
29、ieee.std_logic_unsigned.all;,entity adder_2_tb isend adder_2_tb;,architecture tb of adder_2_tb is COMPONENT adder_2 PORT(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 COMPONENT;signal a_t,b_t,s_t:std_logic_vector(1 downto 0);signal ci
30、n_t,cout_t:std_logic;begin DUT:adder_2 PORT MAP(cin=cin_t,a=a_t,b=b_t,s=s_t,cout=cout_t);,Testbench实例,2位全加器的验证(续),TB:processbegin,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
31、_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;,对此加法器进行全面的测试验证的方法一,当加法器位数增加时,要覆盖所有可能的输入,此方法需要罗列的情况倍数增加,代码书写将会非常麻烦,Testbench实例,
32、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;wait for 10 ns;b_t=11;wait for 10 ns;,
33、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;,对此加法器进行全面的测试验证的方法一,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 lo
34、op;b_t=b_t+1;end loop;cin_t=not cin_t;end loop;end process;end tb;,对此加法器进行全面的测试验证的方法二,Testbench实例,2位全加器的验证(续),仿真结果,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
35、;,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)+1;end if;end if;end if;q=tmp;end process;end rtl;,Testbench实例,六进制计数器的验证,library ieee;use ieee.
36、std_logic_1164.all;use ieee.std_logic_unsigned.all;,entity cnt6_tb is end cnt6_tb;,architecture rtl of cnt6_tb is component cnt6 port(clr,en,clk:in std_logic;q:out std_logic_vector(2 downto 0);end component;signal clr:std_logic:=0;signal en:std_logic:=0;signal clk:std_logic:=0;signal q:std_logic_vec
37、tor(2 downto 0);constant clk_period:time:=10 ns;begin DUT:cnt6 port map(clk=clk,en=en,clr=clr,q=q);,Testbench实例,六进制计数器的验证(续),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;end process;end rtl;,本章小结,VHDL仿真概述VHDL仿真作用与工具VHDL仿真类型仿真延时延时模型仿真流程图仿真模型的基本结构仿真测试平台文件(Testbench)Testbench简介Testbench基本结构激励信号的产生时钟信号复位信号复杂周期性信号两相关性信号一般激励信号典型错误 Testbench综合应用实例,
链接地址:https://www.31ppt.com/p-5450531.html