第14章 非同步斷言

2021-08-19 19:28:58 字數 1457 閱讀 4759

圖14.1非同步斷言-問題陳述

到目前為止,在本書中,我們總是使用同步時鐘邊作為斷言的取樣邊沿。這是有原因的。這裡介紹的例子使用非同步邊緣(完全合法)作為取樣邊緣。問題陳述就會變成''每當(即非同步)l2txdata == l2errordata, l2abort被斷言'。現在看起來非常合乎邏輯,無需使用時鐘。所以,我們寫乙個屬性如圖14.1所示。我們簡單地說@(l2txdata)(即每當l2txdata改變時)我們比較l2txdata == l2errordata,如果匹配,我們推導l2abort == 1。

圖14.1(續)

這聽起來非常合乎邏輯。它有什麼問題?嗯...很多東西。圖14.1中的注釋系統地告訴你發生了什麼。請仔細研究它,看看為什麼有問題。我們不會再重複這個圖的解釋。但這是關於這個問題的高層次提示。「取樣邊沿」(即@(l2txdata))也用於比較表示式。由於表示式中變數的值總是在推定區域中計算,因此表示式中的l2txdata值不會與@(l2txdata)更改時相同。如果這聽起來令人困惑,那好吧。這就是我不推薦使用非同步斷言的原因。

圖14.2非同步斷言 - 問題陳述分析繼續

我們繼續圖14.2中的分析。注釋解釋受挫折的原因!

為了避免我們剛剛在圖14.3中描述的問題,我們可以(不幸地)繼續非同步取樣邊沿,只是我們把所有比較表示式/變數作為非同步取樣邊沿的一部分。解決方案1顯示了這一點,這將解決我們首次遇到的問題。仔細想想,你會明白為什麼。

為什麼我們在解決方案2中分配了#1?這樣當l2txdata或l2error dataw或l2abortw發生變化時,會有乙個單位時間的延遲,這會使新值穩定下來,因為您需要檢查(l2txdata == l2errordata)。

這是乙個(令人費解的)方式來繞過這些變數在**區域的檢查。如果所有這些看起來令人困惑,不要被嚇倒。我強烈建議您不要將非同步邊緣用作取樣邊緣。再次,如果您對使用它們感到滿意,請這樣做,但要小心。請參考上面的示例來幫助您了解非同步取樣邊緣的行為。請注意,我已經用非同步斷言顯示了所有三種解決方案(非常反對它!)。你如何將這個模型作為同步斷言來建模?請嘗試看看你是否成功。假設'posedge clk'作為你的取樣邊緣。

圖14.3非同步斷言-解決方案

解決方案3使用程式塊來確定您何時執行檢查。請注意,我沒有在這個解決方案中使用斷言。有的時候,簡單地使用verilog會更好,並且會更直觀,並提供您期望的結果。我推薦使用純粹的verilog進行非同步斷言描述,對於所有其他型別的斷言用sva。

第14章 陣列

1 定義 相同的名稱和型別的變數的集合 陣列通常比較大,為了節省記憶體,c 規定陣列在程式中只能有乙個原本,沒有副本 陣列中的變數叫陣列元素 int a 10 陣列的型別 陣列的名稱 陣列的下標 2 陣列下標越界 3 陣列的初始化 1 陣列的部分初始化 int array 20 2 int arra...

第14章 秘密

我們決定回家後的第二天一起去海麗家,看能不能通融一下海麗的父親讓海麗繼續上學,追求她的夢。可是我的心裡老是感覺怪怪的,一直猶豫自己要不要再要插手這件事情。海麗雖沒有明說,但我真的傷了她,在她最需要的時候拋棄了她。而她也報復了我,用她對我的冷落表達對我的失望和傷心。乙個內向的人,如果沒有傷心到極限,沒...

程式設計珠璣第14章

這裡把所有關於堆的操作寫出來。當做標程吧。include include define ms 1025 typedef struct heap heap heap h static void shift heap h,int i else break a i t static void increa...