一.Test Bench 主要功能:
简单来说就是:
a.通过Verilog程序的行为描述,为待测信号提供激励信号
b.设置理想结果。
c.将输出结果与理想结果比较,判断内部功能结构是否正确。
Test Bench 编码原则(全加器为例子)
全加器Verilog实现代码:
`timescale 1ns / 1ps
module add_4b(
input clk,
input rst,
input [3:0] a,
input [3:0] b,
input cin,
output reg [3:0] sum,
output reg cout
);
always@ (posedge clk or negedge rst )
begin
if(!rst)
sum <= 4'b0;
else
begin
{cout,sum} <= a+b+cin;
end
end
endmodule
TestBench代码:
`timescale 1ns / 1ps
module add_4b_tb();
reg clk,rst;
reg [3:0] a;
reg [3:0] b;
reg cin;
wire [3:0] sum;
wire cout;
integer case_num;
add_4b add_4b_01(
.clk (clk),
.a (a),
.b (b),
.cin (cin),
.sum (sum),
.cout (cout)
);
always begin
#5 clk = ~clk;
end
initial begin
clk=1'b0;
case_num = 1;
rst = 1;
a = 4'b1010;
b = 4'b0001;
cin = 1'b0;
#20;
if (sum == 4'b1011 && cout == 1'b0)
$display ("[simulation INFO] %2d pass.", case_num);
else
$display("[simulation ERROR] %2d fall.",case_num);
#200;//测试一,验证无进位输出。
case_num = 2;
a=4'b1000;
b=4'b1110;
cin = 1'b1;
#20
if (sum ==4'd7&&cout == 1'b1)
$display ("[simulation INFO] %2d pass.",case_num);
else
$display("[simulation ERROR] %2d fall",case_num);
#200;//测试二,验证进位输出
$finish;
end
endmodule
结果:
结果说明:无进位输出结果,有进位输出结果。与预想中的一样。测试成功。
Tb编码规则:
1.仿真时间标度语句 必须存在
`timescale 1ns / 1ps
仿真中产生50占空比%方波 #5 clk = ~clk;
时间延时 #200;#20;
都是基于这个时间标度进行的。
2.整个程序仍在“module_endmodule
”中,不必写出端口描述。
直接module add_4b_tb();
即可。
3.为 输入信号 定义的 激励 必须用reg
4.为 输出信号 定义的 激励 必须用wire
然后就是验证思路的设计了。
比如验证4位全加器, (无进位) 就设置 a=1010 b=0001;
比较理想输出1011 = 实际输出 即可。
(有进位) 同上