TestBench的功能和編碼原則
阿新 • • 發佈:2021-01-11
一.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
);
[email protected] (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 = 實際輸出 即可。
(有進位) 同上