Testbench编写技巧
一、基本架构(常用模板)
`timescale 1ns/1ps //时间精度
`define Clock //时钟周期 module my_design_tb; //==================<端口>==================================================
reg clk ; //时钟,50Mhz
reg rst_n ; //复位,低电平有效
reg [XX:] in ; //
wire [XX:] out ; // //--------------------------------------------------------------------------
//-- 模块例化
//--------------------------------------------------------------------------
my_design u_my_design
(
.clk (clk ),
.rst_n (rst_n ),
.in (in ),
.out (out )
); //----------------------------------------------------------------------
//-- 时钟信号和复位信号
//----------------------------------------------------------------------
initial begin
clk = ;
forever
#(`Clock/) clk = ~clk;
end initial begin
rst_n = ; #(`Clock*+);
rst_n = ;
end //----------------------------------------------------------------------
//-- 设计输入信号
//----------------------------------------------------------------------
initial begin
in = ;
#(`Clock*+); //初始化完成 $stop;
end endmodule
二、时钟激励设计
`timescale 1ns/1ps //时间精度
`define Clock //时钟周期 //==========================================================================
//== 方法一,50%占空比
//==========================================================================
initial begin
clk = ;
forever
#(`Clock/) clk = ~clk;
end //==========================================================================
//== 方法二,50%占空比
//==========================================================================
initial begin
clk = ;
always
#(`Clock/) clk = ~clk;
end //==========================================================================
//== 方法三,产生固定输入的时钟脉冲
//==========================================================================
initial begin
clk = ;
repeat()
#(`Clock/) clk = ~clk;
end //==========================================================================
//== 方法四,非50%占空比
//==========================================================================
initial begin
clk = ;
forever begin
#((`Clock/)-) clk = ;
#((`Clock/)+) clk = ;
end
end
三、复位信号设计
`timescale 1ns/1ps //时间精度
`define Clock //时钟周期 //==========================================================================
//== 方法一,异步复位
//==========================================================================
initial begin
rst_n = ; #(`Clock*+);
rst_n = ;
end //==========================================================================
//== 方法二,同步复位
//==========================================================================
initial begin
rst_n = ; #(`Clock*);
rst_n = ;
end
四、task常用方法
//==========================================================================
//== 输入信号任务封装
//==========================================================================
task i_data;
input [:] dut_data;
begin
@(posedge data_en); send_data=;
@(posedge data_en); send_data=dut_data[];
@(posedge data_en); send_data=dut_data[];
@(posedge data_en); send_data=dut_data[];
@(posedge data_en); send_data=dut_data[];
@(posedge data_en); send_data=dut_data[];
@(posedge data_en); send_data=dut_data[];
@(posedge data_en); send_data=dut_data[];
@(posedge data_en); send_data=dut_data[];
@(posedge data_en); send_data=;
#;
end
endtask //调用方法:i_data(8'hXX); //==========================================================================
//== 多输入信号任务封装
//==========================================================================
task more_input;
input [ :] a;
input [ :] b;
input [:] times;
output [ :] c;
begin
repeat(times) @(posedge clk) //等待 times 个时钟上升沿
c=a+b;
end
endtask //调用方法:more_input(x,y,t,z); //按声明顺序
五、@和wait
//==========================================================================
//== @为边沿触发
//==========================================================================
initial begin
start = ;
repeat() @(posedge clk) //等待5个时钟上升沿
start = ;
end //==========================================================================
//== wait为电平触发
//==========================================================================
initial begin
start = ;
wait(en); //等待en==1
start = ;
end
六、常用仿真控制语句
$random //产生随机数
$random % n //产生范围 {-n,n} 的随机数
{$random} % n //产生范围 { 0,n} 的随机数 $stop //停止运行仿真,Modelsim 中可继续仿真
$finish //结束运行仿真,Modelsim 中不可继续仿真 $stop(n) //带参数系统任务,根据参数 0、1、2 不同,输出仿真信息
$finish(n) //带参数系统任务,根据参数 0、1、2 不同,输出仿真信息
/*------------------------------------------------------------------------*\
0:不输出任何信息
1:输出当前仿真时刻和位置
2:输出当前仿真时刻、位置和仿真过程中用到的 memory 以及 CPU 时间的统计
\*------------------------------------------------------------------------*/
七、仿真终端显示描述
$monitor //仿真打印输出,打印出仿真过程中的变量,使其终端显示
/*------------------------------------------------------------------------*\
$monitor($time,,,"clk=%d reset=%d out=%d",clk,reset,out);
\*------------------------------------------------------------------------*/ $display //终端打印字符串,显示仿真结果等
/*------------------------------------------------------------------------*\
$display(” Simulation start ! ");
$display(” At time %t,input is %b%b%b,output is %b",$time,a,b,en,z);
\*------------------------------------------------------------------------*/ $time //返回 64 位整型时间 $stime //返回 32 位整型时间 $realtime //实行实时模拟时间
八、文本输入
$readmemb/$readmemh("<数据文件名>",<存储器名>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>);
$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>); $readmemb
/*------------------------------------------------------------------------*\
读取二进制数据,读取文件内容只能包含:空白位置,注释行,二进制数
数据中不能包含位宽说明和格式说明,每个数字必须是二进制数字。
\*------------------------------------------------------------------------*/ $readmemh
/*------------------------------------------------------------------------*\
读取十六进制数据,读取文件内容只能包含:空白位置,注释行,十六进制数
数据中不能包含位宽说明和格式说明,每个数字必须是十六进制数字.
\*------------------------------------------------------------------------*/
例如:
/*------------------------------------------------------------------------*\
//mem.dat 文件内容
@001
AB CD
@003
A1
\*------------------------------------------------------------------------*/
reg [:] memory[:0] ;//声明 8 个 8 位存储单元
integer i ; initial begin
$readmemh("mem.dat",memory);//读取系统文件到存储器中的给定地址
for(i=;i<;i=i+)
$display("Memory[%d]=%h",i,memory[i]);
end /*------------------------------------------------------------------------*\
//仿真输出为
Memory[0] = xx;
Memory[1] = AB;
Memory[2] = CD;
Memory[3] = A1;
\*------------------------------------------------------------------------*/
九、简单的仿真案例
1.设计文件
module add
//==================<端口>==================================================
(
input wire [ :] a ,
input wire [:] b , // 输入信号b
input wire [:] c , // 输入信号a
input wire [:] d , // 输入信号b
output wire [:] e // 求和输出信号
); //==================<设计>==================================================
assign e = a + b + c + d; endmodule
2.仿真文件
`timescale 1ns/1ps //时间精度 module add_tb; //==================<端口>==================================================
//输入输出---------------------------------------
reg [:] a ;
reg [:] b ;
reg [:] c ;
reg [:] d ;
wire [:] e ;
//中间变量---------------------------------------
reg [:] i ; //--------------------------------------------------------------------------
//-- 模块例化
//--------------------------------------------------------------------------
add u_add
(
.a (a ),
.b (b ),
.c (c ),
.d (d ),
.e (e )
); //----------------------------------------------------------------------
//-- 设计输入信号
//----------------------------------------------------------------------
initial begin
a = ;
b = ;
c = ;
d = ;
for(i=;i<;i=i+) begin
#;
a = i;
b = i;
c = i;
d = i;
end
end initial begin
$monitor($time,,"%d + %d + %d + %d ={%d}",a,b,c,d,e); // 信号打印输出
#;
$stop;
end endmodule
3.Modelsim仿真
参考资料:
[1]米联客FPGA教程
[2]吴厚航. 深入浅出玩转FPGA[M]. 北京航空航天大学出版社, 2013.
Testbench编写技巧的更多相关文章
- 14条最佳JS代码编写技巧
http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...
- Flutter实战视频-移动电商-17.首页_楼层组件的编写技巧
17.首页_楼层组件的编写技巧 博客地址: https://jspang.com/post/FlutterShop.html#toc-b50 楼层的效果: 标题 stlessW快速生成: 接收一个St ...
- bug的编写技巧与级别划分
一.bug编写技巧 确.清晰.简洁.完整.一致 二.bug包含的要素 缺陷ID.缺陷标题.测试环境.缺陷发现日期时间.缺陷提交人 缺陷优先级.缺陷严重等级.发现缺陷软件版本.测试类型 缺陷复现步骤.期 ...
- X86逆向15:OD脚本的编写技巧
本章节我们将学习OD脚本的使用与编写技巧,脚本有啥用呢?脚本的用处非常的大,比如我们要对按钮事件进行批量下断点,此时使用自动化脚本将大大减小我们的工作量,再比如有些比较简单的压缩壳需要脱壳,此时我们也 ...
- Hexo之旅(四):文章编写技巧
hexo 编写文章可以使用以下命令创建hexo new "文件名" #创建的文章会在_pots目录下文章的后缀名是以md命名的文件格式,遵循markdown语法,所以编写文章可以使 ...
- CSS编写技巧
1.尽量少的使用全局的重置代码 全局重置代码:*{margin:0; padding:0;}对于熟悉CSS的人来说并不陌生,并且有很多人的第一句CSS代码就是这句.它可以避免不同浏览器的默认间距不同而 ...
- Grunt配置文件编写技巧及示范
受益于grunt这么久,继续分享关于grunt的一些技巧.grunt确实是前端项目中不可或缺的提升效率的工具.第一次接触grunt是在去年7月份,开始有接触LESS.Coffee Script的等需要 ...
- 高效率JavaScript编写技巧
最近在编写一个JavaScript框架,发现有很多细节注意得不够,担心长时间积累会导致框架实际应用的时候出现严重的效率问题.于是开始关注JavaScript提高效率的一些技巧,在这里分享给大家. 1. ...
- 简历编写技巧-java开发工程师简历实战
看到一遍简历编写的文章 想到也快找工作了 早晚能够用上 现在摘录如下 640?wx_fmt=jpeg 工欲善其事,必先利其器,这是自古以来的道理.所以如果想找到一份好的工作,一定要先整理一份好的简历. ...
随机推荐
- 24-ESP8266 SDK开发基础入门篇--Android TCP客户端.控制 Wi-Fi输出PWM的占空比,调节LED亮度
https://www.cnblogs.com/yangfengwu/p/11204436.html 刚才有人说需要点鸡汤.... 我想想哈;我还没问关于哪方面的鸡汤呢!!! 我所一直走的路线 第一: ...
- 多项式总结&多项式板子
多项式总结&多项式板子 三角/反三角是不可能放的(也不可能真香的 多项式乘法(DFT,FFT,NTT,MTT) 背板子 前置知识:泰勒展开 如果\(f(x)\)在\(x_0\)处存在\(n\) ...
- CSS3 之filter毛玻璃效果弹窗
先看效果: 效果主要用css3的滤镜属性实现,代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- GoCN每日新闻(2019-10-07)
GoCN每日新闻(2019-10-07) 国庆专辑:GopherChina 祝大家国庆节快乐(假期最后一天) GoCN每日新闻(2019-10-07) 1. Go 不好的点:JSON 解析的探 ...
- java基础-数据输入
import java.util.Scanner; public class ScannerTest { public static void main(String[] args) { //身高未知 ...
- 你对SQA的职责和工作活动(如软件度量)的理解?
SQA就是独立于软件开发的项目组,通过对软件开发过程的监控,来保证软件的开发流程按照指定的CMM规程(如果有相应的CMM规程),对于不符合项及时提出建议和改进方案,必要时可以向高层经理汇报以求问题的解 ...
- python 得到列表的第二大的元素
code #coding=utf- l=[,,,,,,] max1=l[] max2=l[] if(max1>max2): pass else: max1,max2=max2,max1 :]: ...
- PHP 之Mysql优化
一.建立索引 普通索引 index: 对关键字没有要求. 唯一索引 unique index: 要求关键字不能重复.同时增加唯一约束. 主键索引 primary key: 要求关键字不能重复,也不能为 ...
- avalon数据已更新,视图未更新的bug修复
$computed: { pinlei() { var key = this.currentProduct.key || 'youpin'; console.log(key, "我是key& ...
- ueditor div style被过滤 解决办法
上周开发中有用到开源的富文本编辑器UEditor,在使用的过程中遇到了样式被过滤无法显示问题,经过一番折腾终解决,此外,还有一些关于获取前台界面元素的一些总结. 1. UEditor样式被过滤无法显示 ...