乖乖妮 发表于 2017-6-9 15:28

为什么要写TestBench?一个帖子教你玩转TestBench

TestBench基本概念:
测试激励->待测设计->观察比对波形/在终端打印或生产文本/自动对比输出结果
TestBench编写三步曲
1:对被测试设计的顶层接口进行例化
2:给被测试设计的输入接口添加激励
3:判断被测试设计的输出想要是否满足设计要求
TestBench内容主要分为
1:时钟的产生
2:复位的产生
3:其他激励信号的产生(用户自定义 )
第一种时钟产生方式
//时钟产生
//定义时钟周期为20ns,已经定义'timescale 1ns/1ps 单位/精度
parameter PERIOD = 20;
initial
begin
    clk = 0;
    forever
      #(PERIOD/2) clk = ~clk;
end
parameter是参数的意思类似于#define
initial是初始化
begin end类似于括号的作用
clk =0 ;初始化时钟为低电平
forever是程序一直执行的意思
#10 表示每间隔10ns执行一次clk=~clk;clk取反一次
第二种时钟产生方式
//时钟产生
//定义时钟周期为20ns,已经定义'timescale 1ns/1ps 单位/精度
parameter PERIOD = 20;
always
begin
    #(PERIOD/2) clk = 0;
    #(PERIOD/2) clk = 1;   
end
always是从第一条语句执行到最后一条语句,再从第一条语句执行

复位信号的产生
//复位产生
initial
begin
//复位低电平有效 已经定义了'timescale 1ns/1ps
rst_n = 0;//复位状态
#100;//100ns延时
rst_n = 1; //撤销复位
end

//例子:
initial
begin
    reset_task(100);//复位100ns,已经定义了'timescale 1ns/1ps
end
//任务的写法
task reset_task;
input reset_time;//复位事件
begin
   reset=0;
   #reset_time;
   reset=1;
end
endtask
task 是任务名
之后是输入输出
再紧跟是begin end

实例解说
//自己定义
`timescale 1 ps/ 1 ps
//verilog模块名
module verilog_ex2_vlg_tst();
reg clk;//数据类型与顶层文件的数据类型不同
reg rst_n;                                          
wire clk_div;
//verilog_ex2是被测试设计的顶层模块名,顶层模块例化为i1,也可以为i2 i3 i4
//括号中是接口
//.clk .clk_div .rst_n这3个.后面的引脚必须和顶层文件中的引脚名一致
//clk是对应得,接口引脚都是对应的                     
verilog_ex2 i1 (
// port map - connection between master ports and signals/registers   
.clk(clk),
.clk_div(clk_div),
.rst_n(rst_n)
);
initial                                                
begin                                                
// code that executes only once                        
// insert code here --> begin                        
clk = 0;
forever
   #10 clk = ~clk;
// --> end                                             
$display("Running testbench");                     
end
initial
begin
rst_n = 0;
#1000;
rst_n = 1;
#5_000;//delay 5us
$stop;
end

//i1中的的.clk 后面的是clk也可以改为clk0实例代码如下:
`timescale 1 ps/ 1 ps
module verilog_ex2_vlg_tst();
reg clk0;//clk0
reg rst_n;                                             
wire clk_div;

verilog_ex2 i1 (
.clk(clk0),//clk0
.clk_div(clk_div),
.rst_n(rst_n)
);
initial                                                
begin                                                

clk0 = 0;
forever
   #10 clk0 = ~clk0;                  
end
initial
begin
rst_n = 0;
#1000;
rst_n = 1;
#5_000;//delay 5us
$stop;
end


在顶层文件verilog_ex2.v 中
clk是输入引脚,是测试脚本的输出
clk_div是输出引脚,是测试脚本的输入
rst_n是输入引脚,是测试脚本的输出
#10 clk0 = ~clk0;表示每间隔10ns时间clk取反一次
#1000;表示延时1000ns
$stop;表示测试时间结束
编写完之后设置
编写完之后Tools->EDA RTL Simulation就可以ModelSim仿真了
好书推荐:
吴继华,王诚《设计与验证Verilog HDL》
Janick Bergeron 《Writing Testbench》
张春,陈新凯,李晓雯 《编写测试平台》

Testbench 应用实例:
先新建一个Quartu工程
工程文件夹verilog_EX2是文件夹名;
工程名为verilog_ex2;
工程设置为仿真工具为ModelSim,而不是ModelSim-Altera,
我使用的是ModelSim6.5 SE版本。
新建一个verilog HDL文件
输入以下代码:
/////////////////////////////////////////////////////////////////////////////
module verilog_ex2(
clk,
rst_n,
clk_div
);
input clk;//20MHz时钟输入信号
input rst_n;//低电平复位信号
output clk_div;//分频输出信号,连接到蜂鸣器
//---------------------------------------------------------
reg cnt;
always @(posedge clk or negedge rst_n)
if(!rst_n)
    cnt <= 1'd0; //异步复位
