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

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

3天内不再提示

Testbench基本组成与示例

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2020-11-20 11:38 次阅读

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

生成时钟信号

生成测试激励

显示结果

简单示例

设计规则

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

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个时钟周期显示重要信号的数据,以保证足够的仿真速度。

责任编辑:lq

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

    关注

    14

    文章

    988

    浏览量

    82997
  • HDL
    HDL
    +关注

    关注

    8

    文章

    324

    浏览量

    47104
  • 时钟信号
    +关注

    关注

    4

    文章

    374

    浏览量

    28068

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

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

收藏 人收藏

    评论

    相关推荐

    RFID系统的基本组成 rfid系统的工作原理

    RFID(Radio Frequency Identification)是一种通过无线电信号识别物品的技术,它由基本组成和工作原理两个方面构成。在本文中,我们将详细介绍RFID系统的基本组成以及
    的头像 发表于 02-04 13:48 1082次阅读

    工控机的基本组成和作用是什么

    工控机的基本组成和作用是什么  工控机是用于生产过程中的控制和管理的计算机设备,它具有高稳定性、高可靠性、高性能和多功能的特点。工控机的基本组成包括主机、显示器、输入设备、存储设备、扩展插槽、通信
    的头像 发表于 01-26 14:56 381次阅读

    陀螺仪的基本组成 陀螺仪的工作原理 陀螺仪的作用

    陀螺仪的基本组成 陀螺仪的工作原理 陀螺仪的作用 陀螺仪和重力传感器有什么区别呢? 陀螺仪是一种测量和感知设备,可用于测量或检测物体的角速度和角度变化。它由几个基本组成部分组成,包括旋转的转子、悬浮
    的头像 发表于 12-07 11:26 1134次阅读

    工控机的基本组成和作用是什么?

    工控机是工业自动化控制中不可或缺的设备,具备了数据采集和处理、远程监控和操作、实时控制和调度、数据存储和分析以及故障诊断和维护等重要作用。工控机的基本组成和作用需要综合考虑,以提供高性能、高可靠性
    的头像 发表于 09-19 10:12 478次阅读
    工控机的基<b class='flag-5'>本组成</b>和作用是什么?

    Testbench自动化验证方法介绍

    自动化验证testbench结果可以减少人工检查的时间和可能犯的失误,尤其对于比较大的设计。
    的头像 发表于 09-04 09:15 513次阅读

    Testbench的基本组成和设计规则

      对于小型设计来说,最好的测试方式便是使用TestBench和HDL仿真器来验证其正确性。一般TestBench需要包含这些部分:实例化待测试设计、使用测试向量激励设计、将结果输出到终端或波形窗口便于可视化观察、比较实际结果和预期结果。
    的头像 发表于 09-01 09:57 535次阅读
    <b class='flag-5'>Testbench</b>的基<b class='flag-5'>本组成</b>和设计规则

    振弦采集仪的工作原理及基本组成

    振弦采集仪的工作原理及基本组成 振弦采集读数仪主要用于测量振弦的振动频率和振幅,用于研究材料的力学性质。其工作原理是将振弦放置在一个封闭的环境中,并在振弦上方放置一个传感器,用于测量振弦的振动
    的头像 发表于 08-15 09:20 402次阅读
    振弦采集仪的工作原理及基<b class='flag-5'>本组成</b>

    Verilog Testbench怎么写 Verilog Testbench文件的编写要点

    之前在使用Verilog做FPGA项目中、以及其他一些不同的场合下,零散的写过一些练手性质的testbench文件,开始几次写的时候,每次都会因为一些基本的东西没记住、写的很不熟练,后面写的时候稍微
    的头像 发表于 08-01 12:44 1511次阅读
    Verilog <b class='flag-5'>Testbench</b>怎么写 Verilog <b class='flag-5'>Testbench</b>文件的编写要点

    机器人焊接系统基本组成结构详解

    机器人焊接系统基本组成: 1、弧焊机器人 2、焊机+送丝机 3、焊枪及清枪装置 4、保护气体设备 5、工作台、工装夹具、变位机 6、安全系统(围栏、光栅、自动门、门锁等) 7、排烟系统
    发表于 07-17 16:43 1256次阅读
    机器人焊接系统基<b class='flag-5'>本组成</b>结构详解

    电路板的基本组成和PCB的主要设计流程

    了产品最终的性能。 本文通过一个实际案例,分析电路板的基本组成和PCB的主要设计流程。 电路板的基本组成 目前的电路板,主要由以下组成: 线路:线路是做为原件之间导通的工具,在设计上会另外设计大铜面作为接地及电源层。 介电层(D
    的头像 发表于 06-29 17:09 3369次阅读
    电路板的基<b class='flag-5'>本组成</b>和PCB的主要设计流程

    testbench是什么? testbench测试的机制是什么?

    废话不多说直接上干货,testbench就是对写的FPGA文件进行测试的文件,可以是verilog也可以是VHDL。
    的头像 发表于 06-28 16:44 2269次阅读
    <b class='flag-5'>testbench</b>是什么? <b class='flag-5'>testbench</b>测试的机制是什么?

    机器视觉基本组成

    机器视觉基本组成 根据美国自动成像协会(AIA)的定义,机器视觉(Machine Vision)是一种应用于工业和 非工业领域的硬件和软件组合,它基于捕获并处理的图像为设备执行其功能提供操作指导
    的头像 发表于 06-27 15:35 727次阅读

    典型的UVM Testbench架构

    UVM类库提供了通用的代码功能,如component hierarchy、transaction level model(TLM),configuration database等等,使用户能够创建任何类型的Testbench架构。
    的头像 发表于 05-22 10:14 1273次阅读
    典型的UVM <b class='flag-5'>Testbench</b>架构

    光纤通信系统的基本组成

    光纤通信系统的基本组成 1. 光发送机: (1)功能: (2)组成框图: (3)对光源的要求: (4)结构参数 : (5)光源光谱特性: (6)电信号对光的调制的实现方式: 2.光纤
    发表于 05-17 09:39 1次下载
    光纤通信系统的基<b class='flag-5'>本组成</b>

    如何设计和构建Testbench呢?

    Testbench是几乎所有做动态仿真验证的工程师都要面对的问题,可能是需要设计,或者开发,又或者是维护,总有很多事情要在这上面折腾。
    的头像 发表于 05-08 10:16 615次阅读