在仿真的时候Testbench用来产生测试激励给待验证设计(Design Under Verification,DUV),或者称为待测设计(Design Under Test,DUT)。
2、测试程序的一般结构
由于Testbench是一个测试平台,信号集成在模块内部,没有输入输出。 在Testbench模块内,例化待测设计的顶层模块,并把测试行为的代码封装在内,直接对待测系统提供测试激励。
(1)组合逻辑电路仿真环境的搭建
实例:
全加器的真值表
Verilog HDL编写的全加器程序代码:
module adder1(a,b,ci,so,co);
input a,b,ci;
output so,co;
assign{co,so}=a+b+ci;
endmodule
module adder1_tb;
wire so,co;
reg a,b,ci;
adder1 U1(a,b,ci,so,co); //模块例化
initial // 测试信号产生
begin
a=0;b=0;ci=0;
#20 a=0;b=0;ci=1;
#20 a=0;b=1;ci=0;
#20 a=0;b=1;ci=1;
#20 a=1;b=0;ci=0;
#20 a=1;b=0;ci=1;
#20 a=1;b=1;ci=0;
#20 a=1;b=1;ci=1;
#200 $finish;
end
endmodule
(2)时序逻辑电路仿真环境的搭建
实例:
module cnt10(clk,rst,ena,q,cout);
input clk,rst,ena;
output [3:0] q;
output cout;
reg [3:0] q;
always @ (posedge clk or posedge rst)
begin
if(rst)q=4'b0000;
else if(ena)
begin
if(q<9)q=q+1;
else q=0;
end
end
assign cout=q[3]&q[0];
endmodule
module cnt10_tb;
reg clk,rst,ena;
wire [3:0] q;
wire cout;
cnt10 U1(clk,rst,ena,q,cout); //模块实例化
always #50 clk=~clk; //时钟信号产生
initial begin
clk=0;rst=0;ena=1; //控制信号产生
#1200 rst=1;
#120 rst=0;
#2000 ena=0;
#200 ena=1;
#20000 $finish;
end
endmodule