VHDL——如何写简单的testbench

合集下载

TestBench

TestBench

模拟界面控制
库文 件
逻辑模拟结果一致性的确定

在TestBench中加入预期结果比较

利用波形比较工具检测逻辑模拟波形的 一致性
$display $time $fopen $finish
$fdisplay $write $fclose $stop
$monitor $strobe $dump
利用虚拟原型、估计综合及后设计的结果;
HDL代码调试
逻辑模拟验证

在TestBench中加入$strobe系统任务,记 录、探测所关心的信号波形; 在逻辑模拟验证前,利用模拟器提供的 功能,选择需要观察的信号并加以记录; 在TestBench中增加模拟结果与预期的正 确结果的比较,检测不正确的HDL代码
Verilog HDL提供的支持
Verilog HDL提供了几个系统任务支持从 文件中直接读取输入激励码向量 $readmemb(“File_Name”, Test_Vector); 从文件中读取二进制输入激励码向量
$readmemh(“File_Name”, Test_Vector); 从文件中读取二进制输入激励码向量
Reg Reg …… [7:0] A, B; Start;
二进制表示的 输入激励码及 其输出预期结 果表示
Reg [33:0]
…….
……
Vector, Test_Vector[0:Test_Length];
$readmemb(“Test_Fixed.v”, Test_Vector); For (I=0; I<Test_Length; I = I+1) 按一定时序将Test_Vector[I]送入Vector并送入A、B、 Start;

编写高效率的testbench

编写高效率的testbench

编写高效率的testbench简介:由于设计的规模越来越大也越来越复杂,数字设计的验证已经成为一个日益困难和繁琐的任务。

验证工程师们依靠一些验证工具和方法来应付这个挑战。

对于几百万门的大型设计,工程师们一般使用一套形式验证(formal verification)工具。

然而对于一些小型的设计,设计工程师常常发现用带有testbench的HDL仿真器就可以很好地进行验证。

Testbench已经成为一个验证高级语言(HLL --High-Level Language) 设计的标准方法。

通常testbench完成如下的任务:1.实例化需要测试的设计(DUT);2.通过对DUT模型加载测试向量来仿真设计;3.将输出结果到终端或波形窗口中加以视觉检视;4.另外,将实际结果和预期结果进行比较。

通常testbench用工业标准的VHDL或Verilog硬件描述语言来编写。

Testbench调用功能设计,然后进行仿真。

复杂的testbench完成一些附加的功能—例如它们包含一些逻辑来选择产生合适的设计激励或比较实际结果和预期结果。

后续的章节描述了一个仔细构建的testbench的结构,并且提供了一个自动比较实际结果与预期结果的进行自我检查的testbench例子。

图1给出了一个如上所描述步骤的标准HDL验证流程。

由于testbench使用VHDL或Verilog来描述,testbench的验证过程可以根据不同的平台或不同的软件工具实现。

由于VHDL或Verilog是公开的通用标准,使用VHDL或Verilog编写的testbench以后也可以毫无困难地重用(reuse)。

图1使用Testbench的HDL验证流程构建TestbenchTestbench用VHDL或Verilog来编写。

由于testbench只用来进行仿真,它们没有那些适用于综合的RTL语言子集的语法约束限制,而是所有的行为结构都可以使用。

因而testbench可以编写的更为通用,使得它们可以更容易维护。

AD6 中VHDL设计及创建Testbench参考

AD6 中VHDL设计及创建Testbench参考

VHDL语言设计参考VHDL是一种用于数字系统行为级描述的编程语言。

VHDL具备了许多适合于电子器件行为级描述的特性,无论是简单的逻辑门电路还是复杂的微处理器或用户自定制的器件。

从而,VHDL满足电路行为中电气特征(诸如信号上升/下降时间、门延迟和功能)的精确描述。

并且利用VHDL仿真模型可以搭建更大的可仿真电路。

VHDL还是一种通用的可编程语言,就如同利用高级语言在计算机上编写复杂的设计程序,VHDL允许输入复杂电子电路的行为级设计,并实现自动电路综合或系统仿真。

