題:
為什麼推斷的閂鎖不好?
Randomblue
2012-08-23 22:45:12 UTC
view on stackexchange narkive permalink

我的編譯器抱怨組合循環(在Verilog中總是@(*))中推斷出的閂鎖。還告訴我最好避免使用推斷的閂鎖。

推斷的閂鎖到底有什麼問題?它們無疑使組合循環更易於編寫。

最好包含您正在做的HDL示例
我注意到這個問題最近被引用了兩次。對於不是這樣的專家,請注意,除了Oli Glaser的答案以外,所有答案都是錯誤和/或無益的某種組合。
除非您確切地知道自己在做什麼,否則應該避免推斷的閂鎖,而通常應該避免透明的閂鎖(請注意,在某些不涉及透明閂鎖的情況下,quartus會誤導性地給出“推斷的閂鎖”萬無一失)。
五 答案:
user3624
2012-08-23 23:31:13 UTC
view on stackexchange narkive permalink

“鎖存器”與“觸發器”的不同之處在於,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或其他語言明確指定一個鎖存器,並且設計一個電路使其能夠與饋入該鎖存器的組合延遲的任意組合正常工作(這意味著生成信號的任何組合將用於鎖存器將以這樣的方式進行操作,即使使用零延遲邏輯路徑和最大延遲邏輯路徑的最壞情況組合,仍然可以滿足鎖存器的時序要求),合成器仍應產生一個工作電路鎖存器本身俱有非負延遲。但是,如果...
...使用組合邏輯和反饋而未指定任何必須具有非負延遲的節點,幾乎任何事情都可能發生。我理解同步邏輯比異步邏輯更容易設計,但是許多設備在睡眠時需要關閉時鐘以節省功率,而又不會完全死機。擁有一個完全同步的設備,但與每個引腳相關聯的兩個邏輯輸出可能會很有趣:“如果引腳為高電平則運行”和“如果引腳為低電平則運行”,以及在以下情況下生成時鐘的能力:任何需要指示的銷釘。
這種功能將減輕對異步邏輯的大量需求,因為在設備休眠時到達的輸入可以為內部振盪器和電路供電,時間足以使輸入得到處理和確認。這樣的功能比具有單個“喚醒”引腳的通用性要強得多,但是單喚醒設計似乎是常態。我所描述的多重喚醒方法會消耗過多的矽嗎?與芯片上的所有其他芯片相比,我認為矽的需求將很小。
dext0rb
2012-08-23 23:50:36 UTC
view on stackexchange narkive permalink

是什麼導致推斷的鎖存器?
對於組合邏輯,電路的輸出僅是輸入的函數,不應包含任何存儲器或內部狀態(閂鎖)。

在Verilog中,如果未在始終塊中為其分配值,則變量將保留其先前值。必須創建一個鎖存器來存儲該當前值。

不完整的 if-else 語句將生成閂鎖。如果未針對所有可能的輸入條件定義輸出狀態,則將 if-else 語句視為“不完整”。對於不完整的 case 語句或沒有 default:項的 case 語句也是如此。

為什麼推斷出的鎖存器不好?
推斷出的鎖存器可以充當“警告信號”,說明邏輯設計可能未按預期實現。設計中可能缺少關鍵的 if-else case 語句。

閂鎖可能會導致計時問題和比賽條件。它們可能會導致組合反饋-輸出路由回到輸入-可能是不可預測的。

為避免創建推斷的鎖存器:

  • 包括 if case 語句的所有分支
  • 為其中的每個輸出信號分配一個值每個分支
  • 在過程開始時使用默認分配,因此將分配每個信號。

某些部分摘自“ Verilog示例的FPGA原型開發” “由朱(P. Chu)

“通過Verilog示例開發FPGA原型”是一本不錯的書,可以學習實用的Verilog for Synthesis。它具有一些很好的示例設計,從基本組合到基本順序,最終導致有用的設計,例如UART,VGA,軟核處理器(Picoblaze)甚至是Pong遊戲。它還涵蓋了基本的測試平台和模擬。如果您還沒有@Randomblue,,則應該獲取它。我相信他也做了VHDL版本。
Oli Glaser
2012-08-23 23:43:03 UTC
view on stackexchange narkive permalink

在FPGA或CPLD中使用閂鎖非常棘手,因此很多人只是完全避免使用它們。原因之一是許多FPGA沒有內置鎖存器,因此它們是由邏輯門製成的-這可能會導致令人討厭的時序問題。
您也無法控制時序延遲和競爭條件當使用閂鎖時(除非存在本機元素)

我建議您不要使用閂鎖,除非您絕對不能沒有閂鎖(例如,為了滿足所需的最大時鐘頻率而藉用時間)並使用編碼技術以減少意外推斷閂鎖的可能性。

supercat
2012-08-24 00:22:50 UTC
view on stackexchange narkive permalink

使用組合邏輯和反饋構造的順序邏輯設計通常會做出一個假設,這在使用物理門時似乎是合理的:門的輸出不會響應輸入的變化而變化,直到輸入實際改變之後的某個時間。在某些情況下,使用真實門時可能無法滿足該假設(例如,如果快速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編譯器將不得不添加物理信號節點,這些信號節點在物理上具有正延遲(在現實世界中不存在零延遲反饋迴路),但是存在無法保證將這樣的節點添加到使電路表現出所需的必要位置。甚至也不能保證對設計的微小更改不會導致編譯器從碰巧在現實世界中起作用的任意位置更改為碰巧會失敗的其他任意位置。

user3303020
2014-04-13 02:00:41 UTC
view on stackexchange narkive permalink

此鏈接中簡要說明瞭如何捕獲設計中的閂鎖。

https://www.doulos.com/knowhow/fpga/latches/

歡迎來到EE.SE!您可以通過包含鏈接中的一些相關詳細信息來改善答案。即使原始頁面消失了,這也可以確保您的答案是高質量的。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...