Testbench代码设计技巧
Testbench代码设计技巧
" There are many ways " to code a test case, it all depens on the creativity ot the Testbench designer.
5. System task之生成vec(vector file)档 3
1. Clock logic
为方便对时钟进行修改,已经后续代码中的应用,定义为parameter或者`define更为方便,如下所示:
//-------------------------------
//clock units
parameter PERIOD = 20; //20ns,50MHz
always
#(PERIOD/2) clk = !clk;
2. Asynchronous reset
意在设计一个异步复位的信号,故可在clk下降沿复位,同时也在clk下降沿释放。因此在testbench中我们要设计一段“释放→复位→释放”的代码。“event”是在testbench中能被触发,同时也能被监视的事件,过程如下:
1) 释放
2) 在某一时刻reset_trigger 触发事件
3) 等待clk下降沿,复位
4) 等待下一个下降沿,释放
5) 触发reset_done_trigger事件(可在其他testbench中应用)
代码如下所示:
//-------------------------------
//asynchronous reset event(low valid)
event reset_trigger;
event reset_done_trigger;
initial
begin
forever
begin
@(reset_trigger);
@(negedge clk);
rst_n = 0;
@(negedge clk);
rst_n = 1;
-> reset_done_trigger;
end
end
//-------------------------------
//asynchronous reset
initial
#50 -> reset_trigger;
如上代码所示50ns后启动异步复位信号,波形如下所示。可见输出数据都为三态,知道复位开始有效。

注:在时序严谨的工程中,asynchronous reset必须同步化,言外之音,此处画龙点睛介绍此方法!

1) 设计verilog代码,用触发器对异步复位信号同步化
2) 整合例化
3) 编译,仿真调试
4) 在Instance中选择sync_ctrl下的sys_rst_n信号进行观察

代码和波形如下所示:
`timescale 1ns / 1ns
module sync_ctrl
(
input clk,
input rst_n,
output sys_rst_n
);
//--------------------------------------
//asynchronous rst_n synchronism
reg rst_nr1, rst_nr2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
rst_nr1 <= 1'b0;
rst_nr2 <= 1'b0;
end
else
begin
rst_nr1 <= 1'b1;
rst_nr2 <= rst_nr1;
end
end
assign sys_rst_n = rst_nr2;
Endmodule

3. Asynchronous enable
雷同以上异步reset信号,用event来完成对enable的仿真。此处异步enable信号在异步reset完成后,维持10clk,之后释放。在是能有效的时候addout自增,代码和波形如下所示:
//-------------------------------
//asynchronous reset & enable
initial
begin
#10 -> reset_trigger; //asynchronous reset
@(reset_done_trigger); //reset done
@(negedge clk); //asynchronous enable
enable = 1;
repeat(10) //hold 10 cycles
begin
@(negedge clk);
enable = 0; //asynchronous release
end
end
此处
4. Reset & enable random
自然是随机的,因此极端情况下,我们也可以把异步复位和使能信号设置为随机信号,如下所示:
//------------------------------
//asynchronous reset & enable with random
initial
begin
#10 -> reset_trigger;
@(reset_done_trigger);
fork
repeat(10)
begin
@(negedge clk)
enable = $random;
end
repeat(10)
begin
@(negedge clk)
#100 rst_n = $random;
end
join
End

5. Simulation Terminate
以上可见到,其实异步enable信号的initial到10个clk以后,test case没完,但是simulate 已经终止了。但如果有到个test case,每个case simulate完都进入terminate_sim,进行某些操作,会很方便。可在代码中稍作修改,写成terminate_sim的event,代码如下:
//-------------------------------
//asynchronous reset & enable
event terminate_sim;
initial
begin
#10 -> reset_trigger; //asynchronous reset
@(reset_done_trigger); //reset done
@(negedge clk); //asynchronous enable
enable = 1;
repeat(10) //hold 10 cycles
@(negedge clk);
enable = 0; //asynchronous release
#10 -> terminate_sim;
end
//------------------------------
//terminate state
initial
begin
@(terminate_sim);
$display("Terminating Simulation!");
#10 $finish;
end
6. Task任务模块
对于需要多次操作或者循环的任务,可以用task封装,方便调用。
此处只做简单的介绍:
//-------------------------------
//stimulate random drive
task din_task;
begin
//for()
din1 = $random % 256;
din2 = $random % 256;
end
endtask
always@(negedge clk)
datain_task;
7. System task之自检Error
在系统模拟验证中,采用比较模拟验证法代替波形观察法,以提高效率.
无非是复制verilog中的内容,再写一遍,结果是不是一样,没有什么需要提的.
8. System task之打印数据
//-------------------------------
//print the value to screen
initial begin
$display("\t\ttime,\tdout");
$monitor("%d,\t4'h%x,",$time,dout);
end
Display: 正如C语言中的printf
Monitor: 比print个稍微强大点,实时监测数据变化,变化的时候输出数据
如下图所示,数据打印到screen如下(monitor检测的数据输出不能顶格很郁闷)

9. System task之生成vcd文件
Vcd文件即为value change dump,用固定格式保存波形数据。
//-------------------------------
//save the warmform
initial begin
$dumpfile("wave_test.vcd" );
$dumpvars;
End
当本次仿真结束的时候,将波形数据保存到wave_test.vcd中,一边以后用warmform viewer查看。如下所示(不知道怎么看~~~~(>_<)~~~~ ):

