一、設計中的FIFO、狀態機接口須要有異常恢復狀態和狀態上報機制,格雷碼電路防止被綜合電路優化掉。安全
a)自行設計的格雷碼FIFO(通常用於連續數據流跨時鐘域)用Synplify綜合時,爲了防止被優化須要添加綜合引導語句:「synthesis_syn_preserve = 1」;網絡
b)各類綜合工具均有狀態機安全模式,綜合時候建議打開。異步
二、電路中因此寄存器、狀態機、計數器、FIFO在單板上電覆位時以及使用前必須處於一個已知狀態。工具
a)對電路中的寄存器、狀態機、計數器、FIFO必須進行異步復位(不依賴於任什麼時候鐘的復位);性能
b)電路中的狀態機、計數器在應用的時候不能徹底依賴於異步復位時的狀態,對於重要的狀態機或計數器,必須還有周期檢測或同步並對它進行復位/置數機制,保證可靠工做。優化
三、跨時鐘域以及異步信號必須同步化處理(使用的QuartusII中的Design Assistant或者專業的nlint、spyglass等工具完成代碼檢查),這條是用FPGA進行數字電路設計的最核心最基本的思想和方法。編碼
a)儘量在整個設計中只用一個主時鐘,同時只用一個時鐘沿,主時鐘走全局時鐘網絡;設計
b)推薦全部輸入輸出信號均經過寄存器寄存,寄存器接口看成異步接口考慮;接口
c)當所有電路不能用同步電路思想設計時,即須要用多個時鐘來實現,則能夠將所有電路分紅若干個局部同步電路(儘量以同一個時鐘爲一個模塊),局部同步電路之間的接口看成異步接口考慮;資源
d)電路的實際最高工做頻率不該大於理論最高工做頻率,要留有必定設計餘量,保證芯片可靠工做;
e)電路中全部寄存器、狀態機在單板上電覆位時應處在一個已知狀態;
f)對於設計中的異步電路,要給出不能轉換爲同步設計的緣由,並對該部分異步電路的工做可靠性(如時鐘等信號是否有毛刺,創建保持時間是否知足要求等)作出分析判斷,並提供分析報告;
e)關於全局時鐘的約束,能上全局的所有上全局,不能上全局的建議經過區域時鐘約束、邏輯鎖定、增量編譯等保證性能;
h)依靠QuartusII中的Design Assistant或者專業的nlint/spyglass工具檢查跨時鐘域代碼處理部分。
四、電路中不能出現門控時鐘和行波時鐘。
a)門控時鐘的使用主要是經過關斷時鐘來達到下降功耗的目的,可是使用不當容易使得時鐘出現毛刺,給設計帶來災難性風險。若是降功耗必要的話,推薦使用廠家自帶的時鐘控制的IP Core,例如ALTCLKCTRL;
b)行波時鐘是指寄存器輸出的數據又做爲下一個寄存器的時鐘使用。行波時鐘是一個很是危險的設計,因爲寄存器有Tco,它會使時鐘沿變緩,延時加大,多級級聯的時候狀況更加惡劣,出問題是必然的!行波時鐘設計其實是一種異步設計,大部分綜合佈線工具都不會對行波時鐘設計進行setup/hold時序分析檢查,設計沒法保證正確性!
設計中徹底沒有必要使用行波時鐘,能夠用寄存器輸出作同步使能用,與行波時鐘設計意圖徹底一致。
五、須要綜合的RTL源代碼中不容許出現「* / %」這三個運算符。
a)目前大部分綜合工具對以上三種運算支持的很差,並且很是浪費LE資源,還不能保證正確性和穩定性。可行的替代方案以下:
「*」經過例化IP Core或者「移位運算+加法」來實現;
「/」經過「移位運算+加法」來近似逼近實現,例如:1/30 = 1/32 + 1/512 + 1/8192;
「%」經過本身手動計算獲得;
以上運算在非綜合的RTL的代碼中使用不受此限制。
六、條件語句必須賦值徹底,即:if語句後必須有配對else語句,case、casez、casex語句中必須有default語句。
a)若是if沒有配對的else,case/casez/casex中沒有對應的default語句的話,以後reg型數據會保持原來的值。這個在時序邏輯中可能沒有太大的問題(若是設計者本意就是要保持的話),但在組合邏輯中會生成一個鎖存器,鎖存器邏輯每每不是設計者的意圖而致使災難性的後果。
爲了不不經意的犯錯,建議養成良好的編碼習慣:if語句必定要有配對的else,case/casez/casex中必定要有對應的default語句,即便要保持原來的值也要顯示聲明(else ;或者default ;)
七、使用器件的專用引腳和專用資源實現電路功能,這些包括全局時鐘、復位管腳、全局輸出容許管腳等,內部全局時鐘網絡等。
專用管腳和專用資源必定要優先使用,使用的好會事半功倍。若是不用器件提供的專用管腳或資源,有時致使穩定性和可靠性不高甚至是設計失敗。
八、邏輯未使用的但又硬件連線的管腳,邏輯必須顯示聲明並處理。全部有硬件連線的管腳必須在頂層代碼中顯示聲明(包括暫時沒有使用的),不容許聽任無論。
a)對於有硬件連線的輸入信號(包括三態的輸入方向),建議輸入到CPU接口做爲只讀寄存器(若是沒有CPU接口能夠將該信號作成一些等效冗餘邏輯加到其餘邏輯中去),這樣既能夠消除Warning,又能夠避免佈線工具隨便佈線(把輸出信號放到輸入管腳)致使外部信號衝突;
b)對於有硬件連線的輸出信號(包括三態的輸出方向),對於暫時沒有使用的必定與硬件人員肯定其默認值,避免對外信號(包括電阻上下拉)的干擾。
九、修改接口文檔須要同對應項目組人員確認。
a)與硬件相關的方面涉及輸入文件有qsf和sdc,內容包括但不限於電平標準、電流強度、管腳位置、輸入輸出方向、上下拉等等;
b)與軟件相關的方面涉及方案協同實現文檔和寄存器接口文檔,包括寄存器操做地址、操做順序等等。