資料來源
(1) 硅芯思見:【91】SVA的動態控制 (qq.com)
1.$asserton, $assertoff, $assertkill
(1) 作用
注1:$assertoff暫時關閉所有斷言的執行,如果該函數執行時斷言正在執行,正在執行的斷言不會被終止;
注2:$asserton重新啟動斷言執行;
注3:$assertkill將會終止設計中所有的斷言,包括已經執行的斷言;當遇到下一個斷言需要開始執行時,需要使用$asserton啟動;
(2) 使用示例: $asserton/$assertoff/$assertkill[(level[,list_of_modules_or_assertions])];
注1:level用於指定層以下哪幾層設計收到函數的影響;如果level為0,函數將影響至頂層以下所有的設計;
注2:list_of_modules_or_assertions指定該函數作用於哪些模塊或斷言(不能指向序列,但可以指向屬性);
注3:這些函數可以不指定參數,這樣這些函數的作用域將默認為整個設計;
2.詳細示例
2.1示例一
注1:第一次斷言在3ns處觸發,$assertoff發生在6ns處,所以第一次斷言的執行沒有收到$assertoff影響;
注2:第二次斷言在15ns處觸發,但是由於$assertoff發生在6ns處,所以第二次斷言被關閉,不會執行;
注3:22ns處$asserton執行,重新啟動斷言檢查,所以27ns處的第三次斷言被有效觸發執行;
2.2示例二
注1:6ns時,$assertkill執行,雖然這時3ns開始的斷言在執行中,但是會立即被終止執行,即當前正在執行的斷言會被$assertkill終止;如果后續的斷言還要繼續執行,需要使用$asserton重新開啟斷言檢查;
2.3示例三
注1:$assertoff(1,test)表示所有例化在test的示例中的斷言從6ns開始關閉,此時如果有斷言正在執行,其將不受到$assertoff的影響,之后新的例化子test的示例中的斷言將不再執行,直至后續$asserton重新開啟斷言檢查;
2.4示例四
注1:$assertoff(0,u_dut0)將u_dut0及其以下所有層次斷言關閉;
注2:$assertoff(1,u_dut1)將u_dut1模塊的所有斷言關閉,但是不包括其下所有層次;
注3:$assertoff(1,top_tb)將top_tb模塊內所有斷言關閉,但是不包括其下所有層次;
注4:$asserton(0,u_dut0)重新開啟了u_dut0的斷言檢查;