一、基本架构(常用模板)

 `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编写技巧的更多相关文章

  1. 14条最佳JS代码编写技巧

    http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...

  2. Flutter实战视频-移动电商-17.首页_楼层组件的编写技巧

    17.首页_楼层组件的编写技巧 博客地址: https://jspang.com/post/FlutterShop.html#toc-b50 楼层的效果: 标题 stlessW快速生成: 接收一个St ...

  3. bug的编写技巧与级别划分

    一.bug编写技巧 确.清晰.简洁.完整.一致 二.bug包含的要素 缺陷ID.缺陷标题.测试环境.缺陷发现日期时间.缺陷提交人 缺陷优先级.缺陷严重等级.发现缺陷软件版本.测试类型 缺陷复现步骤.期 ...

  4. X86逆向15:OD脚本的编写技巧

    本章节我们将学习OD脚本的使用与编写技巧,脚本有啥用呢?脚本的用处非常的大,比如我们要对按钮事件进行批量下断点,此时使用自动化脚本将大大减小我们的工作量,再比如有些比较简单的压缩壳需要脱壳,此时我们也 ...

  5. Hexo之旅(四):文章编写技巧

    hexo 编写文章可以使用以下命令创建hexo new "文件名" #创建的文章会在_pots目录下文章的后缀名是以md命名的文件格式,遵循markdown语法,所以编写文章可以使 ...

  6. CSS编写技巧

    1.尽量少的使用全局的重置代码 全局重置代码:*{margin:0; padding:0;}对于熟悉CSS的人来说并不陌生,并且有很多人的第一句CSS代码就是这句.它可以避免不同浏览器的默认间距不同而 ...

  7. Grunt配置文件编写技巧及示范

    受益于grunt这么久,继续分享关于grunt的一些技巧.grunt确实是前端项目中不可或缺的提升效率的工具.第一次接触grunt是在去年7月份,开始有接触LESS.Coffee Script的等需要 ...

  8. 高效率JavaScript编写技巧

    最近在编写一个JavaScript框架,发现有很多细节注意得不够,担心长时间积累会导致框架实际应用的时候出现严重的效率问题.于是开始关注JavaScript提高效率的一些技巧,在这里分享给大家. 1. ...

  9. 简历编写技巧-java开发工程师简历实战

    看到一遍简历编写的文章 想到也快找工作了 早晚能够用上 现在摘录如下 640?wx_fmt=jpeg 工欲善其事,必先利其器,这是自古以来的道理.所以如果想找到一份好的工作,一定要先整理一份好的简历. ...

随机推荐

  1. 24-ESP8266 SDK开发基础入门篇--Android TCP客户端.控制 Wi-Fi输出PWM的占空比,调节LED亮度

    https://www.cnblogs.com/yangfengwu/p/11204436.html 刚才有人说需要点鸡汤.... 我想想哈;我还没问关于哪方面的鸡汤呢!!! 我所一直走的路线 第一: ...

  2. 多项式总结&多项式板子

    多项式总结&多项式板子 三角/反三角是不可能放的(也不可能真香的 多项式乘法(DFT,FFT,NTT,MTT) 背板子 前置知识:泰勒展开 如果\(f(x)\)在\(x_0\)处存在\(n\) ...

  3. CSS3 之filter毛玻璃效果弹窗

    先看效果: 效果主要用css3的滤镜属性实现,代码如下: <!DOCTYPE html> <html lang="en"> <head> < ...

  4. GoCN每日新闻(2019-10-07)

    GoCN每日新闻(2019-10-07) 国庆专辑:GopherChina 祝大家国庆节快乐(假期最后一天)   GoCN每日新闻(2019-10-07)   1. Go 不好的点:JSON 解析的探 ...

  5. java基础-数据输入

    import java.util.Scanner; public class ScannerTest { public static void main(String[] args) { //身高未知 ...

  6. 你对SQA的职责和工作活动(如软件度量)的理解?

    SQA就是独立于软件开发的项目组,通过对软件开发过程的监控,来保证软件的开发流程按照指定的CMM规程(如果有相应的CMM规程),对于不符合项及时提出建议和改进方案,必要时可以向高层经理汇报以求问题的解 ...

  7. python 得到列表的第二大的元素

    code #coding=utf- l=[,,,,,,] max1=l[] max2=l[] if(max1>max2): pass else: max1,max2=max2,max1 :]: ...

  8. PHP 之Mysql优化

    一.建立索引 普通索引 index: 对关键字没有要求. 唯一索引 unique index: 要求关键字不能重复.同时增加唯一约束. 主键索引 primary key: 要求关键字不能重复,也不能为 ...

  9. avalon数据已更新,视图未更新的bug修复

    $computed: { pinlei() { var key = this.currentProduct.key || 'youpin'; console.log(key, "我是key& ...

  10. ueditor div style被过滤 解决办法

    上周开发中有用到开源的富文本编辑器UEditor,在使用的过程中遇到了样式被过滤无法显示问题,经过一番折腾终解决,此外,还有一些关于获取前台界面元素的一些总结. 1. UEditor样式被过滤无法显示 ...