Testbench代码设计技巧

" There are many ways " to code a test case, it all depens on the creativity ot the Testbench designer.

Testbench代码设计技巧 1

1. Clock logic设计技巧 1

2. Asynchronous reset设计技巧 1

3. System task之打印数据 2

4. System task之生成.vcd文件 3

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代码设计技巧的更多相关文章

  1. .NET框架设计(常被忽视的C#设计技巧)

    阅读目录: 1.开篇介绍 2.尽量使用Lambda匿名函数调用代替反射调用(走进声明式设计) 3.被忽视的特性(Attribute)设计方式 4.扩展方法让你的对象如虎添翼(要学会使用扩展方法的设计思 ...

  2. .NET框架设计(常被忽视的框架设计技巧)

    阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...

  3. objc@interface的设计哲学与设计技巧

    blog.sunnyxx.com 我是前言 学习objc时,尤其是先学过其他编程语言再来看objc时,总会对objc的类声明的关键字interface感到有点奇怪,在其它面向对象的语言中通常由clas ...

  4. .NET框架设计—常被忽视的框架设计技巧

    阅读目录: 1.开篇介绍 2.元数据缓存池模式(在运行时构造元数据缓存池) 2.1.元数据设计模式(抽象出对数据的描述数据) 2.2.借助Dynamic来改变IOC.AOP动态绑定的问题 2.3.元数 ...

  5. WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心

    原文:WPF界面设计技巧(11)-认知流文档 & 小议WPF的野心 流文档是WPF中的一种独特的文档承载格式,它的书写和呈现方式都很像HTML,它也几乎具备了HTML的绝大多数优势,并提供了更 ...

  6. WPF界面设计技巧(10)-样式的继承

    原文:WPF界面设计技巧(10)-样式的继承 PS:现在我的MailMail完工了,进入内测阶段了,终于可以腾出手来写写教程了哈,关于MailMail的介绍及内测程序索取:http://www.cnb ...

  7. WPF界面设计技巧(9)—使用UI自动化布局

    原文:WPF界面设计技巧(9)-使用UI自动化布局 最近一直没时间更新这系列文章,因为我一直在埋头编写我的第一个WPF应用程序:MailMail 今天开始编写附属的加密/解密工具,对UI自动化布局有些 ...

  8. WPF界面设计技巧(8)—自制山寨版CheckListBox

    原文:WPF界面设计技巧(8)-自制山寨版CheckListBox 近年来IT市场山寨横行啊,我们今天也来发扬一下山寨精神,搞个自制的CheckListBox出来. 喏,CheckListBox 就是 ...

  9. WPF界面设计技巧(7)—模拟电梯升降的缓动动画

    原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...

随机推荐

  1. Android持久化保存cookie

    在解析网页信息的时候,需要登录后才能访问,所以使用httpclient模拟登录,然后把cookie保存下来,以供下一次访问使用,这时就需要持久化cookie中的内容. 在之前先科普一下基础知识: 什么 ...

  2. Oracle Hint的用法

    1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_I ...

  3. c# post方式请求java form表单api

    using System; using System.Collections.Generic; using System.Net.Http; namespace ConsoleApplication1 ...

  4. 浅谈SpringCloud (三) Ribbon负载均衡

    什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...

  5. USACO Sabotage, 2014 Mar 破坏阴谋(二分+贪心)

    一开始看完这题就有个想法: 只要把大于整个序列平均数的最大连续序列就是最优? 那把整个序列都减掉平均数 在做最大连续字序列和且记录长度? 仔细思考一下并不太对: 当子序列最大但长度较大 也许也比不上删 ...

  6. CSS3背景 制作导航菜单综合练习题

    CSS3背景 制作导航菜单综合练习题 小伙伴们,根据所学知识,使用CSS3实现下图的导航菜单效果 任务 1.制作导航圆角 提示:使用border-radius实现圆角 2.制作导航立体风格 提示:使用 ...

  7. Five Invaluable Techniques to Improve Regex Performance

    Regular expressions are powerful, but with great power comes great responsibility. Because of the wa ...

  8. python爬虫:爬取读者某一期内容

    学会了怎么使用os模块 #!/usr/bin/python# -*- encoding:utf-8 -*- import requestsimport osfrom bs4 import Beauti ...

  9. 教你用3ds max制作多边形小狗建模

    本教程是一篇关于用3ds max来制作多边形小狗建模的简易教程,介绍地很详细,制作出来的狗很有特色,转发过来,感兴趣的朋友可以过来学习一下! 建立一个BOX,把物体放到空间原点上(这样在以后调节中间点 ...

  10. Bootstrap入门!

    什么是Bootstrap? Bootstrap,来自Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加 ...