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

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

3天内不再提示

Testbench的基本组成和设计规则

FPGA之家 来源:CSDN-FPGADesigner 2023-09-01 09:57 次阅读

Testbench编写指南(1)基本组成与示例

文章目录

Testbench编写指南(1)基本组成与示例

生成时钟信号

生成测试激励

显示结果

简单示例

设计规则

  对于小型设计来说,最好的测试方式便是使用TestBench和HDL仿真器来验证其正确性。一般TestBench需要包含这些部分:实例化待测试设计、使用测试向量激励设计、将结果输出到终端或波形窗口便于可视化观察、比较实际结果和预期结果。下面是一个标准的HDL验证流程:

f7410dfe-485a-11ee-97a6-92fbcf53809c.jpg

 TestBench可以用VHDL或Verilog、SystemVerilog编写,本文以Verilog HDL为例。FPGA设计必须采用Verilog中可综合的部分子集,但TestBench没有限制,任何行为级语法都可以使用。本文将先介绍TestBench中基本的组成部分。

生成时钟信号

  使用系统时钟的设计在TestBench中必须要生成时钟信号,该功能实现起来也非常简单,示例代码如下:
parameter ClockPeriod = 10;

//方法1
initial begin
  forever clock = #(ClockPeriod/2) ~ Clock;
end

//方法2
initial begin
  always #(ClockPeriod/2) Clock = ~Clock;
end  

生成测试激励

  只有给设计激励数据,才能得到验证结果。提供激励的方法有两种,绝对时间激励以仿真时刻0为基准,给信号赋值,示例如下:

initial begin
  reset = 1;
  load = 0;
  count = 0;
  #100 reset = 0;
  #20 load = 1;
  #20 count = 1;
end
‘#’用于指定等待的延迟时间,之后才会执行下一个激励。相对时间激励给信号一个初始值,直到某一事件发生后才触发激励赋值,示例如下:
always @ (posedge clk)
  tb_cnt <= tb_cnt + 1;

initial begin
    if (tb_cnt <= 5) begin
        reset = 1;
        load = 0;
        count = 0;
    end
    else begin
        reset = 0;
        load = 1;
        count = 1;
    end
end

  根据需要,可以同时使用两种方法。每一个initial块、always块之间都是并行工作的关系,但在initial块内部是顺序地处理事件。因此复杂的激励序列应该分散到多个initial或always块中,以提高代码可读性和可维护性。

显示结果

  Verilog中可以使用display和display和display和monitor系统任务来显示仿真结果,示例代码如下:

initial begin
  $timeformat(-9, 1, "ns", 12);
  $display("  Time clk rst ld sftRg data sel");
  $monitor("%t %b %b %b %b %b %b", $realtime,
      clock, reset, load, shiftreg, data, sel);
end

  $display会将双引号之间的文本输出到终端窗口。$monitor的输出为事件驱动型,如上例中$realtime变量用于触发信号列表的显示,%t表示$realtime以时间格式输出,%b表示其余值以二进制格式输出。其余还有%d、%h、%o等与惯例相同。

简单示例

  下面是一个简单的移位寄存器Verilog设计示例:

module shift_reg (clock, reset, load, sel, data, shiftreg);
input clock;
input reset;
input load;
input [1:0] sel;
input [4:0] data;
output [4:0] shiftreg;
reg [4:0] shiftreg;

always @ (posedge clock)
begin
  if (reset)
    shiftreg = 0;
  else if (load)
    shiftreg = data;
  else
    case (sel)
      2'b00 : shiftreg = shiftreg;
      2'b01 : shiftreg = shiftreg << 1;
            2'b10 : shiftreg = shiftreg >> 1;
      default : shiftreg = shiftreg;
    endcase
end
endmodule

  下面给出上述设计的TestBench示例:

module testbench; // 申明TestBench名称
reg clock;
reg load;
reg reset; // 申明信号
wire [4:0] shiftreg;
reg [4:0] data;
reg [1:0] sel;

// 申明移位寄存器设计单元
shift_reg dut(.clock (clock),
  .load (load),
  .reset (reset),
  .shiftreg (shiftreg),
  .data (data),
  .sel (sel));

initial begin  // 建立时钟
  clock = 0;
  forever #50 clock = ~clock;
end

initial begin  // 提供激励
  reset = 1;
  data = 5'b00000;
  load = 0;
  sel = 2'b00;
  #200
  reset = 0;
  load = 1;
  #200
  data = 5'b00001;
  #100
  sel = 2'b01;
  load = 0;
  #200
  sel = 2'b10;
  #1000 $stop;
end

initial begin  // 打印结果到终端
  $timeformat(-9,1,"ns",12);
  $display(" Time Clk Rst Ld SftRg Data Sel");
  $monitor("%t %b %b %b %b %b %b", $realtime,
  clock, reset, load, shiftreg, data, sel);
end
endmodule

  TestBench中包括实例化设计、建立时钟、提供激励、终端显示几个部分。每个initial块之间都从0时刻开始并行执行。$stop用来指示仿真器停止TestBench仿真(建议每个TestBench中都有至少一个$stop)。$monitor会在终端以ASCII格式打印监测结果。

设计规则

  下面给出一些编写TestBench的基本设计规则:

