綠皮書這本書對知識的梳理比較瑣碎凌亂,不能幫新手快速的建立知識結構。先梳理好結構和要點,再填補細節是理想的敘述方式。
1、斷言屬於一種驗證方法,判斷預期邏輯(對設計屬性的描述)是否發生,通過內建函數來測試特定的時序關係和自動收集覆蓋率數據。
2、立即斷言:事件變化敏感,像過程塊一條語句,與時序無關,必須放在過程塊中。檢查TB和DUT的信號值,跟if(a!=b)不同的是,希望表達式爲真(==)。
<斷言名>:assert (測試邏輯);
a1:assert (bus.cb.garant==2'b01)
else $error ("Grant not assert");
3、併發斷言:時鐘邊緣敏感,週期性對仿真過程檢查信號的採樣值。以關鍵詞“property”來定義。
property <屬性名>;
測試邏輯;
endproperty
<斷言名>:assert property(屬性名);
//檢測仲裁器request信號的斷言,request信號除了在復位期間,其他時候不能是x或者z。
interface arb_if(input bit clk);
logic [1:0] grant,request;
logic ret;
property request_2state;
@(posedge clk) disable iff (rst); //同步復位語法,rst爲1,則不進行判斷
$isunknown(requset)==0; //確保沒有x或者z
endproperty
assert_request_2state:assert property(request_2state);
endinterface
4、SVA的基本構成:布爾表達式將設計中的信號組合起來,組成序列。然後序列邏輯或者有序的組合起來得到屬性。最後通過管檢測assert,cover和assume指示屬性的具體作用。
5、序列:序列經常由有序的行爲構建。序列提供了一種能力來構建和處理有序的行爲。比如一個線性序列,是布爾表達式的一個有限列表。如果每個布爾表達式在對應的時鐘標識被計算爲真,那麼這個線性序列在一個連續時鐘標記的有限間隔上匹配。
布爾表達式-真-時間序列匹配
6、常用語句及系統函數:訪問當前的採樣值、訪問過去的採樣值、或者檢測一個表達式採樣值的變化。
disable iff(); 變量或表達式爲真則不進行判斷。
$sampled()
$isknown(requset) 檢查表達時任何位是否爲x或z。
$rose() 檢測上升沿
|-> 如果先行算子匹配在同一個時鐘週期,檢測後續算子。
@(posedge sclk) $rose(a) |->[2:4] $rose(b);
參考鏈接:https://wenku.baidu.com/view/8134076e763231126fdb1165.html system_verilog_assertion
參考文獻:systemverilog中的斷言assertions---sva
7、由於斷言是一條有時必須爲真的語句,所以斷言的失敗應該具有一個與其相關聯的嚴重程度。缺省情況下,一個斷言失敗的嚴重程度是error。其它的嚴重程度可以通過在失敗語句中包含下列嚴重性系統任務重的一個來指定:
$fatal 運行時的致命錯誤
$error 運行時的錯誤
$warning 運行時的警告,可以用工具專用的方式取消
$info 不帶有嚴重程度的斷言失敗