前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Testbench编写指南(4)自动化验证方法

Testbench编写指南(4)自动化验证方法

作者头像
碎碎思
发布2020-06-30 11:05:56
7680
发布2020-06-30 11:05:56
举报
文章被收录于专栏:OpenFPGAOpenFPGA

Testbench编写指南(4)自动化验证方法

文章转自:https://blog.csdn.net/FPGADesigner/article/details/82023527


文章目录

  • Testbench编写指南(4)自动化验证方法

  自动化验证testbench结果可以减少人工检查的时间和可能犯的失误,尤其对于比较大的设计。目前普遍使用三种自动化testbench验证方法:

  • 数据库比较:首先创建一个包含预期输出的数据库文件(称作golden vector文件),然后捕获仿真输出与该文件中的参考向量作比较。但是由于没有提供从输出到输入文件的指针,该方法的缺点是难以追踪导致不正确输出的错误源。
  • 波形比较:将testbench输出波形与预期波形作比较。Xilinx曾推出过一款HDL Bencher的工具,可以执行自动化的波形比较,不过目前由于该方法很少使用,Xilinx也下架了该工具。
  • 自我检查testbench设计:与前两种方法不同,该方法实时检查预期结果和实际结果,而不是仿真结束后才检查。在testbench中插入错误追踪信息可以显示设计在哪里失败,从而缩短调试时间。

  本文将介绍最后一种自动化验证方法。将一系列预期向量(比如由MATLAB等软件产生)放在testbench文件中,在运行时间间隔与实际仿真结果比较,如果匹配则表明仿真成功;不匹配则报告结果不符。

  比较时间可以选择在每个时钟边沿,或者没n个时钟周期比较一次,总而言之要与设计相符合。比如内存I/O的testbench应该在读出或写入一个新数据后就进行比较;如何设计使用了大量组合逻辑模块,选取比较时间必须考虑组合逻辑延迟。   对于中小型设计而言,自我检查的testbench设计方法是一种不错的选择,但是对于复杂的大型设计,可能的输出组合呈指数形式增加,编写一个自我检查testbench将会困难很多。下面给出一个自我检查testbench的设计示例(来源于xapp199):

代码语言:javascript
复制
`timescale 1 ns / 1 ps
module 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 <= cycles; i = i + 1) begin
       @(negedge tbclk)
       // 每个下降沿检查结果
       $display("Time%d ns; TBSTRTSTOP=%b; Reset=%h; Expected
       TenthsOut=%b; Actual TenthsOut=%b", $stime, tbstrtstop, tbreset,
       Data_in_t[i], tbtenthsout);
       if ( tbtenthsout !== Data_in_t[i] ) begin
           $display(" ------ERROR. A mismatch has occurred-----");
           errors = errors + 1;
       end
   end   if (errors == 0)
       $display("Simulation finished Successfully.");
   else if (errors > 1)
       $display("%0d ERROR! See log above for details.",errors);
   else
       $display("ERROR! See log above for details.");
   #100 $stop;
   end
end
endmodule

  上述代码中,将预期结果和实际结果的比较情况显示在终端。该代码模板可应用于任何设计的自我检查testbench中,需要修改实例化接口和预期的输出值。如果不需要在每个时钟沿检查一次数据,则修改for循环的执行条件。





本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenFPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Testbench编写指南(4)自动化验证方法
    • 文章目录
    相关产品与服务
    数据库
    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档