了解仿真器特性:不同的仿真器由不同的特性、能力和性能差异,可能会产生不同的仿真结果。仿真器可分为两类:(1).基于事件,当输入、信号或门的值改变时调度仿真器事件,有最佳的时序仿真表现;(2).基于周期,在每个时钟周期优化组合逻辑和分析结果,比前者更快且内存利用效率高,但时序仿真结果不准确。即使是基于事件的仿真器,在调度事件时采用不同的算法也会影响到仿真性能(比如同一仿真时刻发生了多个事件,仿真器需要按一定的序列依次调度每个事件)。了解仿真器特性有一定必要,但目前最常用的ModelSim、Vivado Simulator等仿真器也已经非常强大。

避免使用无限循环:仿真器调度事件时,会增加CPU和内存的使用率,仿真进程也会变慢。因此除非迫不得已(比如利用forever生成时钟信号),尽量不要使用无限循环。

将激励分散到多个逻辑块中:Verilog中的每个initial块都是并行的,相对于仿真时刻0开始运行。将不相关的激励分散到独立的块中,在编写、维护和更新testbench代码时会更有效率。

避免显示不重要的数据:对于大型设计来说,会有超过10万个事件和大量的信号,显示大量数据会极度拖慢仿真速度。因此最好的做法是每隔N个时钟周期显示重要信号的数据,以保证足够的仿真速度。

审核编辑:汤梓红

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

    关注

    1625

    文章

    21663

    浏览量

    601668
  • 仿真器
    +关注

    关注

    14

    文章

    1016

    浏览量

    83621
  • Verilog
    +关注

    关注

    28

    文章

    1343

    浏览量

    109970
  • HDL
    HDL
    +关注

    关注

    8

    文章

    327

    浏览量

    47336
  • 时钟信号
    +关注

    关注

    4

    文章

    445

    浏览量

    28506

原文标题:Testbench编写指南(1)基本组成与示例

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

收藏 人收藏

    评论

    相关推荐

    贴片机的基本组成

      贴片机实际上是一种精密的工业机器人,是机-电-光以及计算机控制技术的综合体。  基本组成  从根本上说,贴片机由软/硬件两部分组成:硬件部分由机械机构(包括机械主体、传动与驱动机构、气动真空系统
    发表于 09-03 10:06

    UPS电源的基本组成及各部分功能简述

    UPS电源的基本组成及其作用
    发表于 03-19 10:58

    单片机的特点与基本组成

    单片机的特点与基本组成电子技术中单片机的应用单片机的应用
    发表于 02-02 07:19

    计算机的基本组成及工作原理

    计算机的基本组成及其工作原理https://blog.csdn.net/sunshine_hsm/article/details/815365091.1 计算机系统的组成计算机系统是由硬件系统和软件
    发表于 06-30 06:35

    计算机的分类及基本组成

    本文目录一、考研大纲1. 计算机发展的历程2.计算机的层次结构计算机系统的基本组成计算机硬件的基本组成计算机的软件与硬件的关系计算机的工作过程(指令执行的过程)3.计算机的性能指标 ==(重点
    发表于 07-16 07:12

    雷达发射机的任务和基本组成

    本篇博文是看完西安电子科技大学的魏青老师的课程所做的学习笔记,特此记录。文章目录雷达发射机的任务和基本组成雷达发射机的主要质量指标脉冲调制器雷达发射机的任务和基本组成雷达发射机的任务任务:产生大功率
    发表于 09-14 08:08

    计算机的基本组成及工作原理是什么

    计算机的基本组成及工作原理(3)
    发表于 09-16 08:42

    计算机硬件的基本组成

    嵌入式系统设计师学习笔记③:计算机的基本组成计算机硬件的基本组成:输入/输出设备(I/O设备)、存储器(主存储器、辅助存储器)、CPU(中央处理器)等。CPU中包含运算器和控制两大组成部分和寄存器组
    发表于 12-23 06:00

    单片机的基本组成

    1、单片机的基本组成 单片机的基本组成包括中央处理器CPU,程序存储器ROM,数据存储器RAM和外设;2、哈佛存储结构与冯诺依曼存储结构 哈佛结构是一种将程序指令储存与数据指令储存分开的储存器结构
    发表于 01-05 06:03

    DS1302 的基本组成和工作原理

    DS1302 的基本组成和工作原理DS1302 的基本组成和工作原理DS1302 的管脚排列及描述如下图及表所示
    发表于 01-14 13:27 17次下载
    DS1302 的基<b class='flag-5'>本组成</b>和工作原理

    数控机床的基本组成组成部分

    数控机床的基本组成组成部分 数控机床一般由控制介质、数控装置、伺服系统和机床本体组成。图1—2的实线所示为开环控制的数控机床框图。
    发表于 05-06 21:38 2.3w次阅读

    单片机的基本组成

    介绍单片机的基本组成,原理和概念性较强,较基础。
    发表于 04-29 11:28 0次下载

    dcs系统的基本组成

    本文主要介绍了dcs系统的基本组成.三站一线:工程师站、操作员站、现场控制站、系统网络。
    的头像 发表于 10-18 15:42 1.7w次阅读

    Testbench本组成与示例

    根据需要,可以同时使用两种方法。每一个initial块、always块之间都是并行工作的关系,但在initial块内部是顺序地处理事件。因此复杂的激励序列应该分散到多个initial或always块中,以提高代码可读性和可维护性。
    的头像 发表于 11-20 11:38 3460次阅读
    <b class='flag-5'>Testbench</b>基<b class='flag-5'>本组成</b>与示例

    简述光纤传输线路的基本组成

    光纤传输线路作为现代通信网络的基石,其基本组成涵盖了多个关键部分,共同协作以实现高效、稳定的光信号传输。以下是对光纤传输线路基本组成的详细描述,旨在全面解析其技术架构与工作原理。
    的头像 发表于 08-09 15:15 464次阅读