在sv的assertion中,會用到時鐘打拍操作。一般會在assertion代碼塊中,顯示的寫上使用的時鐘,
property counter_2;
@(posedge clk)
counter == 2 |-> ##1 counter_r == 2;
endproperty
assert_counter_2: assert property(counter_2);
如果說,不寫使用的時鐘,即如下代碼:
property counter_2;
counter == 2 |-> ##1 counter_r == 2;
endproperty
assert_counter_2: assert property(counter_2);
編譯就會有如下錯誤:
Error-[NCIFA] No clock inferred for assertion tb.sv, 50 tb, "cover_counter_2" The concurrent assertion statement has no clock as a whole or in part. Assertions cannot be unclocked in SystemVerilog. |
因爲沒有指定時鐘,所以##1操作,就不知道使用什麼時鐘可以實現延遲一個時鐘的操作。
如果說,我們編寫的assertion,都使用一個時鐘,那麼我們可以把這個時鐘,定義爲全局的時鐘。這樣,編寫的assertion中,就不在需要顯示指定時鐘,就可以直接使用##這樣的操作。
定義全局時鐘,使用 default clocking進行定義。
default clocking cb @(posedge clk); endclocking: cb |
然後編寫assertion。
property counter_2;
counter == 2 |-> ##1 counter_r == 2;
endproperty
assert_counter_2: assert property(counter_2);
此時編譯仿真正常