verilog仿真文件TestBench编写

verilog仿真文件TestBench编写

笔者最近在准备Verilog的期末考,复习的同时,总结了一套testbench的编写风格。

一、首先准备好需要被测模块的Verilog代码

以计数器为例:

module counter_6(
        input clk,
        input rst_n,
        output reg [2:0] CNT
        );
        parameter MAX=3'b101;
        
        always @(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
            begin
                CNT<=3'b000;
        end
            else
            begin
                if(CNT==MAX)
                begin
                    CNT<=3'b000;
                end
                else
                begin
                    CNT<=CNT+3'b001;
                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 = 1'b1;
	rst_n = 1'b0;
	CNT = 3'b000;
#100 rst_n = 1'b0;//延时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 = 1'b0;
	rst_n = 1'b1;
	CNT = 3'b000;
	#100 rst_n = 1'b0;//延时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文件的编写方法,有错误请指正。

你可能感兴趣的:(verilog学习,fpga开发,verilog)