else
    cnt <= ~cnt ;
assign clk_div = cnt;
endmodule
////////////////////////////////////////////////////////////////////////////////////
保存为verilog_ex2.v文件
编译Quartus工程。
编译之后有警告:
再把不用的引脚设置为三态输入,配置3个信号的引脚。
在使用TestBench之前就要设置ModelSim,
Tools -> Options-> General -> EDA Tool Options界面下的ModelSim路径设置为D:\modeltech_6.5\win32
(我的ModelSim6.5 SE安装路径是D:\modeltech_6.5\win32,关于ModelSim安装和破解的问题,网上有许多的教程)
在一个工程中新建一个TestBench的步骤:
由于新建一个工程之后,并没有TestBench文件,因此要建立一个Testbench文件
Processing->Start->Start Test Bench Template Writer
新建一个TestBench模板,会提示Test Bench Template Writer was successful,成功新建模板
接下来要打开新建的模板
File->Open->simulation文件夹/modelsim文件夹/verilog_ex2.vt
选择的时候注意把文件类型选择为 :All Files
打开verilog_ex2.vt文件后,删除原有代码写入:
//////////////////////////////////////////////////////////////////////////////////////////
`timescale 1 ns/ 1 ps
module verilog_ex2_vlg_tst();
reg clk;
reg rst_n;                                          
wire clk_div;                     
verilog_ex2 i1 (
.clk(clk),
.clk_div(clk_div),
.rst_n(rst_n)
);
initial                                                
begin                                                                        
clk = 0;
forever
   #10 clk = ~clk;                              
end
initial
begin
rst_n = 0;
#1000;
rst_n = 1;
#5_000;//delay 5us
$stop;
end                                             
endmodule
//////////////////////////////////////////////////////////////////////////////////////////
保存文件
编译Quartus工程
以上只是新建了一个TestBench
之后就要向工程中添加Test脚本的内容
Assignment->Settings->EDA Tool Setting->Simulation
界面中Tool name选择Modelsim,
在NativeLink Settings中勾选Compile test bench:
单击后面的TestBenches,之后单击New,
出现一个New Test Bench Settings界面中
Test bench name(测试凳名称)中输入:verilog_ex2
Top Level module in test bench (测试凳中的顶层模块名):verilog_ex2_vlg_tst
Top Level module in test bench (测试凳中的顶层模块名)的输入查找方式是在Testbench中查找module后面的内容有:
module verilog_ex2_vlg_tst();就可以找到了。
Design instance name in testbench:实例化的模块名:i1也可以在testbench中找到
在下面的Test bench Files中的File name中单击按钮,选择打开verilog_ex2.vt,再单击Add按钮加入testbench 文件
依次单击OK,退出设置界面。
再次重新编译Quartus工程文件
想查看Testbench 的结果就在Quartus工具中:
Tools->Run EDA Simulation tool->EDA RTL Simulation
进行RTL级仿真就可以看到Modelsim仿真的波形了

仿真完之后需要做一个时序约束:
Tools->TimeQuest Timing Analyzer
初次打开时会提示:
No SDC files were found in the Quartus Settings File and verilog_ex2.sdc doesn't exist.
Would you like to generator an SDC file from the Quartus Settings file?
单击是按钮
双击Create Timing Netlist
双击Read SDC File
在TimeQuest Timing Analyzer 界面中的工具栏中
Constraints->Create Clock
Clock name时钟名称输入:sys_clk
Period周期是:50ns(时钟晶振是 20MHz)
单击Targets后面的按钮:
单击list选择clk,单击,选择OK按钮,单击Run。
双击Update Timing Netlist
双击Write SDC file,
打开SDC文件就可以看到
create_clock -name {sys_clk} -period 50.000 -waveform { 0.000 25.000 }
周期是50ns,
再重新编译Quartus工程,编译之后,工程就会有新的布局布线。
如果没有达到实序约束就会在Cirtical Waring中产生警告。
编译之后再到TimeQuest中查看一下。
双击Create Timing Netlist
双击Read SDC File
在Datasheet中Report Fmax Summary最大值的报告(主频最高)
再看一下具体的时序约束的路径;
Macros->Report All Core Timings
可以看到Core clock setup和Core clock hold的两条报告
查看RTL Viewer 和Technolgy Map Viewer
在Fitter中查看Chip Planner。

页: [1]
查看完整版本: 为什么要写TestBench?一个帖子教你玩转TestBench