同时,VHDL也不同于高级语言,采用并发事件设计(即在执行阶段内,每个语句行为是并行执行的);这一特性取决于硬件电路设计上固有的并行执行的特性。

VHDL最重要的应用之一就是设计电路的执行规范,语法规则与Testbench相一致。

Testbench是用于验证电路在时间上行为级描述的。

在任何时候,Testbench都将作为VHDL 设计项目的一个组成部分。

注:符号 <=为付值操作符,表示将符号右边的数值给符号左边的变量;一个完整的VHDL设计项目至少要包含一个实体(entity)和结构体(architecture)定义。

对于一个大型设计,通常需要定义多个实体/结构对并且将他们连接在一起形成一个完整的电路。

实体定义用于描述电路的输入/输出端口;结构体定义是VHDL设计中最小的组成单元。

在仿真或综合执行前,每个实体必须被相对应结构体封装。

在结构体中描述了实际的功能。

实体定义entity comp_name isport(in_port : in bit_vector(7 downto 0); out_port : out bit);end comp_name;结构体定义:architecture comp_name of entity_name isbegin<conditional assignment>;end comp_name;注:关键字process用来封装复杂的顺序逻辑设计;VHDL语言中的数据类型:VHDL设计中实际由5种设计单元类型构成:实体、结构体、程序包、程序包体和配置。

test bench 教程

test bench 教程

最近项目上要用到FPGA,之前用的一直是verilog,后面换成了VHDL。

对ISE一窍不通啊,研究了一些testbench文件的编写,record一下。

借用一下博文/lovelink/item/ff34ce9b12f45988581461ac的话。

首先对TESTBENCH作一个形象一些的比喻吧,它就象是一个面包板(做过电路实验吧),他对外没有任何接口,但它要向要插在他上面的器件提供接口,这样才能正确的插入,还有它必须对插在它上面的器件提供正常的信号。

当然在它上面还必须要有这个器件。

这时就完成了一个TESTBENCH。

应该大概明白了其中的意思了吧。

好了,根据上面的比喻我们可以非常明确的知道一个TESTBENCH要写一些什么东西,首先它对外无接口,所以它的实体部分是空的。

在它上面要有相应的器件,所以在它的结构体中要申明我们要测试的器件,也就是component的申明。

还有就是它要对器件提供接口,所以它的结构体应该提供一些信号,并且要对这些信号进行正确的测试赋值。

当然还要进行一些插入工作,就是信号的对应工作。

这样一个TESTBENCH就完成了。

原理很简单的,应该很容易明白。

不过在真正的测试中可能不会用太多的这种方式吧,应该会选用测试向量吧,这个的准确性更高一些。

不过怎么样写测试向量,这到是一个有大学问的东西,因为当我们的管脚很多的时候,测试的向量数目是要心指数增长的,当然不可能把所有的情况都测试完成了,只有是测试其中的一部分,这儿怎么样写出有代表性的一组测试向量是很有学问的,应该说是研究的热点吧。

几个testbench要用到的重要语句:(1)wait:无限等待,表示永远挂起,对于汉语wait语句的进程来说,进程在一开始执行一次后面就不执行了;(2)wait on 信号表:敏感信号等待语句,等待敏感信号表中的信号发生变化才执行;(3)wait until 表达式:条件等待语句,当条件表达式中所含的信号发生了变化,并为true时,进程才脱离等待状态;(4)wait for 时间表达式:此语句中声明了一个时间段,从从执行到当前的wait语句开始,只要这个时间段内,进程处于等待状态,超过这段时间,进程自动恢复执行该等待语句的下一条语句。

Testbench基本入门

Testbench基本入门

Testbench入门1 编写testbench目的编写testbench的主要目的是为了对使用硬件描述语言(HDL)设计的电路进行仿真验证,测试设计电路的功能、部分性能是否与预期的目标相符。

编写testbench进行测试的过程如下:1)产生模拟激励(波形);2)将产生的激励加入到被测试模块并观察其输出响应;3)将输出响应与期望进行比较,从而判断设计的正确性。

