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

    文章

    1043

    浏览量

    85645
  • HDL
    HDL
    +关注

    关注

    8

    文章

    330

    浏览量

    48241
  • 时钟信号
    +关注

    关注

    4

    文章

    471

    浏览量

    29319

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    数字信号处理的基本组成及其特点?

    的以数字信号处理器为核心部件的数字信号处理系统框图,此系统既可处理数字信号,也可处理模拟信号。 图1数字信号处理系统框图 一 数字信号处理的基本组成? 当用此系统处理数字信号时,如图1所示,可直接将输入数字信号x(n)送入数字信
    的头像 发表于 06-18 09:02 ?366次阅读
    数字信号处理的基<b class='flag-5'>本组成</b>及其特点?

    testbench中如何使用阻塞赋值和非阻塞赋值

    本文详细阐述了在一个testbench中,应该如何使用阻塞赋值与非阻塞赋值。首先说结论,建议在testbench中,对时钟信号(包括分频时钟)使用阻塞赋值,对其他同步信号使用非阻塞赋值。
    的头像 发表于 04-15 09:34 ?716次阅读
    在<b class='flag-5'>testbench</b>中如何使用阻塞赋值和非阻塞赋值

    PCB的应用和基本组成

    剧增。现代PCB已从单面板演变为双面板、多层板和挠性板,并具有超高密度、微型化和高可靠性。本期选购指南将深入介绍PCB的组成、功能,并探讨在实际应用中的重要性。让我们一同探索PCB的奥秘,了解其在电子产业中的不可或缺地位吧。
    的头像 发表于 02-19 11:14 ?1244次阅读

    传感器的基本组成要素

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

    编写高效Testbench的指南和示例

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

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

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

    CC430射频示例

    电子发烧友网站提供《CC430射频示例.pdf》资料免费下载
    发表于 10-18 09:48 ?0次下载
    CC430射频<b class='flag-5'>示例</b>

    峰值检测电路的基本组成

    峰值检测电路(Peak Detection Circuit),又称为峰值检测器(Peak Detector),是一种用于测量信号波形中最大值(正峰值)或最小值(负峰值)的电子电路。这种电路在信号处理、音频设备、无线通信、模拟量测量以及电源监测等多个领域有着广泛的应用。峰值检测电路的核心功能是及时发现被检测波形的峰值,并输出一个与该峰值相等的直流电压或电流信号,或者是一个瞬时的电压脉冲,以便于后续电路的处理、存储或显示。
    的头像 发表于 10-10 16:10 ?4227次阅读

    RCD吸收电路的基本组成和工作原理

    RCD(Resistor-Capacitor-Diode)吸收电路是一种在电子电路中常见的保护和缓冲电路,主要用于减少开关器件在开关过程中产生的电压尖峰和电流冲击,从而保护电路中的敏感元件。
    的头像 发表于 10-10 14:42 ?8697次阅读

    自激振荡器由什么组成 自激振荡器的基本组成有什么和什么

    自激振荡器(自激震荡器)是一种能够产生连续振荡信号的电子设备,其基本组成主要包括 放大器 和 正反馈网络 。以下是对自激振荡器组成部分的介绍。 一、放大器 放大器是自激振荡器的核心部分,它的作用是将
    的头像 发表于 10-06 15:58 ?1047次阅读

    放大电路的组成原则是什么?

    放大电路是电子学中的基础概念,它的作用是将输入信号的幅度进行放大,以便进行后续的处理或传输。放大电路的组成原则涉及到电子元件的选择、电路的设计、信号的放大机制等多个方面。 1. 放大电路的基本组成
    的头像 发表于 09-23 10:35 ?1404次阅读

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

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

    沉板bnc基本组件是哪些

    德索工程师说道沉板BNC连接器作为BNC连接器的一种形式,其基本组件主要包括外壳、端子(或称为接触体)、压力弹簧片以及可能的接触点镀层等部分。下面将详细阐述这些基本组件:   材料:沉板BNC
    的头像 发表于 08-28 09:01 ?754次阅读
    沉板bnc基<b class='flag-5'>本组</b>件是哪些

    定时器的基本组成和工作模式

    定时器是计算机或电子设备中常见的一个硬件或软件组件,其主要功能是测量和控制时间的流逝。它在各种应用中起着至关重要的作用,如操作系统调度、多媒体播放、网络通信、工业自动化控制以及家电设备的定时功能等。定时器的工作原理基于时序控制,通过计数和中断机制来实现对时间的精确测量和控制。
    的头像 发表于 08-19 18:28 ?2940次阅读

    传感器的基本组成包括哪两大部分

    传感器是一种将物理量或化学量转换为电信号的装置,广泛应用于工业、农业、医疗、环保等领域。传感器的基本组成包括两大部分:敏感元件和转换元件。 一、敏感元件 敏感元件是传感器的核心部分,它能够感知被测量
    的头像 发表于 08-19 09:47 ?3293次阅读