大多数硬件设计人员对verilog的testbench比较熟悉,那是因为verilog被设计出来的目的就是为了用于测试使用,也正是因为这样verilog的语法规则才被设计得更像C语言,而verilog发展到后来却因为它更接近C语言的语法规则,设计起来更加方便,不像VHDL那也死板严密,所以verilog又渐渐受到硬件设计者们的青睐。但其实VHDL在最开始也是具有测试能力的,而且它的语法严密,但我们同样可以用它来编写我们的测试文件。

下面以一个8bit计数器为例子给出个简单的testbench模板及注释:

libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitytb_CNTisendtb_CNT ;architecturetestbenchoftb_CNTis--Component Declarationforthe Unit Under Test(UUT)componentMY_CNTport(

CLK,RESET:instd_logic;

D_IN:instd_logic_vector(7downto0);

LOAD:instd_logic;

CE :instd_logic;

UPDW:instd_logic;

Q_OUT:outstd_logic_vector(7downto0)

);endcomponent;--InputssignalCLK:std_logic:='0';signalRESET:std_logic:='0';signalD_IN:std_logic_vector(7downto0):=(others=>'0');signalLOAD:std_logic:='0';signalCE:std_logic:='0';signalUPDW:std_logic:='0';--OutputssignalQ_OUT:std_logic_vector(7downto0);constantCLK_period:TIME:=1ns;begin--例化计数器模块

UUT: MY_CNTportmap(

CLK=>CLK,

RESET=>RESET,

D_IN=>D_IN,

LOAD=>LOAD,

CE=>CE,

UPDW=>UPDW,

Q_OUT=>Q_OUT

);--时钟实现模块--上面定义了CLK period时间常量来表示时钟周期--以下通过一个process来实现时钟

CLK_process:processbeginCLK<='0';waitforCLK_period/2;

CLK<='1';waitforCLK_period/2;endprocess;--其它信号量的控制--时序逻辑的仿真的时间单位都为CLK周期来实现的--所以将时钟周期定义为常量是个很方便的做法

stim_proc:processbegin--hold reset statefor100ms.waitfor100ms;waitforCLK_period*10;--insert stimulus here.endprocess;endtestbench;

通过编写testbench来仿真和通过拖波形来仿真,最大的好处就是,当测试数据无比庞大时,可以简易得通过testbench中的算法来实现,而另一个更为重要的方面就是,可以通过testbench对数据文件进行读写操作,从而简化我们的仿真工作。

首先介绍下时间控制语句——wait:(其实wait语句是通过控制仿真的两种状态——执行和挂起,来控制时间的)

1.wait——无线等待;语法【wait;】,类似于Verilog中的¥Stop

2.wait on——敏感信号量变化;语法【wait on 信号;】,表示当信号发生变化的时候,仿真开始继续执行,从而结束挂起状态

3.wait until——条件满足;语法【wait until 表达式】,表达式为一个布尔表达式,表示当表达式为“真”时,仿真继续执行,结束挂起状态

4.wait for——时间控制;语法【wait for 时间表达式】,例:【wait for 30ns;】

VHDL也提供了文件I/O的操作,以下简单介绍在我们大部分情况下如何通过VHDL来进行文件操作。

--Fileprocessfile_process:processfilefile_out:textisout"data_out.txt";filefile_in :text;variablefstatus: FILE_OPEN_STATUS;--定义文件状态指示变量,一般有OPEN OK, STATUSERROR, NAMEERROR, MODEERROR四种状态;variablecount:integer:=5;--定义integer 型写入数据;variablestringdata:string(5downto1):="whwhn";--定义string 型写入数据;variablevectordata:bit_vector(5downto0):="001000";--定义bit_vector 型写入数据;variablevalue:std_logic_vector(3downto0):="1111";--定义std_logic_vector型的写入数据;variablestddata:std_logic;variableBUFO:LINE;begin--file_open(fstatus,file_out,"data_out.txt",write_mode);file_open(fstatus,file_in,"data_in.txt",read_mode);

