2015-02-08 149 views
1

可以說有一個信號a。當信號變高時,至少要保持三個正時鐘沿。斷言來驗證信號中的毛刺

我們可以寫出財產

property p; 
@(posedge clk) $rose(a) -> a[*3]; 
endproperty 

下面的情況下,物業會失敗。

clk _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = |

a _ _ | = = = | _ _ |這不符合規範,其中a在中間低,但在下一個posedge時被拉高,因此,上面的斷言不會理解這一點。

任何人都可以告訴是否有任何方法來寫斷言來捕捉這個bug?

謝謝

回答

0

你在這裏混合的東西。通過在信號a上寫入一個時鐘斷言,您可以驗證它是具有特定行爲的同步信號。

同步信號可以在時鐘邊緣之間產生所需的所有信號,因爲它們從未在那裏採樣。這正是我們現在使用同步信號的原因,也就是說在信號採樣之前讓信號有機會穩定到它的值。

如果您的信號a由於某種原因不應該出現故障(我不是設計師,所以我不知道這會有用),據我所知,你會發現這一點使用一些一種對HDL代碼進行結構分析的線形工具(例如Spyglass)。

0

都鐸王朝的權利,在大多數情況下,時鐘邊緣之間發生什麼並不重要。但在CDC或異步設計中,我們必須驗證設計是否無故障。 有一種從內到外的方式來做到這一點。 (我發現這個解決方案在http://www.verificationguild.com/modules.php?name=Forums&file=viewtopic&p=20045

property detect_glitch; 
    time leading;     // declare the last edge occurence variable 
    @(glitch)      // At every change of glitch signal 
     //The following line saves the current time and check 
     // the delay from the previous edge. 
     (1, leading = $time) |=> (($time - leading) >= duration); 
endproperty : detect_glitch 

DETECT_GLITCH : assert property (detect_glitch) 
else 
    $display ("ERROR");