7038|5

5979

帖子

8

TA的资源

版主

楼主
 

【转帖】玩转FPGA之: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[15:0] 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 } [get_ports *]
周期是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。

另一篇比较好的可以参考:


Quartus ii与Modelsim-altera 6.5b联调前仿真http://yervant.blog.163.com/blog/static/1997951242012429111536545/
此帖出自FPGA/CPLD论坛

最新回复

感谢分享!!  详情 回复 发表于 2018-8-24 13:22
点赞 关注(4)
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 

回复
举报

147

帖子

9

TA的资源

一粒金砂(中级)

沙发
 
最爱看chenzhufly大神的帖子
此帖出自FPGA/CPLD论坛
 
 

回复

5979

帖子

8

TA的资源

版主

板凳
 
看到比较好的 和大家分享一下 哈哈
此帖出自FPGA/CPLD论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

288

帖子

0

TA的资源

一粒金砂(高级)

4
 
如图,看别人的视频教程里面,在testbench设置时候,直接复制“blocking_vlg_tst”到top level module in test bench,在testbench name里面就自动生成“blocking_vlg_tst”,然后别人就把testbench name改成“blocking”。后来我在仿真的时候,没有更改testbench name直接是“blocking_vlg_tst”,居然也可以仿真出来,所以想问一下,到底要不要改这个testbench name。。。。我的工程名是blocking,文件是blocking.v

testbench的设置.jpg (59.52 KB, 下载次数: 2)

testbench的设置.jpg
此帖出自FPGA/CPLD论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 
讲的很好!
此帖出自FPGA/CPLD论坛
 
 
 

回复

128

帖子

0

TA的资源

一粒金砂(初级)

6
 
感谢分享!!
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表