SOC课程——④——Verilog程序(Testbench的编写)
testbench的作用:提供输入激励
1 编写testbench
-
编写的流程
-
时钟信号的固定写法
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;
//赋初值
din0 = 0;
#(10*CYCLE)
//开始赋值
(开始赋值的语句)
end
//输入信号din1赋值方式
initial begin
#1;
//赋初值
din0 = 0;
#(10*CYCLE)
//开始赋值
(开始赋值的语句)
end
模板和流程
- 定义时间标识
- 原模块的输入信号定义为reg类型
- 原模块的输出信号定义为wire类型
- 模块的例化
- 输入信号的驱动
'timescale 1ns/1ns
module testbench_name();
//时钟和复位
reg clk;
reg rst_n;
//uut的输入信号
reg[3:0] din0;
reg din1;
......(等信号)
//uut的输出信号
wire dout0;
wire[4:0] dout1;
......(等信号)
// 时钟周期,单位是ns,可在此修改时钟周期
parameter CYCLE = 20;
//复位时间,此时表示复位3个时钟周期的时间
parameter RST_TIME = 3;
//待测试的模块例化
module_name uut(
.clk (clk ),
.rst_n (rst_n ),
.din0 (din0 ),
.din1 (din1 ),
.dout0 (dout0 ),
.dout1 (dout1 )
......(等信号)
);
//生成本地时钟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;
//赋初值
din0 = 0;
#(10*CYCLE)
//开始赋值
(开始赋值的语句)
end
//输入信号din1赋值方式
initial begin
#1;
//赋初值
din0 = 0;
#(10*CYCLE)
//开始赋值
(开始赋值的语句)
end
endmodule