2 基本的testbench结构module test_bench;// 通常testbench没有输入与输出端口信号或变量定义声明使用initial或always语句来产生激励波形例化设计模块监控和比较输出响应endmodule简单的testbench的结构通常需要建立一个顶层文件,顶层文件没有输入和输出端口。

在顶层文件里,把被测模块和激励产生模块实例化进来,并且把被测模块的端口与激励模块的端口进行对应连接,使得激励可以输入到被测模块。

端口连接的方式有名称和位置关联两种方式,我们常常使用“名称关联”方式。

3 产生激励的一些描写方式3.1 产生时钟的几种方式1)使用initial方式产生占空比50﹪的时钟initialbeginCLK = 0;#delay;forever#(period/2) CLK = ~CLK;end注意:一定要给时钟赋初始值,因为信号的缺省值为z,如果不赋初值,则反相后还是z,时钟就一直处于高阻z状态。

产生的时钟信号如下图所示:2)使用always方式initialCLK = 0;always#(period/2) CLK = ~CLK;3)使用repeat产生确定数目的时钟脉冲initialbeginCLK = 0;repeat(6)#(period/2) CLK = ~CLK;end该例使用repeat产生3个时钟脉冲,产生的波形如下:4)产生占空比非50﹪的时钟initialCLK = 0;alwaysbegin#3 CLK = ~CLK;#2 CLK = ~CLK;end3.2 产生复位信号的几种形式1)异步复位initialbeginRst = 1;#100;Rst = 0;#500;Rst = 1;end2)同步复位1initialbeginRst = 1;@(negedge CLK); // 等待时钟下降沿Rst = 0;#30;@(negedge CLK); // 等待时钟下降沿Rst = 1;end2)同步复位2initialbeginRst = 1;@(negedge CLK); // 等待时钟下降沿repeat (3) @(negedge CLK); // 经过3个时钟下降沿Rst = 1;end4 testbench实例4.1 2-4解码器实例module dec2x4(A, B, Enable, Z);input A, B, Enable;output[3:0] Z;reg [3:0] Z_o;assign Z = Z_o;always@(A or B or Enable)beginif(Enable == 1'b0)Z_o = 4'b1111;elsecase({A, B})2'b00: Z_o = 4'b1110;2'b01: Z_o = 4'b1101;2'b10: Z_o = 4'b1011;2'b11: Z_o = 4'b0111;default: Z_o = 4'b1111;endcaseendendmodule测试模块测试模块::`timescale 1ns/100psmodule testbench;reg a, b, en;wire [3:0] z;//例化被测试模块dec2x4 DUT(.A(a),.B(b),.Enable(en),.Z(z));//产生输入激励initialbeginen = 0;a = 0;b = 0;#10 en = 1;#10 b = 1;#10 a = 1;#10 b = 0;#10 a = 0;#10 $stop;end//显示输出结果always@(en or a or b or z)begin$display("At time %t, input is %b%b%b, output is %b", $time, a, b, en, z);endendmodule下面是测试模块执行时产生的输出和功能仿真波形:4.2 时序检测器下面是一个时序检测器的验证实例。

VHDL Test bench文件的三种生成方式

VHDL Test bench文件的三种生成方式

VHDL TestBench基础TestBench的主要目标Test bench(TB)是一种VHDL代码,目的在于验证HDL模型的功能是否正确。

Test bench是电路规格的一部分,其主要目标是:∙实例化UUT(Unit Under Test, UUT),以前版本也叫DUT(Design Under Test) ∙为UUT产生激励波形∙产生参考输出,并将UUT的输出与参考输出进行比较∙提供测试通过或失败的指示TestBench产生激励的三种方式响应可以在test bench中产生,也可以通过文件进行存储,以备后用。

常用的产生TB的三种方法为:∙直接在testbench中产生∙从矢量中读入∙从单独的激励文件中读入比较流行的做法是使用matlab产生激励文件,由testbench读入该激励文件并将激励馈送到UUT,UUT产生的相应输出以文件的形式存储,由matlab读取并与理想的响应作比较。