file类型:文件句柄,用于定义文件。语法1【file 文件变量名:text is 读取或者写入类型 “文件名”;】text——文件类型为文本类型,读取类型为in,写入类型为out;语法2【file 文件变量名:text;】只是定义了文件变量名,并没有给赋予初值。

用第二种方式定义文件变量则需要用到函数file_open();语法【file_open(文件状态指示,文件变量,“文件名”,读写状态);】如上图实例。

LINE类型:如下图,为std库中TEXTIO文件中的定义

--LINE类型:为std库中TEXTIO文件中的定义foriin0to29loopreadline(file_in,BUF0);read(BUF0,stddata);

LOAD<=stddata;waitforCLK_period;endloop;

LINE 为存取类型的变量,它表示该变量是指向字符串的指针,它是TEXTIO 中所有操作的基本单元。读文件时,先按行(LINE)读出一行数据,再对LINE 操作来读取各种数据类型的数据;写文件时, 先将各种的数据类型组合成LINE,再将LINE 写入文件。在用户使用时, 必须注意只有变量才可以是存取类型, 而信号则不能是存取类型。

TEXTIO还定义了一些基本的文件操作过程:

【READLINE(文件变量,行变量);】从指定的文件中读取一行。

【READ(行变量,数据变量);】从一行中读取一个数据。

【WRITELINE(文件变量,行变量);】将行变量中数据写入到指定文件。

【WRITE(行变量,数据变量);】将数据写入到一行中。

【WRITE(行变量,数据变量,起始位置,字符数);】比上个过程多了起始位置和字符数的指定。

