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

    文章

    1018

    浏览量

    83796
  • HDL
    HDL
    +关注

    关注

    8

    文章

    327

    浏览量

    47407
  • 时钟信号
    +关注

    关注

    4

    文章

    449

    浏览量

    28582

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

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

收藏 人收藏

    评论

    相关推荐

    传感器的基本组成要素

    在当今科技日新月异的时代,传感器作为连接物理世界与数字世界的桥梁,扮演着举足轻重的角色。从智能家居到工业自动化,从医疗健康到环境监测,传感器的身影无处不在,它们默默地收集着各种数据,为我们的生活带来了前所未有的便利与智慧。那么,这些神奇的传感器究竟由哪些基本组成要素构成呢?让我们一起揭开它们的神秘面纱。
    的头像 发表于 11-28 08:45 561次阅读

    编写高效Testbench的指南和示例

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

    医疗机器人有哪些基本组成_医疗机器人有哪些功能

     医疗机器人是由多个关键部分组成的复杂系统,这些部分共同协作以实现其在医疗领域中的各种功能。以下是医疗机器人的基本组成
    的头像 发表于 10-21 15:31 1147次阅读

    安泰功率放大器的基本组成和选购技巧有哪些

    功率放大器 是电子设备中的重要组件,用于增加输入信号的功率。它在各种应用中广泛使用,包括音频放大、射频放大、通信、广播、工业控制等领域。下面安泰电子将介绍功率放大器的基本组成和选购技巧,从而帮助
    的头像 发表于 09-09 11:30 214次阅读
    安泰功率放大器的基<b class='flag-5'>本组成</b>和选购技巧有哪些

    简述锯齿波同步触发威廉希尔官方网站 的基本组成

    电力电子器件。 基本概念 锯齿波 :一种电压波形,其上升和下降阶段都是线性的,形状类似于锯子的牙齿。 同步触发 :指的是触发信号与输入信号同步,以确保触发时刻的准确性。 基本组成 锯齿波发生器 :产生锯齿波电压的核心
    的头像 发表于 08-14 15:58 1330次阅读

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

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

    数字光纤通信系统的基本组成和关键技术

    数字光纤通信系统作为现代通信技术的重要组成部分,以其高速率、大容量、长距离传输等显著优势,在通信领域发挥着至关重要的作用。该系统主要由光发射机、光纤传输线路、光接收机以及一系列辅助设备组成。以下是对数字光纤通信系统基本组成的详细
    的头像 发表于 08-09 10:48 1674次阅读

    试简述弹簧管压力表的基本组成和测压原理

    弹簧管压力表是一种常用的压力测量仪器,广泛应用于工业、科研、医疗等领域。它具有结构简单、测量范围广、精度高、稳定性好等优点。本文将介绍弹簧管压力表的基本组成和测压原理。 一、弹簧管压力表的基本组成
    的头像 发表于 08-07 11:01 1332次阅读

    LSTM模型的基本组成

    的梯度消失或梯度爆炸问题。LSTM通过引入三个“门”控制结构——遗忘门、输入门和输出门,以及一个记忆细胞(memory cell),实现了对信息的有效存储和更新。本文将对LSTM模型的架构进行详细分析,包括其基本组成、前向传播过程、反向传播算法以及实际应用场景。
    的头像 发表于 07-10 17:01 1355次阅读

    PLC控制威廉希尔官方网站 的工作原理和基本组成

    在工业自动化领域,PLC(Programmable Logic Controller,可编程逻辑控制器)已成为一种不可或缺的控制设备。PLC通过预先编写的程序,实现对工业设备的自动化控制,极大地提高了生产效率。本文将详细介绍PLC控制威廉希尔官方网站 的工作原理和基本组成,以便读者更好地理解和应用PLC技术。
    的头像 发表于 06-14 14:03 994次阅读

    闭环控制系统的工作原理和基本组成

    闭环控制系统,作为现代控制理论的核心内容之一,广泛应用于工业、军事、航空航天等领域。它通过反馈机制实现对被控对象的精确控制,使系统输出能够持续跟踪并达到期望的设定值。本文将详细阐述闭环控制系统的工作原理和基本组成,并通过实例进行说明。
    的头像 发表于 06-13 15:00 3491次阅读

    汽车ABS的基本组成有哪些

    的基本组成主要包括以下几个部分: 速度传感器:速度传感器是ABS系统中的关键部件,它的主要作用是检测车轮的转速并将这个信号传递给控制单元。每个车轮都有一个速度传感器,通常安装在轮毂或刹车盘上。 控制单元:控制单元是ABS系统
    的头像 发表于 05-02 15:04 1015次阅读
    汽车ABS的基<b class='flag-5'>本组成</b>有哪些

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

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

    Zigbee网络的工作原理 Zigbee网络的基本组成 Zigbee网络的应用

    Zigbee网络的工作原理 Zigbee网络的基本组成 Zigbee网络的应用领域  Zigbee是一种无线通信技术,其工作原理是基于无线传感器网络(WSN)的概念。Zigbee网络由一个或多个无线
    的头像 发表于 02-01 11:38 1798次阅读

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

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