基礎知識
Test bench即Verilog需要編寫的測試文件。在module設計完成、綜合之后我們需要通過測試文件完成對設計module的測試。
Test bench大致分為下面三個部分:
- 時鍾控制 clock control
一般采用always實現
實例化instantiate要測試的module
對實例的輸入賦值
與待測模塊的接口:與輸出端口相連接的變量定義為reg
與輸出端口相連的定義為wire
初始化變量
Verilog中使用initialblock初始化變量。
時鍾的產生
always # 10 clk=~clk; 產生時鍾
initial repeat(13) #5 clk=~clk
控制只產生13個時鍾
同步數據
initial forever @ (posedge clk) #3 x=$random;
為了降低多個輸入同時翻轉的概率,對時序電路的輸入一般采用素數作為時間間隔
隨機數據
initial repeat(5) #7 x=$random;
a=$random%60; //產生-59到59之間的隨機數
a={$random}%60; //產生0到59之間的隨機數
產生隨機事件間隔
always begin
t=$random
#(t) x=$random;
end
數據緩存
initial buffer = 16'b1110_0001_1011_0101;//將測試數據進行初始化
always@(posedge clk)
#1 {x,buffer}={buffer,x}//可以在控制的數據下輸入信號x
## 讀取數據文件 ##
reg [7:0] mem1[0:1024];//定義一個1KB的存儲
initial begin
$readmemh(data1.dat,mem1)
簡單的實例
`timescale 1ns / 10ps
`include "adder.v"
module test;
// Inputs
reg a,b;
wire sum,count;
// 實例化待測試模塊
add uut (
.sum(sum),
.c(count),
.b(b),
.a(a)
);
initial begin
// Initialize Inputs
a=0;
//沒經過20個單位時間,a取反
forever #20 a=~a;
end
initial begin
// Initialize Inputs
b=0;
//沒經過10個單位時間,b取反
forever #10 b=~b;
end
initial begin
//監控輸出
$monitor()$time,,,"%d+%d={%d,%d}",a,b,count,sum;
#40 $stop;
end
endmodule
Tip
$monitor出輸出打印顯示$stop停止當前仿真¥finish結束仿真
時鍾產生
- 使用initial語句
reg clock;
initial begin
clock=0;
forever #10 clock=~clock;
end
- 使用always語句
reg clock;
initial
clock=0;
always
#10 clock=~clock;
