我的編譯器抱怨組合循環(在Verilog中總是@(*))中推斷出的閂鎖。還告訴我最好避免使用推斷的閂鎖。
推斷的閂鎖到底有什麼問題?它們無疑使組合循環更易於編寫。
我的編譯器抱怨組合循環(在Verilog中總是@(*))中推斷出的閂鎖。還告訴我最好避免使用推斷的閂鎖。
推斷的閂鎖到底有什麼問題?它們無疑使組合循環更易於編寫。
“鎖存器”與“觸發器”的不同之處在於,FF僅響應於時鐘沿改變其輸出。鎖存器可以響應於時鐘以外的其他因素來更改其輸出。例如,SR鎖存器具有一個設置和一個複位輸入,如果其中一個處於活動狀態,則輸出可以更改。 SR-FF僅在存在時鐘沿時才響應置位或複位。
在FPGA中,您希望邏輯完全同步。這意味著所有存儲元件(如FF)都由單個時鐘源提供時鐘。與該時鐘異步的任何事物都必須非常小心地對待,否則會發生時序錯誤。
鎖存器基本上是一個異步存儲元素。它沒有時鐘輸入,因此無法與任何時鐘同步。我應該注意,有帶有異步復位和復位輸入的FF,對它們的處理應與普通鎖存器相同。
深入探討鎖存器可能引起的所有時序問題,遠遠超出了此處可以涵蓋的範圍,但讓我舉一個例子:
假設您有一個SR-鎖存,並且您希望每次8位計數器達到某個值時進行設置。我不確定Verilog代碼是什麼,但是在VHDL中代碼是:count = 11010010“時設置< ='1',否則設置為'0';該設置信號進入SR鎖存器上的設置輸入。
所生成的邏輯純粹是組合的;只有邏輯組合。 “與”門,“或”門和逆變器(或LUT)的混合。但是通過該組合邏輯的信號路徑並不總是完美的,“設置”信號可能會出現毛刺。通過特定一組門的信號路徑可能需要比另一組更長的時間,從而使設置的輸出在輸出穩定到最終狀態之前的一小段時間內處於活動狀態。
此輸出故障可能會導致我們的SR鎖存器被設置,即使本來不應該這樣做。如果我們從SR鎖存器切換到SR-FF,並從與計數器相同的時鐘開始計時,則SR-FF將等待一個完整的時鐘週期,然後再更改狀態。本質上,它將在看待設置信號之前先等待設置信號。
如果設置信號通過組合邏輯的路徑只是經過不同的佈線(導致不同的延遲),則毛刺行為也會改變。該邏輯可能工作正常,但是由於您更改了完全不相關的內容,因此該邏輯的路由方式有所不同,因此會彈出錯誤。溫度和電壓也會改變信號時序,從而改變毛刺行為。
時序上的不確定性是為什麼應該避免邏輯鎖存的原因。 FF的使用更加安全。這就是為什麼編譯器會警告您有關鎖存器的原因,因為很容易錯誤地創建鎖存器,並且您可能根本不希望它存在。
當然,有時需要鎖存器。僅在絕對需要時,您僅需很少使用它們,然後您必須正確設計邏輯,以免出現小故障。
是什麼導致推斷的鎖存器?
對於組合邏輯,電路的輸出僅是輸入的函數,不應包含任何存儲器或內部狀態(閂鎖)。
在Verilog中,如果未在始終塊中為其分配值,則變量將保留其先前值。必須創建一個鎖存器來存儲該當前值。
不完整的 if-else 語句將生成閂鎖。如果未針對所有可能的輸入條件定義輸出狀態,則將 if-else 語句視為“不完整”。對於不完整的 case 語句或沒有 default:項的 case 語句也是如此。
為什麼推斷出的鎖存器不好?
推斷出的鎖存器可以充當“警告信號”,說明邏輯設計可能未按預期實現。設計中可能缺少關鍵的 if-else 或 case 語句。
閂鎖可能會導致計時問題和比賽條件。它們可能會導致組合反饋-輸出路由回到輸入-可能是不可預測的。
為避免創建推斷的鎖存器:
某些部分摘自“ Verilog示例的FPGA原型開發” “由朱(P. Chu)
在FPGA或CPLD中使用閂鎖非常棘手,因此很多人只是完全避免使用它們。原因之一是許多FPGA沒有內置鎖存器,因此它們是由邏輯門製成的-這可能會導致令人討厭的時序問題。
您也無法控制時序延遲和競爭條件當使用閂鎖時(除非存在本機元素)
我建議您不要使用閂鎖,除非您絕對不能沒有閂鎖(例如,為了滿足所需的最大時鐘頻率而藉用時間)並使用編碼技術以減少意外推斷閂鎖的可能性。
使用組合邏輯和反饋構造的順序邏輯設計通常會做出一個假設,這在使用物理門時似乎是合理的:門的輸出不會響應輸入的變化而變化,直到輸入實際改變之後的某個時間。在某些情況下,使用真實門時可能無法滿足該假設(例如,如果快速NOR門和快速反相器均由從VSS緩慢上升到VDD的信號驅動,並且如果反相器在1.2V電壓下切換而NOR直到1.7伏時,門才會切換,或非門可能會在看到緩慢上升的信號變高之前看到反相器的輸出變低),但是通常可以通過在緩慢變化的情況下添加一個緩衝器來解決此類問題信號被路由到多個目的地。不幸的是,這種假設對於FPGA可能根本不成立。
問題是,除非另有明確指示,否則FPGA編譯器可能會用具有完全相同穩態的完全不同的電路隨意替換組合電路。狀態行為,但時機可能完全不同。例如,假設一個複雜的組合函數F接受六個輸入U到Z。F被直接饋送到電路P,而(F NAND Z)被饋送到電路Q。編譯器可能意識到饋給Q的值僅取決於當Z高時為F,並且可以計算與F類似的函數F',只是假定Z高。然後可以向Q饋送(F'NAND Z)而不是(F NAND Z)。 P的最有效實現將完全有五個門延遲,而Q的最有效實現將只有兩個。因此,即使看起來Q應該比P改變柵極延遲更晚,它也可能更早改變兩個柵極延遲。
如果電路具有組合反饋迴路,則FPGA編譯器將不得不添加物理信號節點,這些信號節點在物理上具有正延遲(在現實世界中不存在零延遲反饋迴路),但是存在無法保證將這樣的節點添加到使電路表現出所需的必要位置。甚至也不能保證對設計的微小更改不會導致編譯器從碰巧在現實世界中起作用的任意位置更改為碰巧會失敗的其他任意位置。
此鏈接中簡要說明瞭如何捕獲設計中的閂鎖。