1. 简单的TestBench简单的testbench只适合于相对比较简单的设计。

如图1-1所示,在testbench 中只是简单的实例化了一个UUT,激励在testbench中产生,这种方式的testbench 可重用性差。

示意图如下。

UUT tb_adder.vhd代码:仿真结果2. 具有独立激励源的test bench将激励源作为一个文件在test bench中进行实例化,比较适合于具有复杂输入和简单输出的设计,激励源可以是一个实体或者一个进程之类的。

例如下图中adder的输入激励是在一个单独的实体counter中产生的。

激励源tb_counter.vhd代码test bench中的实例化代码(将tb_counter实例化)仿真结果3. 使用TextIO的testbench当设计的输入输出都比较复杂时,尤其是在做复杂的算法仿真时,需要产生多种形式的激励输入,还要对仿真结果输出做复杂的分析时,使用TextIO的test bench具有最高的效率。

ModelSim环境基于VHDL语言的testbench书写[整理]

testbench顾名思义就是一个测试台,它对外没有接口,所以实体部分为空,但它要对要测试的器件提供激励信号,这其实就是最简单的testbench,以下是具体的操作步骤:1.首先基于QuartusII建立的一个新的工程,编译通过,这其实就是我们要测试的源文件DUT(design under test)counter.vhd.library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity counter isport(clk: in std_logic;reset: in std_logic;en: in std_logic;q: out std_logic_vector(3 downto 0));end counter;architecture behave of counter issignal q_n: std_logic_vector(3 downto 0);beginprocess(clk, reset, en, q_n)beginif (reset = '1') thenq_n <= (others => '0');--Òì²½ÇåÁãelsif rising_edge(clk) thenif en = '1' thenq_n <= q_n + 1;end if;end if;end process;q <= q_n;end behave;2.打开ModelSim,指定路径为Quartus工程所在目录;建立新的仿真工程,添加文件(DUT)。

3.编译DUT文件到仿真库中(右键DUT,选择compile).4.写testbench文件(counter_tb.vhd)。

VHDL的testbench的编写

VHDL的testbench的编写大多数硬件设计人员对verilog的testbench比较熟悉,那是因为verilog被设计出来的目的就是为了用于测试使用,也正是因为这样verilog的语法规则才被设计得更像C语言,而verilog发展到后来却因为它更接近C语言的语法规则,设计起来更加方便,不像VHDL那也死板严密,所以verilog 又渐渐受到硬件设计者们的青睐。

但其实VHDL在最开始也是具有测试能力的,而且它的语法严密,但我们同样可以用它来编写我们的测试文件。

下面以一个8bit计数器为例子给出个简单的testbench模板及注释:通过编写testbench来仿真和通过拖波形来仿真,最大的好处就是,当测试数据无比庞大时,可以简易得通过testbench中的算法来实现,而另一个更为重要的方面就是,可以通过testbench对数据文件进行读写操作,从而简化我们的仿真工作。

首先介绍下时间控制语句——wait:(其实wait语句是通过控制仿真的两种状态——执行和挂起,来控制时间的)1.wait——无线等待;语法【wait;】,类似于Verilog中的¥Stop2.wait on——敏感信号量变化;语法【wait on 信号;】,表示当信号发生变化的时候,仿真开始继续执行,从而结束挂起状态3.wait until——条件满足;语法【waituntil 表达式】,表达式为一个布尔表达式,表示当表达式为“真”时,仿真继续执行,结束挂起状态4.wait for——时间控制;语法【waitfor 时间表达式】,例:【wait for 30ns;】VHDL也提供了文件I/O的操作,以下简单介绍在我们大部分情况下如何通过VHDL来进行文件操作。

file类型:文件句柄,用于定义文件。

语法1【file 文件变量名:text is 读取或者写入类型“文件名”;】text——文件类型为文本类型,读取类型为in,写入类型为out;语法2【file 文件变量名:text;】只是定义了文件变量名,并没有给赋予初值。

VerilogHDL及其Testbench编写方法

