FPGA入门必备:Testbench仿真文件编写实例详解

时间:2025-04-28  作者:Diven  阅读:0

引言:在编写完HDL代码后,往往需要通过仿真软件Modelsim或者Vivadao自带的仿真功能对HDL代码功能进行验证,此时我们需要编写Testbench文件对HDL功能进行测试验证。本文我们介绍写Testbench编写的一些要点。

FPGA入门必备:Testbench仿真文件编写实例详解

1.Testbench文件结构模板

编写Testbench的目的是为了测试设计电路的功能、性能与设计的预期是否相符。验证软件功能通过包括以下步骤:

      • 产生合适的模拟激励(波形):该激励通常要覆盖被测HDL模块(黑盒或者称作DUT模块)所有可能得输入状态;

      • 将产生的激励加入到被测试模块中并观察其响应:即将DUT模块例化到Testbench文件中,运行仿真软测测试;

      • 将输出响应与期望值相比较:该步骤是验证DUT功能较耗时的部分,需要仔细分析代码功能是否达到预期设计,所有代码段功能是否正常。

Testbench结构一般模板如下:

 

Module Test_bench_name();//通常无输入无输出//01:信号或变量声明定义//--逻辑设计中输入对应 reg 型//--逻辑设计中输出对应 wire 型//02:使用 initial 或 always 语句产生激励//03:例化待测试DUT模块//04:监控和比较输出响应endModule
2.时钟激励输入示例

 

常见的时钟有:50%占空比连续时钟、固定周期数时钟、非50%占空比时钟,示例如下。

 

parameter ClockPeriod=10; //参数化时钟周期initial begin clk_i=0; forever#(ClockPeriod/2) clk_i = ~clk_i; endinitialbegin clk_i=0; endalways #(ClockPeriod/2) clk_i=~clk_i;parameter ClockPeriod=10; //参数化时钟周期initialbegin clk_i=0; repeat(6) #(ClockPeriod/2) clk_i=~clk_i; endparameter ClockPeriod=10; //参数化时钟周期initialbeginclk_i=0;forever begin #((ClockPeriod/2)-2) clk_i=0; #((ClockPeriod/2)+2) clk_i=1; endend
3.复位激励输入示例

 

复位输入主要包括异步复位、同步复位,代码示例如下。

 

initialbegin rst_n_i=1; #100; rst_n_i=0; #100; rst_n_i=1; endinitialbegin rst_n_i=1; clk_i = 0; @(negedge clk_i) rst_n_i=0; #100; //固定时间复位 repeat(10) @(negedge clk_i); //固定周期数复位 @(negedge clk_i) rst_n_i=1; endalways #5 clk_i=~clk_i;task reset;input [31:0] reset_time; //复位时间可调,输入复位时间 RST_ING=0; //复位方式可调,低电平或高电平 begin rst_n=RST_ING; //复位中 #reset_time; //复位时间 rst_n_i=~RST_ING; //撤销复位,复位结束 endendtask
4.双向口inout示例
reg sck;wire sda; //inout信号sda定义为wire型reg sda_r; //inout 输出定义为reg型reg sda_en;assign sda_r = (sda_en) ? mosi : 1'bz;assign sda =sda_r;
5.特殊信号设计
task i_data; input [7:0] dut_data; begin@(posedge data_en); send_data=0; @(posedge data_en); send_data=dut_data[0]; @(posedge data_en); send_data=dut_data[1]; @(posedge data_en); send_data=dut_data[2]; @(posedge data_en); send_data=dut_data[3]; @(posedge data_en); send_data=dut_data[4]; @(posedge data_en); send_data=dut_data[5]; @(posedge data_en); send_data=dut_data[6]; @(posedge data_en); send_data=dut_data[7]; @(posedge data_en); send_data=1; #100; endendtask//调用方法:i_data(8'hXX);task more_input; input [7:0] a; input [7:0] b; input [31:0] times; output [8:0] c; begin repeat(times) //等待 times 个时钟上升沿 @(posedge clk_i) c=a+b; //时钟上升沿 a,b 相加 endendtask//调用方法:more_input(x,y,t,z); //按声明顺序initialbegin cs_n=1; //片选无效 wr_n=1; //写使能无效 rd_n=1; //读使能无效 addr=8'hxx; //地址无效 data=8'hzz; //数据无效 #100; cs_n=0; //片选有效 wr_n=0; //写使能有效 addr=8'hF1; //写入地址 data=8'h2C; //写入数据 #100; cs_n=1; wr_n=1; #10; addr=8'hxx; data=8'hzz; end//@使用沿触发//wait 语句都是使用电平触发initialbegin start=1'b1; wait(en=1'b1); #10; start=1'b0; end

 

