自动化验证testbench结果可以减少人工检查的时间和可能犯的失误,尤其对于比较大的设计。目前普遍使用三种自动化testbench验证方法:
数据库比较:首先创建一个包含预期输出的数据库文件(称作goldenvector文件),然后捕获仿真输出与该文件中的参考向量作比较。但是由于没有提供从输出到输入文件的指针,该方法的缺点是难以追踪导致不正确输出的错误源。
波形比较:将testbench输出波形与预期波形作比较。xilinx曾推出过一款hdl bencher的工具,可以执行自动化的波形比较,不过目前由于该方法很少使用,xilinx也下架了该工具。
自我检查testbench设计:与前两种方法不同,该方法实时检查预期结果和实际结果,而不是仿真结束后才检查。在testbench中插入错误追踪信息可以显示设计在哪里失败,从而缩短调试时间。
本文将介绍最后一种自动化验证方法。将一系列预期向量(比如由matlab等软件产生)放在testbench文件中,在运行时间间隔与实际仿真结果比较,如果匹配则表明仿真成功;不匹配则报告结果不符。
比较时间可以选择在每个时钟边沿,或者没n个时钟周期比较一次,总而言之要与设计相符合。比如内存i/o的testbench应该在读出或写入一个新数据后就进行比较;如何设计使用了大量组合逻辑模块,选取比较时间必须考虑组合逻辑延迟。
对于中小型设计而言,自我检查的testbench设计方法是一种不错的选择,但是对于复杂的大型设计,可能的输出组合呈指数形式增加,编写一个自我检查testbench将会困难很多。下面给出一个自我检查testbench的设计示例(来源于xapp199):
`timescale 1 ns / 1 psmodule test_sc;// 信号申明reg tbreset, tbstrtstop;reg tbclk;wire [6:0] onesout, tensout;wire [9:0] tbtenthsout;parameter cycles = 25;reg [9:0] data_in_t [0:cycles];// 实例化设计stopwatch uut (.clk (tbclk), .reset (tbreset), .strtstop (tbstrtstop),.onesout (onesout), .tensout (tensout), .tenthsout (tbtenthsout));wire [4:0] tbonesout, tbtensout;assign tbtensout = led2hex(tensout);assign tbonesout = led2hex(onesout);//-------------------------------------------------------------// 预期结果//-------------------------------------------------------------initial begin data_in_t[1] =10'b1111111110; data_in_t[2] =10'b1111111101; data_in_t[3] =10'b1111111011; data_in_t[4] =10'b1111110111; data_in_t[5] =10'b1111101111; data_in_t[6] =10'b1111011111; data_in_t[7] =10'b1110111111; data_in_t[8] =10'b1101111111; data_in_t[9] =10'b1011111111; data_in_t[10]=10'b0111111111; data_in_t[11]=10'b1111111110; data_in_t[12]=10'b1111111110; data_in_t[13]=10'b1111111101; data_in_t[14]=10'b1111111011; data_in_t[15]=10'b1111110111; data_in_t[16]=10'b1111101111; data_in_t[17]=10'b1111011111; data_in_t[18]=10'b1110111111; data_in_t[19]=10'b1101111111; data_in_t[20]=10'b1011111111; data_in_t[21]=10'b0111111111; data_in_t[22]=10'b1111111110; data_in_t[23]=10'b1111111110; data_in_t[24]=10'b1111111101; data_in_t[25]=10'b1111111011;endreg gsr;assign glbl.gsr = gsr;initial begin gsr = 1; // 等到全局复位结束 #100 gsr = 0;end//建立一个时钟initial begin tbclk = 0; //全局复位结束后开始产生时钟信号 #100 forever #60 tbclk = ~tbclk; end//给出设计激励initial begin tbreset = 1; tbstrtstop = 1; #240 tbreset = 0; tbstrtstop = 0; #5000 tbstrtstop = 1; #8125 tbstrtstop = 0; #500 tbstrtstop = 1; #875 tbreset = 1; #375 tbreset = 0; #700 tbstrtstop = 0; #550 tbstrtstop = 1; #100000 $stop;end//-------------------------------------------------------------// 在每个时钟的下降沿比较预期结果和实际结果//-------------------------------------------------------------integer i,errors;always @ (posedge tbclk) begin if (tbstrtstop) begin i = 0; errors = 0; end else begin for (i = 1; i 1) $display(%0d error! see log above for details.,errors); else $display(error! see log above for details.); #100 $stop; endendendmodule
上述代码中,将预期结果和实际结果的比较情况显示在终端。该代码模板可应用于任何设计的自我检查testbench中,需要修改实例化接口和预期的输出值。如果不需要在每个时钟沿检查一次数据,则修改for循环的执行条件。
菲力尔携智能红外热像仪新品亮相中国供热展
车载终端构筑智慧工厂:无人配送车的高效物流体系
地阻抗对时钟的影响
2021年全球物联网电信服务市值将达176.7亿美元
手机触屏太灵敏的解决方法
Testbench自动化验证方法介绍
基于FPGA设计的SDH设备时钟设计
内蒙再打击虚拟货币“矿场”,矿机公司们的转型之路走得怎样了?
日产Leaf成为全球首款销量破40万的电动车型号
智能家居搭起了物联网的基础?
千兆宽带从冬奥跳台飞跃向千家万户:联通“臻宽带”的起跳瞬间
热点 | 中国电信携手华为发布5G超级上行联合技术创新方案
利用应用物联网、运营大数据打造重庆公交 “智博”会展专版调度系统
便携式空调颠覆你的认知
苹果M1处理器成功运行Linux
苹果电脑怎么连接投影仪_苹果Mac连接投影仪
四轴机器人和六轴机器人有什么区别?
汽车发动机周边部件上应用高导热塑料
晒图机概述
如何根据需求选择对象存储、文件存储和块存储