verilog仿真文件TestBench编写
verilog仿真文件TestBench编写
笔者最近在准备Verilog的期末考,复习的同时,总结了一套testbench的编写风格。
一、首先准备好需要被测模块的Verilog代码
以计数器为例:
module counter_6(
input clk,
input rst_n,
output reg [2:0] CNT
);
parameter MAX=3b101;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
CNT<=3b000;
end
else
begin
if(CNT==MAX)
begin
CNT<=3b000;
end
else
begin
CNT<=CNT+3b001;
end
end
end
endmodule
二、TestBench编写套路
(1)生成时钟信号
以下两种方式均可产生时钟信号
//方式一: parameter ClockPeriod = 10;//自定义时钟周期 initial begin forever clock = #(ClockPeriod/2) ~clock end
//方式二: parameter ClockPeriod = 10;//自定义时钟周期 initial begin always #(ClockPeriod/2) clock = ~clock end
(2)生成测试激励
initial begin clk = 1b1; rst_n = 1b0; CNT = 3b000; #100 rst_n = 1b0;//延时100ns开始启动
(3)模块例化
端口式格式:模块名 tb_被测试模块名(.接口(输入)) 名称顺序式格式 模块名 tb_被测试模块名(输入) 下面以接口式为例
counter_6 counter_6_tb( .clk(clk), .rst_n(rst_n), .CNT(CNT) );
(4)代码总结
`timescale 1ns / 1ps //测试时间基本单位为1ns,精度为1ps module counter_6_tb(); //输入 reg clk; reg rst_n; //输出 wire [2:0]CNT; //信号初始化 initial begin clk = 1b0; rst_n = 1b1; CNT = 3b000; #100 rst_n = 1b0;//延时100ns开始启动 end //生成时钟,模拟晶振实际的周期时序 always #10 clk = ~clk; //每10ns,sys_clk进行翻转,达到模拟晶振周期为20ns //或者:forever clk = #10 ~clk; //模块例化 counter_6 counter_6_tb( .clk(clk), .rst_n(rst_n), .CNT(CNT) ); endmodule
以上就是笔者总结出来的一套Verilog tb文件的编写方法,有错误请指正。