Verilog HDL及其Testbench总结(欢迎批评指正:jackhuan@)1 Verilog HDL的基本观点1) 观点1:module内每个基本模块之间是并行运行的。

2) 观点2:每个模块相当于一个连续赋值的过程。

3) 观点3:方程和任务是共享代码的最基本方式。

4) 观点4:同语言可用于生成模拟激励和指定测试的验证约束条件。

5) 观点5:库的概念相当于Visual C++中的DLL概念。

6) 观点6:文件与文件之间的关系可以使用C++中的*.h和*.cpp之关系理解。

2 设计建模的三种方式1) 行为描述方式。

过程化结构,每个结构之间是并行的。

2) 数据流方式。

连续赋值语句方式,每个赋值语句之间是并行的,且赋值语句和结构之间是并行的。

3) 结构化方式。

门和模块实例化语句。

3 两者数据类型1) 线网数据类型wire:表示构件间的物理连线;2) 寄存器数据类型reg:表示抽象的数据存储元件。

4 几个概念1) 模块(module)。

模块是Verilog HDL的基本描述耽误,用于描述某个设计的功能或结构及其与其它模块通信的外部端口。

一个设计的结构可以使用开关级原语、门级原语和用户定义的原语方式描述;数据流行为使用使用连续赋值语句进行描述;时序行为使用过程结构描述。

模块的声明部分和语句可以散布在模块中的任何地方,但变量、寄存器、线网和参数说明必须在使用前出现。

2) 只有寄存器类型数据(reg/integer)能够在initial和always语句中被赋值。

3) 阻塞性和非阻塞性赋值。

理解这两个概念在学习verilog HDL中非常重要。

决定了时序的正确与否。

阻塞性赋值的概念是在该条赋值语句执行完成后再执行后面的语句,也就是说在执行该语句时,后面的语句是挂起的。

而非阻塞性赋值的结果在何时执行是不知道的,但是可以预见在某个时间步内该语句一定能够执行完成,从这个意义上来看,非阻塞性赋值的语句类似于并行语句,稍有处理不当,会引发多驱动源问题。

怎样写testbench

怎样写testbench本文的实际编程环境:ISE 6.2i.03ModelSim 5.8 SESynplify Pro 7.6编程语言 VHDL在ISE中调用ModelSim进行仿真一、基本概念和基础知识Testbench不仅要产生激励也就是输入,还要验证响应也就是输出。

当然也可以只产生激励,然后通过波形窗口通过人工的方法去验证波形,这种方法只能适用于小规模的设计。

在ISE环境中,当前资源操作窗显示了资源管理窗口中选中的资源文件能进行的相关操作。

在资源管理窗口选中了testbench文件后,在当前资源操作窗显示的ModelSim Simulator中显示了4种能进行的模拟操作,分别是:Simulator Behavioral Model(功能仿真)、Simulator Post-translate VHDL Model(翻译后仿真)、Simulator Post-Map VHDL Model(映射后仿真)、Simulator Post-Place & Route VHDL Model(布局布线后仿真)。

如图1所示:图1l Simulator Behavioral Model 也就是所说的功能仿真、行为仿真、前仿真。

验证功能是否正确,这是设计的第一步。

功能仿真正确的程序不一定能被正确综合,也就是硬件实现。

有的在综合时报错误,有的虽然能综合但结果并不正确。

当然,功能仿真如果都不能通过,以后的步骤也就无法进行。

这是必做的仿真。

l Simulator Post-translate VHDL Model 也就是翻译后仿真。

对源程序进行编译后首先排除了语法错误,对一些像类属命令(Generic)、生成语句(Generate)等进行了展开。

不是必做的仿真。

l Simulator Post-Map VHDL Model也就是映射后仿真。

不同的器件内部结构也不尽相同,映射的作用就是将综合后产生的网表文件对应到实际的器件上去。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

弄了好长时间vhdl,一直对testbench很迷惑。

前几天静下心来好好看了下资料,终于会写简单的testbench了。

