關於FPGA邏輯設計的21個小貼士
阿新 • • 發佈:2019-01-24
(轉載自:http://bbs.ednchina.com/FORUM_POST_23_531362_0.HTM?click_from=8800024581,4950445351,2014-11-20,EDNCOL,NEWSLETTER&jumpto=view_welcomead_forum_1416449079845&jumpto=view_welcomead_forum_1416449099646)
這是一個在邏輯設計中注意事項列表,由此引起的錯誤常使得設計不可靠或速度較慢,為了提高設計效能和提高速度的可靠性,必須確定設計通過所有的這些檢查。
可靠性1. 為時鐘訊號選用全域性時鐘緩衝器BUFG!
不選用全域性時鐘緩衝器的時鐘將會引入偏差。
2. 只用一個時鐘沿來寄存資料
使用時鐘的兩個沿是不可靠的,因為時鐘的某沿或者兩個沿會漂移。如果時鐘有漂移而且你只使用了時鐘的一個沿,你就降低了時鐘邊沿漂移的風險。這個問題可以這樣來解決:就是允許CLKDLL自動糾正時鐘的佔空比,以達百分之五十的佔空比。否則強烈建議只使用一個時鐘沿。3. 除了用CLKDLL或DCM產生的時鐘外不要在內部產生時鐘
這包括產生門控時鐘和分頻時鐘。作為替代,可以建立時鐘使能或使用CLKDLL或DCM來產生不同的時鐘訊號。對於一個純同步設計,建議在任何可能的情況下只使用一個時鐘。
4. 不要在內部產生非同步的控制訊號(例如復位訊號或者置位訊號)
內部產生的非同步控制訊號會產生毛刺,作為替代,可以產生一個同步的復位/置位訊號。要比需要作用的時刻提前一個時鐘週期進行這個非同步訊號的同步。
5. 不要使用沒有相位關係的多個時鐘
6. 不要使用內部鎖存器
內部鎖存器會混淆時序,而且常常會引入另外的時鐘訊號。內部鎖存器在透明門開啟時可以被看成是組合邏輯,但在門被鎖存時可以被看成是同步元件,這將會混淆時序分析。內部鎖存器常常會引入門控時鐘,門控時鐘會產生毛刺使得設計變得不可靠。
效能
1. 邏輯級的時延不要超過時序預算的百分之五十
每個路徑邏輯級時延可以在邏輯級時序報告或佈局後時序報告中找到,詳細分析了每個路徑之後,時序分析器將生成每個路徑時延的統計量,檢查一下總共的邏輯級時延,確保不超過時序預算的百分之五十。
2. IOB 暫存器
(1)對於輸入暫存器在從管腳到暫存器間不能有組合邏輯存在。對於輸出暫存器,在暫存器和管腳之間也不能有組合邏輯存在。對於三態輸出,在IOB中的所有的暫存器必須使用同一個時鐘訊號和復位訊號,而且IOB三態暫存器必須低電平有效才能放到IOB中(三態緩衝器低電平有效,所以在暫存器和三態緩衝器之間不需要一個反相器)。
(2)必須使軟體能夠選用IOB暫存器,可以設定全域性實現選項:為輸入、輸出或輸入輸出選擇IOB暫存器。預設值為關 off。
(3)你也可在綜合工具或在使用者約束檔案UCF中設定,使得能夠使用IOB暫存器。句法為: INST IOB = TRUE;
3. 對於關鍵的輸出選擇快速轉換速率
可以為LVCMOS和LVTTL電平選擇轉換速率,快速的轉換速率會降低輸出時延,但會增加地彈,所以必須在仔細考慮的基礎之上選擇快速轉換速率。
4. 流水邏輯
如果你的設計允許增加延遲,對組合邏輯採用流水操作可以提高效能。在Xilinx的FPGA中有大量的暫存器,對每一個四輸入LUT有一個對應的暫存器,在犧牲延遲的情況下,利用這些暫存器可以增加資料吞吐量。
5. 為四輸入的LUT結構進行程式碼優化
記住每一個查詢表可以建立一個四輸入的組合邏輯函式。如果需要更大的功能,可根據“四輸入組合邏輯”這個特性,分析、優化實現該功能所需的查詢表的數目。6. 使用Case語句而不是if-then-else語句
複雜的if-then-else語句通常會生成優先順序譯碼邏輯,這將會增加這些路徑上的組合時延(現在大部分綜合工具,可以把if-else的優先順序邏輯層次打平)。用來產生複雜邏輯的Case語句通常會生成不會有太多時延的並行邏輯。對於Verilog,可以使用約束parallel_case。
7. 多用Xilinx自帶Core generate
Core generate針對 Xilinx的結構進行了優化,許多塊都可以允許使用者配置,包括大小、寬度和流水延遲。檢視設計中的關鍵路徑,是否可以在核生成器中產生一個核來提高關鍵路徑效能。避免由程式碼來推斷,又麻煩,又不可靠。
8. FSM的設計限制在一個層次中
為了允許綜合工具完全優化FSM,它必須在它自己的塊中優化。如果不是這樣的話,這將使得綜合工具將FSM邏輯和它周圍的邏輯一起優化。FSM不能包括任何的算術邏輯、資料通路邏輯或者其它與狀態機不相關的組合邏輯。
9. 使用兩個程序或always塊的有限狀態機
下一個狀態和輸出譯碼邏輯必須放在獨立的程序或always塊中,這將不允許綜合工具在輸出和下一個狀態譯碼邏輯之間共享資源。便於程式碼維護。
10. 使用一位有效編碼(one-hot、gray)FSM
一位有效編碼通常會在富含暫存器的FPGA中提供最高效能的狀態機。
11. 為每一個葉級(leaf-level)塊提供寄存輸出
葉級塊是可以推論的邏輯塊,而結構級(structural-level)的塊僅例化較底層的塊,這樣就建立了層次。如果葉級塊是寄存輸出,則可使綜合工具保留層次。這可使分析這些程式碼的靜態時序變得比較容易。對module與module之間的邊界訊號(用時鐘同步)進行寄存輸出,可以使得各個塊之間有確定的同步時序關係。
12. 不同的計數器風格二進位制計數器是非常慢的。如果二進位制計數器是關鍵路徑,可以考慮使用不同風格的計數器LFSR、Pre-scalar或Johnson。
13. 設計必須被層次化的分成不同的功能塊
首先是較頂層的功能塊,然後是較底層的塊,也應該包括特定技術的塊。設計層次化使得設計更可讀、更易除錯、更易複用。
14. 高扇出網路需要複製暫存器
可以通過XST或者synplify pro等綜合工具的綜合選項來進行控制。
15. 利用四種全域性約束來對設計進行全域性的約束
週期(對每個時鐘),輸入偏移、輸出偏移、管腳到管腳的時間。也許會有針對多週期路徑、失敗路徑和關鍵路徑的其它約束,但是必須從這四個全域性約束開始。