0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Testbench自动化验证方法介绍

FPGA之家 来源:FPGA之家 2023-09-04 09:15 次阅读

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

数据库比较:首先创建一个包含预期输出的数据库文件(称作goldenvector文件),然后捕获仿真输出与该文件中的参考向量作比较。但是由于没有提供从输出到输入文件的指针,该方法的缺点是难以追踪导致不正确输出的错误源。

波形比较:将testbench输出波形与预期波形作比较。Xilinx曾推出过一款HDL Bencher的工具,可以执行自动化的波形比较,不过目前由于该方法很少使用,Xilinx也下架了该工具。

自我检查testbench设计:与前两种方法不同,该方法实时检查预期结果和实际结果,而不是仿真结束后才检查。在testbench中插入错误追踪信息可以显示设计在哪里失败,从而缩短调试时间。

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

  比较时间可以选择在每个时钟边沿,或者没n个时钟周期比较一次,总而言之要与设计相符合。比如内存I/O的testbench应该在读出或写入一个新数据后就进行比较;如何设计使用了大量组合逻辑模块,选取比较时间必须考虑组合逻辑延迟。

  对于中小型设计而言,自我检查的testbench设计方法是一种不错的选择,但是对于复杂的大型设计,可能的输出组合呈指数形式增加,编写一个自我检查testbench将会困难很多。下面给出一个自我检查testbench的设计示例(来源于xapp199):

`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;
end

reg 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循环的执行条件。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 比较器
    +关注

    关注

    14

    文章

    1633

    浏览量

    107086
  • MATLAB仿真
    +关注

    关注

    4

    文章

    176

    浏览量

    19900
  • HDL语言
    +关注

    关注

    0

    文章

    46

    浏览量

    8908

原文标题:Testbench编写指南(4)自动化验证方法

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    是德科技的 Type-C 测试解决方案为高速接口提供最广泛的物理层自动化验证

    over Type-C 进行无限制的自动化验证,是是德科技高速验证系统的重要组成部分。N7018A 能够将最大功率设置为高达 100 W,并将设备设置为交替模式(DisplayPort 和 Thunderbolt)。
    发表于 09-22 20:01 2263次阅读

    EDA形式化验证漫谈:仿真之外,验证之内

    “在未来五年内仿真将逐渐被淘汰,仅用于子系统和系统级验证。与此同时,形式化验证方法已经开始处理一些系统级任务。随着技术发展,更多Formal相关的商业标准化会推出。” Intel fellow
    的头像 发表于 09-01 09:10 1366次阅读

    自动煤炭氟氯离子化验仪器DT-5A型

    `全自动煤炭氟氯离子化验仪器DT-5A型 全自动煤炭氟氯离子化验仪器DT-5A型 英特仪器煤炭氟氯分析仪,电脑氟氯化验设备,测试氟氯离子的设
    发表于 07-01 08:44

    验证方法简介

    上是基于 Verisity Design 在 2001 年开发的用于 e 验证语言的eRM(e Reuse Methodology)。UVM 类库为SystemVerilog 语言,如序列和数据自动化功能(打包、复制、比较
    发表于 02-13 17:03

    化验证和封装形式有关系吗?

    无关,任何形式的封装,皆需要做老化实验。苏试宜特提供客户量身订制全方位的一站式服务, 从老化验证的硬件设计/制造到样品调试/实验/报告, 苏试宜特都可以协助客户完成。
    发表于 09-13 09:46

    硬件验证方法简明介绍

    硬件验证方法简明介绍本书“硬件验证方法简明介绍”是“半导体 IP 核——不仅仅是设计”系列丛书中
    发表于 11-26 20:43

    超大规模集成电路的自动化验证方法

    超大规模集成电路的自动化验证方法 随着数字逻辑的设计复杂度的提高,验证的困难度也逐级上升。本文结合作者在一款以太网交换芯片项目中的实践经验,提
    发表于 03-17 18:24 23次下载

    基于串空间的协议认证属性标准化验证过程

    针对目前串空间理论依赖分析人员主观判断、无法使用自动化工具进行验证的问题,提出了基于串空间理论的协议认证属性标准化验证过程。首先为协议消息项定义类型标签,对串空间及认证测试理论进行扩展;然后通过判断
    发表于 01-07 12:13 0次下载

    VaaS平台已支持区块链平台智能合约的形式化验证

    VaaS形式化验证平台,采用了多种形式化验证方法,具有验证效率高、自动化程度高、人工参与度低、易于使用、支持多个合约开发语言、可支持大容量区
    发表于 12-14 10:18 1083次阅读

    使用三种自动化testbench验证方法

    自我检查testbench设计:与前两种方法不同,该方法实时检查预期结果和实际结果,而不是仿真结束后才检查。在testbench中插入错误追踪信息可以显示设计在哪里失败,从而缩短调试时
    的头像 发表于 11-20 11:26 3665次阅读

    软件的顺序语句块自动化规约与验证研究

    软件的形式化验证是保障软件可证明性、可靠性和安全性的重要手段,但传统形式化验证脚本的生成过程复杂且需要形式化验证专家的大量手工验证。为提高证明效率,构建一种
    发表于 06-03 14:31 5次下载

    安世亚太:中国仿真如何进行切实可行的工程化验证

    的工程化验证更尤为关键。 中国仿真工程化验证的无效路径 过去企业一般有两种方法进行工程化验证,一是用实验的方法,二是通过多年用户现场观察工程
    的头像 发表于 01-24 11:06 1335次阅读

    从小众走向普及,形式化验证对系统级芯片开发有多重要?

    形式化验证作为一种全新的验证方法,近年来在芯片开发中快速发展,正逐渐取代传统的仿真方法。 虽然仿真在系统级验证方面仍然发挥着重要的作用,但对
    的头像 发表于 04-21 19:35 622次阅读
    从小众走向普及,形式<b class='flag-5'>化验证</b>对系统级芯片开发有多重要?

    如何可靠、快速、自动验证处理器硬件

    你是否会遇到以下问题:bug可能比较微妙,不直观,无法手动推断;或者在被观察到之前就被激活很久了,传统的模拟设计需要花很长时间自动验证工作量随着设计复杂性的增加而增加,人工推理和手动编写属性不再可行,等等。目前验证CPU的主流
    的头像 发表于 11-16 12:29 566次阅读
    如何可靠、快速、<b class='flag-5'>自动</b>地<b class='flag-5'>验证</b>处理器硬件

    编写高效Testbench的指南和示例

    Testbench验证HDL设计的主要手段,本文提供了布局和构建高效Testbench的指南以及示例。另外,本文还提供了一种示例,可以为任何设计开发自检Testbench
    的头像 发表于 10-29 16:14 124次阅读
    编写高效<b class='flag-5'>Testbench</b>的指南和示例