6.仿真控制语句及系统任务描述

 

$stop // 停止运行仿真,modelsim 中可继续仿真$stop(n) //带参数系统任务,根据参数 0,1或2不同,输出仿真信息$finish //结束运行仿真,不可继续仿真$finish(n) //带参数系统任务,根据参数 0,1或2不同,输出仿真信息//0:不输出任何信息//1:输出当前仿真时刻和位置//2:输出当前仿真时刻、位置和仿真过程中用到的 memory 以及 CPU 时间的统计$random //产生随机数$random % n //产生范围-n 到 n 之间的随机数{$random} % n //产生范围 0 到 n 之间的随机数$monitor //仿真打印输出, 打印出仿真过程中的变量,使其终端显示 $display //终端打印字符串,显示仿真结果等$time //返回 64 位整型时间$stime //返回 32 位整型时间$realtime //实行实型模拟时间
8. 文本输入方式
//verilog 提供了读入文本的系统函数$readmemb/$readmemh("<数据文件名>",<存储器名>);$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>);$readmemb/$readmemh("<数据文件名>",<存储器名>,<起始地址>,<结束地址>);$readmemb:$readmemh:

 

审核编辑:黄飞

猜您喜欢

电子元器件中,固态电容和电解电容是常见的两种类型。很多人好奇,能否互相代换。本文将对此进行探讨。固态电容的特点固态电容使用固态电解质。的体积小,寿命长。耐高温性...
2025-03-20 19:00:34

机用丝锥是用于加工内螺纹的工具,应用于机械制造、汽车工业和金属加工等领域。丝锥的主要功能是将外部的螺纹形状转化为内部的螺纹孔,确保零件之间的连接牢固可靠。根据不...
2025-07-24 00:00:00

贴片电阻上的「2001」并不是直接代表阻值大小,而是采用数字编码来表示。其中,前三位数字「200」代表有效数字,最后一位数字「1」代表10的n次方(n为最后一位...
2024-11-26 11:29:42

稳压二极管,又称齐纳二极管,是能够在特定反向电压下保持稳定电压的半导体元件。应用于电源电路中,以保护电路免受电压波动的影响。了解稳压二极管的好坏对照,可以帮助工...
2025-04-06 10:01:39


EMC滤波器是电磁兼容性(EMC)设计中不可少的组件,主要用于抑制电磁干扰,保护设备正常工作。根据不同的应用需求,EMC滤波器可以分为以下几类:按照结构形式,E...
2020-07-02 00:00:00

贴片电阻,就是表面贴装型的电阻器。体型微小,通常呈长方形或圆柱形,应用于各种电子电路中。别看小,作用却非常重要,堪称电子电路中的小巨人。那么,贴片电阻究竟有什么...
2024-11-29 10:25:46

粘度计是用于测量液体粘度的仪器,应用于多个领域。在化工行业中,粘度计用于监测和控制化学反应过程,确保产品质量和生产效率。在食品行业,粘度计帮助制造商检测液体的流...
2023-02-05 00:00:00

作者:谢桂辉,郑旭初,赵天明,刘子绪,赵 娟引言锁相放大器是一种用于测量动态信号的电子仪器,它的功能是从被噪声淹没的信号中测出某一频率的信号的相位和幅值。利...
2020-12-03 08:49:00

现代电子设备中,封装技术的发展对产品的性能和尺寸起着至关重要的作用。QFN(QuadFlatNo-lead)封装因其小型化、高性能和散热效率而受到广泛关注。本文...
2025-02-24 13:45:15