参考资料
【明德扬_verilog零基础入门语法HDL仿真快速掌握-手把手教你写FPGA/ASIC代码设计流程中的应用】
testbench是一种验证的手段。首先,任何设计都是会有输入输出的。
但是在软环境中没有激励输入,也不会对你设计的输出正确性进行评估
那么此时便有一种,模拟实际环境的输入激励和输出校验的一种“虚拟
平台”的产生。在这个平台上你可以对你的设计从软件层面上进行分析和
校验。
小贴士:ps是皮秒,ns是纳秒
`timescale 1ns / 1ps
//时钟和复位
reg clk ;
reg rst_n ;
//uut 的输入信号
reg[3:0] din_0 ;
reg din_1 ;
//uut 的输出信号
wire dout_0 ;
wire[4:0] dout_1 ;
//时钟周期,单位为ns,可在此修改时钟周期
parameter CYCLE = 20;
//复位时间,此时表示复位3个时钟周期的时间
parameter RST_TIME = 3;
//待测试的模块例化
module_name uut(
.clk (clk) ,
.rst_n (rst_n) ,
.din_0 (din_0) ,
.din_1 (din_1) ,
.dout_0 (dout_0) ,
.dout_1 (dout_1)
// ,更多...
);
//生成本地时钟:50M
initial begin
clk = 0;
forever
#(CYCLE/2)
clk = ~clk;
end
//产生复位信号
initial begin
rst_n = 1;
#2;
rst_n = 0;
#(CYCLE*RST_TIME);
rst_n = 1;
end
//输入信号din0赋值方式
initial begin
#1;
//赋初值
din_0 = 0;
#(10*CYCLE);
//开始赋值
end
//输入信号din1赋值方式
initial begin
#1;
//赋初值
din_1 = 0;
#(10*CYCLE);
//开始赋值
end
**
**
不相关的信号可以分别单独initial
//生成本地时钟:50M
initial begin
clk = 0;
forever
#(CYCLE/2)
clk = ~clk;
end
如果需要间隔较长一段时间才复位,可以修改RST_TIME值,将其变大些,即间隔更多周期才复位
//产生复位信号
initial begin
rst_n = 1;
#2;
rst_n = 0;
#(CYCLE*RST_TIME);
rst_n = 1;
end
#1; 是指时钟上升沿后的一点时间进行变化,目的是在上升沿期间保持信号稳定
//输入信号din0赋值方式
initial begin
#1;
//赋初值
din_0 = 0;
#(10*CYCLE);
//开始赋值
end
module TestBench_name();
//时钟和复位
reg clk ;
reg rst_n ;
//uut 的输入信号
reg[3:0] din_0 ;
reg din_1 ;
//uut 的输出信号
wire dout_0 ;
wire[4:0] dout_1 ;
//时钟周期,单位为ns,可在此修改时钟周期
parameter CYCLE = 20;
//复位时间,此时表示复位3个时钟周期的时间
parameter RST_TIME = 3;
//待测试的模块例化
module_name uut(
.clk (clk) ,
.rst_n (rst_n) ,
.din_0 (din_0) ,
.din_1 (din_1) ,
.dout_0 (dout_0) ,
.dout_1 (dout_1)
// ,更多...
);
//生成本地时钟:50M
initial begin
clk = 0;
forever
#(CYCLE/2)
clk = ~clk;
end
//产生复位信号
initial begin
rst_n = 1;
#2;
rst_n = 0;
#(CYCLE*RST_TIME);
rst_n = 1;
end
//输入信号din0赋值方式
initial begin
#1;
//赋初值
din_0 = 0;
#(10*CYCLE);
//开始赋值
end
//输入信号din1赋值方式
initial begin
#1;
//赋初值
din_1 = 0;
#(10*CYCLE);
//开始赋值
end
endmodule
要求输入的波形图