1. 給模塊取一個名字(可任意取,一般在仿真模塊后加"_test")
例如:
module myDesign_test;
/*/*/
endmodule
2. 定義變量類型
將輸入信號定義為reg類型的;將輸出信號定義為wire類型的;
3. 例化模塊,並將輸入的信號和2中定義的信號進行關聯。
例如:
myDesign myDesignuut(.rst(rst),
.clk(clk),
.data_in(data_in),
...........
.data_out(data_out) );
4. 產生時鍾模塊
根據需要產生一個或多個時鍾。一般先定義時鍾周期為一個常量。
例如:
Parameter CYCLE = 100;
always #(CYCLE) clk = ~clk;//定義系統時鍾
always @(clk) clk2 = ~clk2;//二分頻
-----各種生成時鍾的方法就不說了
5. 時鍾控制和reset信號的控制
一般放在initial模塊里,跟據具體需要對reset信號進行編輯;並注意時鍾信號的初始化,否則無法產生正常的時鍾信號(若不初始化,clk可能默認為x狀態,~x狀態仍為x,即不會產生時鍾驅動)。
例如:
initial
begin
clk = 0;
clk2 = 0;
.............//時鍾相關信號初始化
rst = 0;
#(3*CYCLE);
rst = 1;
#(CYCLE);
rst = 0;
......//根據需要對整個系統的復位信號進行設計,要有清晰的時序觀念
end
6. 初始化文件操作
基本的文件操作包括讀和寫,將它們寫在一個initial中(僅關心文件的打開和關閉,不進行仿真過程中的寫操作)。
讀操作需要一個采用ROM格式寫的文件,和一個ROM單元:
例如:
reg[10:0] my_rom [2:0];
$readmemb("my_rom_file.txt",my_rom);
寫操作需要一個文件句柄,還要注意仿真結束前關閉文件操作。
例如:
integer fid;
fid = $fopen("resut.txt");
.........
#(1000000*CYCLE);
$fclose(fid);
7. 控制信號和輸出結果的編程
根據具體的實例對控制信號進行編程,並采樣其輸出結果,分多個initial模塊進行。要形成很強的時序觀念,並盡量使每個initial模塊結構相對單一。此時大多調用文件寫操作保存仿真結果。
例如:
.......
$fdisplay(fid,"%b",data_out);
.......
8.結束testbench程序的運行
用$stop 或$finish結束程序的運行,另起一個initial。
例如:
initial
begin
#(1000000*CYCLE);
$ stop;
end
/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/