六进制计数器的代码[c-sharp]view plaincopy1.library ieee;e ieee.std_logic_1164.all;e ieee.std_logic_arith.all;4.--use ieee.std_logic_unsigned.all;5.6.entity cnt6 is7. port8. (clr,en,clk :in std_logic;9. q :out std_logic_vector(2 downto 0)10. );11.end entity;12.13.architecture rtl of cnt6 is14.signal tmp :std_logic_vector(2 downto 0);15.begin16. process(clk)17.-- variable q6:integer;18. begin19.if(clk'event and clk='1') then20.if(clr='0')then21. tmp<="000";22. elsif(en='1') then23.if(tmp="101")then24. tmp<="000";25.else26. tmp<=unsigned(tmp)+'1';27. end if;28. end if;29. end if;30. q<=tmp;31.-- qa<=q(0);32. -- qb<=q(1);33. -- qc<=q(2);34. end process;35.end rtl;六进制计数器testbench的代码[c-sharp]view plaincopy1.library ieee;e ieee.std_logic_1164.all;3.4.entity cnt6_tb is5.end cnt6_tb;6.7.architecture rtl of cnt6_tb is8. component cnt69. port(10. clr,en,clk :in std_logic;11. q :out std_logic_vector(2 downto 0)12. );13. end component;14.15. signal clr :std_logic:='0';16. signal en :std_logic:='0';17. signal clk :std_logic:='0';18. signal q :std_logic_vector(2 downto 0);19.20. constant clk_period :time :=20 ns;21. begin22. instant:cnt6 port map23. (24. clk=>clk,en=>en,clr=>clr,q=>q25. );26. clk_gen:process27. begin28. wait for clk_period/2;29. clk<='1';30. wait for clk_period/2;31. clk<='0';32. end process;33.34. clr_gen:process35. begin36. clr<='0';37. wait for 30 ns;38. clr<='1';39. wait;40. end process;41.42. en_gen:process43. begin44. en<='0';45. wait for 50ns;46. en<='1';47. wait;48. end process;49.end rtl;其实testbench也有自己固定的一套格式,总结如下:[c-sharp]view plaincopy1.--测试平台文件(testbench)的基本结构2.library ieee;e ieee.std_logic_1164.all;4.5.entity test_bench is --测试平台文件的空实体(不需要端口定义)6.7.end test_bench;8.9.architecture tb_behavior of test_bench is10.11. component entity_under_test --被测试元件的声明12. port(13. list-of-ports-theri-types-and-modes14. );15. end component;16.17.begin18. instantiation:entity_under_test port map19. (20. port-associations21. );22.23. process() --产生时钟信号24.……25. end process;26.27. process() --产生激励源28.……29. end process;30.end tb_behavior;31.32.-------------------------------------------------------------------33.--简单计数程序源码34.library ieee;e ieee.std_logic_1164.all;e ieee.std_logic_unsigned.all;e ieee.std_logic_unsigned.all;38.39.entity sim_counter is40. port(41. clk :in std_logic;42. reset :in std_logic;43. count :out std_logic_vector(3 downto 0)44. );45.end entity;46.47.architecture behavioral of sim_counter is48.49.signal temp :std_logic_vector(3 downto 0);50.51.begin52. process(clk,reset)53. begin54.if reset='1' then55. temp<="0000";56. elsif clk'event and clk='1' then57. temp<=temp+1;58. end if;59. end process;60. count<=temp;61.end behavioral;62.63.-------------------------------------------------------------------64.--简单计数程序,测试文件代码(testbench)65.library ieee;e ieee.std_logic_1164.all;e ieee.std_logic_unsigned.all;e ieee.numeric_std.all;69.70.entity counter_tb_vhd is --测试平台实体71.end counter_tb_vhd;72.73.architecture behavior of counter_tb_vhd is74. --被测试元件(DUT)的声明75. component sim_counter76. port(77. clk :in std_logic;78. reset :in std_logic;79. count :out std_logic_vector(3 downto 0)80. );81. end component;82. --输入信号83. signal clk:std_logic:='0';84. signal reset :std_logic:='0';85. --输出信号86. signal count :std_logic_vector(3 downto 0);87.88. constant clk_period :time :=20 ns; --时钟周期的定义89.90.begin91. dut:sim_counter port map(92. clk=>clk,reset=>reset,counter=>counter93. );94. clk_gen:process95. begin96. clk='1';97. wait for clk_period/2;98. clk='0';99. wait for clk_period/2;100. end process;101.102. tb:process --激励信号103. begin104. wait for 20 ns;105. reset<='1';106. wait for 20 ns;107. reset<='0';108. wait for 200 ns;109. wait; --will wait forever;110. end process;111.end;112.113.114.--激励信号的产生方式115.--1.以一定的离散时间间隔产生激励信号的波形116.--2.基于实体的状态产生激励信号,也就是说基于实体的输出响应产生激励信号117.118.--两种常用的复位信号119.--1.周期性的激励信号,如时钟120.--2.时序变化的激励型号,如复位121.122.--eg.产生不对称时钟信号123. w_clk<='0' after period/4 when w_clk='1'else124.'1' after 3*period/4 when w_clk='0'else125.'0';126.127.--eg.产生堆成时钟信号,process语句128.clk_gen1:process129.constan clk_period := 40 ns;130.begin131. clk='1';132. wait for clk_period/2;133. clk='0';134. wait for clk_period/2;135.end process;如果自己不想写这些testbench的这些固定格式,可以在quartus里自动生成testbench文件的模板,然后往里面写信号就行了步骤:processing->start->start test bench template write这里需要注意的是要在仿真选项里选择一个仿真工具,然后才会生成testbench自动生成的testbench模板格式如下:[c-sharp]view plaincopy1.-- Copyright (C) 1991-2008 Altera Corporation2.-- Your use of Altera Corporation's design tools, logic functions3.-- and other software and tools, and its AMPP partner logic4.-- functions, and any output files from any of the foregoing5.-- (including device programming or simulation files), and any6.-- associated documentation or information are expressly subject7.-- to the terms and conditions of the Altera Program License8.-- Subscription Agreement, Altera MegaCore Function License9.-- Agreement, or other applicable license agreement, including,10.-- without limitation, that your use is for the sole purpose of11.-- programming logic devices manufactured by Altera and sold by12.-- Altera or its authorized distributors. Please refer to the13.-- applicable agreement for further details.14.15.-- ************************************************************************** *16.-- This file contains a Vhdl test bench template that is freely editable to17.-- suit user's needs .Comments are provided in each section to help the user18.-- fill out necessary details.19.-- ************************************************************************** *20.-- Generated on "03/13/2011 20:05:04"21.22.-- Vhdl Test Bench template for design : cnt623.--24.-- Simulation tool : ModelSim (VHDL)25.--26.27.LIBRARY ieee;E ieee.std_logic_1164.all;29.30.ENTITY cnt6_vhd_tst IS --测试平台文件的空实体(不需要端口定义)31.END cnt6_vhd_tst;32.ARCHITECTURE cnt6_arch OF cnt6_vhd_tst IS33.-- constants34.-- signals35.SIGNAL clk : STD_LOGIC; --内部信号,可与被测试元件端口一致36.SIGNAL clr : STD_LOGIC;37.SIGNAL en : STD_LOGIC;38.SIGNAL q : STD_LOGIC_VECTOR(2 DOWNTO 0);39.PONENT cnt6 --被测试元件的声明41. PORT (42. clk : IN STD_LOGIC;43. clr : IN STD_LOGIC;44. en : IN STD_LOGIC;45. q : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)46. );47.END COMPONENT;48.BEGIN49. i1 : cnt6 --实例名称,i为 instance 缩写50. PORT MAP ( --端口映射,把testbench 内部信号与被测试元件端口一一对应即可51.-- list connections between master ports and signals52. clk => clk,53. clr => clr,54. en => en,55. q => q56. );57.init : PROCESS --初始化进程58.-- variable declarations59.BEGIN60. -- code that executes only once61.WAIT;62.END PROCESS init;63.always : PROCESS --激励,即主时钟、其他输入信号定制。

相关文档
最新文档