10. System task之生成vec文件
Vec文件即为vector file矢量数据文件,用于Modelsim中保存数据的文件,在仿真测试中,相关数据测试,在必要的情况下有很大的好处。相关testbench代码如下所示,保存了仿真400ns过程中addout的变化:
//-------------------------------
//generate vector file
integer openfile;
initial
begin
//output to "wave_test.vec" and standard display
openfile = $fopen("wave_test.vec");
//generate header file of vector file
$fdisplay(openfile,"/*------------------------------------------------------------------------");
$fdisplay(openfile,"This confidential and proprietary software may be only used as authorized");
$fdisplay(openfile,"by a licensing agreement from CrazyBingo.");
$fdisplay(openfile,"(C) COPYRIGHT 2012 CrazyBingo. ALL RIGHTS RESERVED");
$fdisplay(openfile,"This is the wave_test.vec vector file");
$fdisplay(openfile,"-------------------------------------------------------------------------*/");
$fdisplay(openfile,"\t\t\t\ttime,\taddout");
//output all the information of node transition in the vector file
$fmonitor(openfile,"%d,\t4'h%x",$time,addout);
end
生成的文件信息如下所示:

11. Others
$display,$fdisplay,$monitor,
$strobe,$fopen,$fclose,$dump,$finish,
$time,$write,$stop
$random
1) fork...join:并行任务
2) integer i;for(i=0,i<256,i++) 循环
3) $readmemb(“File_Name”, Test_Vector); 从文件中读取二进制输入激励码向量
4) $readmemh(“File_Name”, Test_Vector); 从文件中读取二进制输入激励码向量
5) reg [7:0] stim_array[0:15] 数组的运用
转自:http://www.cnblogs.com/crazybingo/archive/2012/02/18/2356682.html#commentform
Testbench代码设计技巧的更多相关文章
- .NET框架设计(常被忽视的C#设计技巧)
阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...
- .NET框架设计(常被忽视的框架设计技巧)
阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...
- objc@interface的设计哲学与设计技巧
blog.sunnyxx.com 我是前言 学习objc时,尤其是先学过其他编程语言再来看objc时,总会对objc的类声明的关键字interface感到有点奇怪,在其它面向对象的语言中通常由clas ...
- .NET框架设计—常被忽视的框架设计技巧
阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...
- WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心
原文:WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心 流文档是WPF中的一种独特的文档承载格式,它的书写和呈现方式都很像HTML,它也几乎具备了HTML的绝大多数优势,并提供了更 ...
- WPF界面设计技巧(10)-样式的继承
原文:WPF界面设计技巧(10)-样式的继承 PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnb ...
- WPF界面设计技巧(9)—使用UI自动化布局
原文:WPF界面设计技巧(9)-使用UI自动化布局 最近一直没时间更新这系列文章,因为我一直在埋头编写我的第一个WPF应用程序:MailMail 今天开始编写附属的加密/解密工具,对UI自动化布局有些 ...
- WPF界面设计技巧(8)—自制山寨版CheckListBox
原文:WPF界面设计技巧(8)-自制山寨版CheckListBox 近年来IT市场山寨横行啊,我们今天也来发扬一下山寨精神,搞个自制的CheckListBox出来. 喏,CheckListBox 就是 ...
- WPF界面设计技巧(7)—模拟电梯升降的缓动动画
原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...
随机推荐
- 从HTTP 2.0想到的关于传输层协议的一些事
0.HTTP协议的历史 我也不知道... 1.关于HTTP 2.0 收到了订阅的邮件,头版是说HTTP 2.0的内容,我本人不是非常关注HTTP这一块儿.可是闲得无聊时也会瞟两眼的.HTTP 2.0的 ...
- 受 SQLite 多年青睐,C 语言到底好在哪儿?
SQLite 近日发表了一篇博文,解释了为什么多年来 SQLite 一直坚持用 C 语言来实现,以下是正文内容: C 语言是最佳选择 从2000年5月29日发布至今,SQLite 一直都是用 C 语言 ...
- AngularJS 下拉列表demo
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)
题目链接: https://jzoj.net/senior/#contest/show/2686/2 题目: 题解: 说实话这题调试差不多花了我十小时,不过总算借着这道题大概了解了计算几何的基础知识 ...
- 案例分析:大数据平台技术方案及案例(ppt)
大数据平台是为了计算,现今社会所产生的越来越大的数据量,以存储.运算.展现作为目的的平台.大数据技术是指从各种各样类型的数据中,快速获得有价值信息的能力.适用于大数据的技术,包括大规模并行处理(MPP ...
- Java标识符规范
1.标识符用来定义包名,类名,方法名,变量名,常量名. 2.标识符必须由字母.下划线.$符号组成,不能以数字开头.不能是Java中的保留关键字.
- mysql+spring+mybatis实现数据库读写分离[代码配置] .
场景:一个读数据源一个读写数据源. 原理:借助spring的[org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource] ...
- Appstore排名前十的程序员应用软件
程序员又名程序猿,苦逼劳累的代名词,曾经一个朋友这么开玩笑说,如果你是富二代,你当程序员就是脑残,如果你是穷二代,当程序员的话,死的时候一定是趴键盘. 程序员 哦,可怜的程序员.在那山的这边海的那边有 ...
- 使用RestTemplate上传文件给远程接口
MultiValueMap request = new LinkedMultiValueMap(1); ByteArrayResource is = new ByteArrayResource(mul ...
- day13 基本的文件操作(好东西)
目录 基本的文件处理 什么是文件 如何使用文件 使用Python写一个小程序控制文件 open(打开文件) read: readline:一次性读取一行 del:删除 close:关闭 write(写 ...