FPGA可綜合風格程式碼

只有十天時間發表於2018-04-09
#1:當為時序邏輯建模,使用“非阻塞賦值”。
#2:當為鎖存器(latch)建模,使用“非阻塞賦值”。
#3:當用always塊為組合邏輯建模,使用“阻塞賦值”
#4:當在同一個always塊裡面既為組合邏輯又為時序邏輯建模,使用“非阻塞賦值”。
#5:不要在同一個always塊裡面混合使用“阻塞賦值”和“非阻塞賦值”。
#6:不要在兩個或兩個以上always塊裡面對同一個變數進行賦值。
#7:使用$strobe以顯示已被“非阻塞賦值”的值。
#8:不要使用#0延遲的賦值。
#9:在VERILOG語法中, if...else if ... else 語句是有優先順序的,一般說來第一個IF的優先順序最高,最後一個ELSE的優先順序最低。如果描述一個編碼器,在XILINX的XST綜合引數就有一個關於優先順序編碼器硬體原語句的選項Priority Encoder Extraction. 而CASE語句是"平行"的結構,所有的CASE的條件和執行都沒有“優先順序”。而建立優先順序結構會消耗大量的組合邏輯,所以如果能夠使用CASE語句的地方,儘量使用CASE替換IF...ELSE結構。
#10:XILINX的底層可程式設計硬體資源叫SLICE,由2個FF和2個LUT組成。 FF觸發器  LUT查詢表
ALTERA的底層可程式設計硬體資源叫LE,  由1個FF和1個LUT組成。
#11:慎用鎖存器(latch),同步時序設計要儘量避免使用鎖存器,綜合出非目的性latch的主要原因在於不完全的條件判斷句。另外一種情況是設計中有組合邏輯的反饋環路(combinatorial feedback loops)。
#12:狀態機的一般設計原則,Biary, gray-code 編碼使用最少的觸發器,較多的組合邏輯。而one-hot編碼反之。所以CPLD多使用GRAY-CODE, 而FPGA多使用ONE-HOT編碼。另一方面,小型設計使用GRAY-CODE和BINARY編碼更有效,而大型狀態機使用ONE-HOT更有效。
#13:業界主流CPLD產品是lattice的LC4000系列和ALTERA的MAX3000系列。
#14:復位使初始狀態可預測,防止出現禁用狀態。FPGA 和CPLD 的復位訊號採用非同步低電平有效訊號,連線到其全域性復位輸入端,使用專用路徑通道,復位訊號必須連線到FPGA 和CPLD 的全域性復位管腳。。
#15:不要用時鐘或復位訊號作資料或使能訊號,也不能用資料訊號作為時鐘或復位訊號,否則HDL 綜合時會出現時序驗證問題。訊號穿過時鐘的兩半個週期時,要在前後分別取樣;防止出現半穩定狀態。
#16:fpga設計中 不要使用門時鐘(don't use gated clock)。時鐘訊號必須連線到全域性時鐘管腳上。
#17:不要使用內部三態訊號,否則增加功耗。
#18:只使用同步設計,不要使用延時單元。
#19:避免使用負延觸發的雙穩態多諧振盪器(flip flop)。
#20:不要使用訊號和變數的預設值(或初始值),用復位脈衝初始化
訊號和變數。
#21:不要在程式碼中使用buffer 型別的埠讀取輸出資料;要使用out 型別,再增加另外變數或訊號,以獲取輸出值。
這是因為buffer 型別的埠不能連線到其他型別的埠上,因此buffer 型別就會在整個設計的埠中傳播下去。
#22:對變數要先讀後寫;如果先寫後讀,就會產生長的組合邏輯和鎖存器(或暫存器)。這是因為變數值是立即獲取的。

#23:在組合邏輯程式中,其敏感向量標中要包含所有要讀取得訊號;這是為了防止出現不必要的鎖存器。

      轉載自http://blog.chinaunix.net/uid-21227800-id-65930.html,以供學習。

相關文章