---为循环从数据文件中读取出数据,赋值给信号量write(file_out,string'("the first parameter is="));write(BUF0,count);writeline(file_out,BUF0);waitfor20ns;write(file_out,string'("the second parameter is="));write(BUF0,value);writeline(file_out,BUF0);waitfor20ns;write(file_out,string'("the third parameter is="));write(BUF0,vectordata);writeline(file_out,BUF0);waitfor20ns;write(file_out,string'("the forth parameter is="));write(BUF0,stringdata);writeline(file_out,BUF0);write(BUF0,string'("end of file"));writeline(file_out,BUF0);waitfor10ns;waitfor2000ns;file_close(file_out);file_close(file_in);endprocess;

上图事例为循环从数据文件中读取出数据,赋值给信号量。

--为了说明行变量与各个变量之间的转换,行变量可与任何变量类型进行转换,--并且原样输出到指定文件中。packageTEXTIOis--Type definitionsfortextI/O;typeLINEisaccessSTRING;--ALINEisa pointertoaSTRINGvalue.typeTEXTisfileofSTRING;--Afileofvariable-length ASCII records.typeSIDEis(RIGHT,LEFT);--For justifyingoutputdata within fields.subtypeWIDTHisNATURAL;--For specifying widthsofoutputfields.

上图事例为了说明行变量与各个变量之间的转换,行变量可与任何变量类型进行转换,并且原样输出到指定文件中。

另外再推荐个语句:ASSERT——断言语句。它和VC中的_TRACE语句一样,在调试程序中非常有用非常方便。

assert是一个调试仿真时的专用语法,他可以判断一个boolean变量,如果该变量为假就输出一个用户指定的信息到终端(控制台),用户可以附带输出信息的严格等级,从低到高依次是:note,warning,error,failure,可以让用户区分信息的类型。同样assert语句也是不能被综合的。

assert可以是同步语句(在process外),此时assert后面的任何变量变化都会引起assert语句判断一次。

assert还可以是顺序语句,此时assert存在于process中。

testbench实例 vhdl_[转载]VHDL的testbench的编写相关推荐

  1. testbench实例 vhdl_学写 Testbench --- 结构篇VHDL实例

    testbench.v: ---------------------------------------------------------------------- // // File heade ...

  2. (3)verilog与VHDL两种语言编写二分频

    3 verilog与VHDL两种语言编写二分频 1 本章目录 1)Verilog简介 2)VHDL简介 3)二分频verilog编码 4)二分频VHDL编码 5)本节结语 2 Verilog简介 Ve ...

  3. 【testbench】第1篇:testbench编写规则

    本文依据网络资料及工作经验整理而成,如有错误请留言. 文章为个人辛苦整理,付费内容,禁止私自转载. 文章专栏:<黑猫的FPGA知识合集> 1 概述 实现仿真需要自己增加testbench文 ...

  4. memcached 系列2:memcached实例(转载)

    在上一篇文章,我们讲了,为什么要使用memched做为缓存服务器(没看的同学请点 这里).下面让我们以memcached-1.2.1-win32版本的服务组件(安装后是以一个windows服务做dae ...

  5. matlab画图入门篇--各种基本图形绘制的函数与实例【转载】

    MATLAB画图入门篇--各种基本图形绘制的函数与实例 一. 二维图形(Two dimensional plotting) 1. 基本绘图函数(Basic plotting function):Plo ...

  6. verilog的testBench、在vivado中创建testbench

    testbench介绍: testbench的特点: 为简单取指指令设计的test bench: 在vivado中创建testbench: 一个testbench的例子: design sourse: ...

  7. 深入浅出JMS(三)–ActiveMQ简单的HelloWorld实例(转载)

    第一篇博文深入浅出JMS(一)–JMS基本概念,我们介绍了JMS的两种消息模型:点对点和发布订阅模型,以及消息被消费的两个方式:同步和异步,JMS编程模型的对象,最后说了JMS的优点. 第二篇博文深入 ...

  8. 数据库设计三大范式应用实例剖析(转载)

    引言 数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的.结构明晰的,同时,不会发生插入(insert).删除(delete)和更新(update)操作异常.反之则是乱七八糟, ...

  9. SHELL网络爬虫实例剖析--转载

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://nolinux.blog.51cto.com/4824967/1552472 前天 ...

  10. makefile实例【转载】

    假设我们有下面这样的一个程序,源代码如下: /* main.c */  #include <mytool1.h>  #include <mytool2.h> int main( ...

最新文章

  1. 在ASP.NET中跨页面实现多选
  2. 一周小程序学习 第1天
  3. 如何在时间紧迫情况下进行机器学习:构建标记的新闻 数据 库 开发 标记 网站 阅读1629 原文:How we built Tagger News: machine learning on a
  4. mongodb之索引学习
  5. c++中this指针基本概念和使用
  6. JavaWeb 如何防止表单重复提交 - 使用Token,令牌
  7. 解析json数据_Retrofit同时解析JSON和XML数据格式
  8. 1.Zabbix企业级分布式监控系统 --- 监控系统简介
  9. 《剑指offer》面试题20——顺时针打印矩阵(C++)
  10. docker下beego开发环境搭建
  11. html设置图片高度宽度自适应屏幕,css让图片自适应屏幕大小的方法
  12. PDF怎么转换成JPG图片?教你如何快速转换
  13. 友达光电(昆山)第六代LTPS液晶面板厂 成功点亮首片5.5吋Full HD面板 缔造最快速量产记录 展现领先LTPS技术实力...
  14. 我与 SAP 成都研究院吴院长的二三事
  15. 科技云报道:安全脱管不如托管
  16. JavaMail IMAPFolder.getMessageByUID 获取QQ和腾讯企业邮箱新邮件的问题
  17. ssh免密码登录快速配置方法
  18. 手撕红黑树——C++高阶数据结构详解
  19. 何学林:房价为什么降不下来?房价上涨的刚性是由强大的利益共同体共同作用的结果(原创首发,深度好文)——何学林房地产大策划之十四
  20. JAVA毕设项目理发店会员管理系统(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. Vs自带的freetextbox无法在远端使用
  2. 新创建虚拟机如何配置ip地址
  3. 最好的git教程,没有之一
  4. 基于C++的校园一卡通管理系统
  5. uniapp做微信小程序身份证识别功能(百度云身份证识别api)
  6. java入门第二天如何使用Elipse
  7. 从零开始研发GPS接收机连载——3、用HackRF软件无线电平台作为GPS模拟器
  8. 解决MATLAB无法读取笔记本内置摄像头
  9. 基于LineMod与ORK的三维物体识别与姿态估计
  10. Android进阶学习-使用Canvas自定义ArcView(4)