前言
TestBench模塊沒有輸人輸出,在TestBench模塊內實例化待測設計的頂層模塊,並把測試行為的代碼封裝在內,直接對測試系統提供測試激勵。
基本的Textbench結構:
module textbench();
//數據類型聲明
//對被測試模塊實例化
//產生激勵測試
//對輸出相應進行收集
endmodule
我們還可以更詳細化:
module textbench();
//信號或變量聲明定義
//邏輯設計中輸入信號在這里對應reg型變量
//邏輯設計中的輸出信號在這里對應wire型變量
//例化測試模塊
//使用initial或always語句產生激勵
//監控和比較輸出響應
endmodule
我們給出一個例子:對帶復位端的D觸發器進行驗證的測試模塊
`timescale 1ns/1ns
module tb();
reg clock,reset,d; //變量聲明
wire q1,q2;
initial clock=0;
always #5 clock=~clock; //生成時鍾信號
initial d=1;
begin
reset=1;
#12 reset=0;
#11 reset=1; //仿真信號產生
#17 $stop //仿真控制
end
dff2 dss2(.clock(clock),.reset(reset),.d(d),.q2(q2)); 待測試模塊實例化
endmodule
時鍾信號
時鍾信號是時序電路所必需的信號之一,該信號可以由多種方式產生。
可以使用initial和always結構共同生成時鍾信號,被動地檢測響應時使用always語句,主動響應時使用initial語句。
它們的區別是:initial語句只執行一次,always語句不斷地重復執行
栗子:
reg clock;
initial clock=0;
always #10 clock=~clock;
采用此代碼生成的是一個占空比為50%的時鍾。
如果只用always語句,可以生成任意占比的時鍾,不過在設計的時候一般用不到這一種
栗子:
always 結構占空比為50%的時鍾
reg clock;
always begin
#5 clock=0;
#5 clock=1;
end
always 結構任意占空比時鍾
reg clock;
always begin
#15 clock=0;
#5 clock=1;
end
還有initial 語句生成時鍾,不過我們在此不在涉及這方面的知識.
復位信號
由於時序電路一般會有一個復位端把電路回歸到初始狀態,所以為了保證時序電路的工作正確,仿真開始時會給電路一個復位信號使其完成初始化。出於電路穩定性和節約功耗兩方面考慮,選擇高電平作為復位信號
,電路正常工作時只需要維持低電平
即可。
復位信號可分為異步復位信號
和同步復位信號
。
-
同步復位信號是指時鍾有效沿到來時對觸發器進行復位所產生的信號
-
異步復位信號不依賴於時鍾信號,只在系統復位有效時產生復位信號。
舉例:
//異步復位信號
reg rst_n;
initial begin
rst_n=1;
#10 rst_n=0;//從10ns開始復位,持續時間為50ns
#50 rst_n=a;
end
//同步復位信號
initial begin
rst_n=1; //將 rst_n初始化為1,在第一個時鍾下降沿復位,延時30ns,
@(posedge clock); //在下一個時鍾下降沿撤銷復位
rst_n=0;
#30 //等待時鍾clock下降沿
@(posedge clock);
rst_n=1;
end
編譯指令
timescale時間尺度
timescale
命令用來說明跟在該命令后的模塊的時間單位和時間精度。使用timescale
命令可以在同一個設計里包含采用了不同時間單位的模塊。
例如,一個設計中包含兩個模塊,其中一個模塊的時間延遲單位為納秒(ns),另一個模塊的時間延遲單位為皮秒( ps)。EDA 工具仍然可以對這個設計進行仿真測試。
格式:
`timescale<時間單位>/<時間精度>
在這條命令中,時間單位參量
是用來定義模塊中仿真時間和延遲時間的基准單位的
。時間精度參量是用來聲明該模塊的仿真時間的精確程度的
,該參量被用來對延遲時間值進行取整操作(仿真前),因此該參量又可以被稱為取整精度。如果在同一個程序設計里,存在多個timescale
命令,則用最小的時間精度值來決定仿真的時間單位,另外,時間精度值不能大於時間單位值。
用於說明時間單位和時間精度參量值的數字必須是整數
可以為1,10,100
單位只能為:單位為秒(s)、毫秒(ms)、微秒(us)、納秒(ns)、皮秒(ps)、飛秒(fs)
關於宏定義、條件編譯指令、文件包含處理這里不詳細闡述
測試相關的系統任務和系統函數
顯示任務$display
與 $write
這兩個任務能夠把指定的信息輸出到輸出設備中,如仿真器的顯示窗口
$display/$write(p1,p2,……,pn) ;
這兩個任務的作用基本相同,即將參數p2到 pn按參數pl
給定的格式輸出。$display
自動地在輸出后進行換行,$write
則不換行。
如果想在一行里輸出多個信息,可以使用$write
。
參數pl通常稱為“格式控制”,參數p2至 pn通常稱為“輸出表列”
在$display
和$write
中,其輸出格式控制是用雙引號括起來的字符串,包含以下兩種信息:
格式說明
,由“%”
和格式字符組成。它的作用是將輸出的數據轉換成指定的格式輸出。

特殊字符
,用於格式字符串參數中顯示特殊的字符。

如果輸出列表中表達式的值包含不確定的值或高阻值,其結果輸出遵循以下規則。
在輸出格式為十進制的情況下:
如果表達式值的所有位均為不定值,則輸出結果為小寫的x。
如果表達式值的所有位均為高阻值,則輸出結果為小寫的z。
如果表達式值的部分位為不定值,則輸出結果為大寫的X。
如果表達式值的部分位為高阻值,則輸出結果為大寫的Z。
在輸出格式為十六進制和八進制的情況下:
每4位二進制數為一組代表一位十六進制數,每三位二進制數為一組代表一位八進制數。
如果表達式值相對應的某進制數的所有位均為不定值,則該位進制數的輸出的結果為小寫的X
如果表達式值相對應的某進制數的所有位均為高阻值,則該位進制數的輸出結果為小寫的z。
如果表達式值相對應的某進制數的部分位為不定值,則該位進制數輸出結果為大寫的X。
如果表達式值相對應的某進制數的部分位為高阻值,則該位進制數輸出結果為大寫的Z。
對於二進制輸出格式,表達式值的每一位的輸出結果為O、l、x 、z
其余的系統常見函數在初始階段暫時不涉及