FPGA初學者做時序最易忽視的幾個要點,每一項都很重要!
FPGA畢竟不是ASIC,對時序收斂的要求更加嚴格,本文主要介紹本人在工程中學習到的各種時序約束技巧。
本文將從代碼風格,時序修正,工程設置等幾個方面介紹本人的實踐經驗,希望讓各位初學者快速提高,也希望FPGAer能給出寶貴建議。
1. 代碼風格
推薦使用Xilinx language templates的代碼塊,這裡的代碼能夠綜合出正確且結構簡潔的電路,包括移位寄存器,乘法,複數乘法,FIR濾波器等,凡是涉及到的模塊盡量使用官方寫法。
合理的設計代碼框架。IO相關的代碼、時鐘管理單元盡量放在頂層,後者有助於以共享資源從而提高性能降低功耗。模塊的輸出最好是使用寄存器輸出,有助於降低路徑延時幫助時序收斂。
複位也是非常重要的問題。和ASIC不同,Xilinx FPGA的寄存器是高電平複位,支持非同步複位和同步複位,但是DSP和BRAM內部的寄存器不支持非同步複位。因此,官方更推薦設計採用高電平同步複位,可以降低資源的使用和功耗,有助於時序收斂。由於FPGA的初始狀態是確定的(可以在定義說明中指定),為了更快地時序收斂,官方文檔認為,能不用複位是最好的,尤其數據路徑和移位寄存器的設計中。不過使用同步複位仍需要注意控制集不能太多的問題。關於這方面的內容,UG949第三章Control Signals and Control Sets給了詳細的說明。
數學運算使用DSP單元速度會更快一些,根據DSP的結構重組數學運算,充分利用FPGA的DSP、BRAM資源。並且能做到對代碼映射的硬體資源心裡有數。如果並不需要優先順序,盡量將If語句轉化為case語句。
盡量不要使用Don"t Touch這類語句。如今Vivado綜合工具已經很完善了,除非代碼有問題或者手動複製寄存器,否則一般不會發生電路被綜合掉的現象。使用這些語句會覆蓋Vivado綜合設置,導致電路沒有得到充分的優化,給時序收斂造成困難。
2. 時序修正
嚴格遵守Vivado開發流程,在第一次跑綜合時最好是在沒有任何物理約束的情況下,Vivado在越少物理約束的情況下綜合出來的效果越好。查看每個階段的時序報告,將每一階段的時序違例控制在300ps以內,儘早消除問題。以前本人RTL Analysis階段過了之後選擇運行Implementation跳過Synthesis報告,這是不可取的行為。有時候會發現Synthesis有時序問題而在Implementation階段反而沒問題,這是因為Vivado在Implementation階段對時序不滿足的地方傾斜了更多的資源保證時序收斂。但是忽略Synthesis的時序問題會在後期頂層模塊集成佔用大資源時爆發出來。
下面介紹主要面對的兩個時序問題的處理技巧。
1)setup time 建立時間問題
建立時間是工程設計中最常遇到的問題了。一般說來,導致建立時間違例主要有兩個原因:邏輯級數太大或者扇出太大。
打開Report Timing Summary界面查看路徑延遲信息,如下圖所示。
Levels指的是邏輯級數logic level,一個logic level的延遲對應的是一個LUT和一個Net的延遲,對於不同的器件,不同頻率的設計能容納的logic level是不同的。假設7系列的-2速度等級250MHz的設計,電路設計的大部分levels最好不要超過8,否則會造成時序收斂困難。
Logic level太大的處理方法就是重定時(Retiming)了,典型的重定時方法就是流水線,將過於冗長的組合邏輯增加寄存器進行打拍。
High Fanout指的是扇出,同樣和器件、設計頻率等有關,如下圖所示:
降低扇出最好不要在綜合設置中指定,過低的扇出限制會造成設計堵塞反而不利於時序收斂,最好的方法是根據設計中時序最差路徑的扇出進行針對性的優化。如果是寄存器的輸出扇出很大,可以使用max_fanout屬性標記寄存器聲明,也可以手動複製寄存器。
如果不是關鍵時序路徑,而且高扇出網路直接連接到觸發器,對扇出超過25K的net插入BUFG:
set_property CLOCK_BUFFER_TYPE BUFG [get_nets netName]
當然,也可以在後期Implementation的物理優化設置中優化扇出。
2)hold time 保持時間問題
在實踐中,我發現保持時間問題的問題往往是非同步處理的問題。
對於一個信號的跨時鐘域問題,一般使用雙寄存器法(對於慢采快的結繩法這裡不討論)。為了降低MTBF(Mean Time Between Failures,平均無障礙時間),這兩個寄存器最好位於同一個slice中。可以使用tcl語言指定,如:
set_property ASYNC_REG TRUE [get_cells [list sync0_reg sync1_reg]]
也可以直接在代碼中指定:
(* ASYNC_REG = "TRUE" *) (* keep = "true" *)reg sync0_reg, sysnc1_reg;
也可以參考代碼模板使用XPM模板進行處理。
多個信號一般是使用FIFO或者握手的方法,這裡不再贅述原理。同步CDC處理比較複雜,本人打算之後另外寫一篇文章詳細講述。
3. 工程設置
Vivado綜合實現本質是時序驅動的,和ISE不同,因此再也沒有ISE那種用隨機種子綜合實現滿足時序收斂的工具。不過Vivado在布局布線方面提供了幾種不同的策略(directive),通過不同策略的組合可以產生上千種不同的布局布線結果,還可以使用tcl鉤子腳本自定義布局布線過程,足以滿足需求。而且,Vivado可支持同時運行多個Implementation,這為這種設計時間換取性能的方法提供了工具上的便利。
Implementation里Post-place Phys Opt Design和Post-route Phys Opt Design是沒有使能的。工程後期使能這兩個配置也能在一定程度上改善時序收斂。
FPGA工程師的工作不只是將電路功能實現,由於器件和工具不是理想的,所以還需要研究器件特性和工具的局限,尤其是在如今演算法結構越來越成熟的背景下,不斷被工具折磨,也許這也是FPGA工程師的悲哀吧。
為了幫助學員能夠更深入地掌握FPGA系統設計與實際應用。編者給大家準備了FPGA系列學習電子書籍,包括了CPLD/Verilog編程語言基礎與設計,數字IC、基本邏輯、組合邏輯等基礎電路,Vivado平台開發與調試、集成開發環境使用及相關技巧,FPGA數字信號處理、數字圖像處理及各種FPGA實戰項目設計案例等等。
1.Verilog數字系統設計教程
本書從演算法和計算的基本概念出發,講述如何用硬線邏輯電路實現複雜數字邏輯系統的方法。全書共分三部分。部分內容共18章;二部分共12個上機練習實驗範例;三部分是Verilog硬體描述語言參考手冊,可供讀者學習、查詢之用。本書2版後,在語法篇中增加了IEEE Verilog1364-2001標準簡介,以反映Verilog語法的新變化。
2.數字電路與邏輯設計
本書系統地闡述了邏輯電路的基礎理論--邏輯函數及其數學工具;重點討論了邏輯電路的設計方法和分析方法;詳細介紹了通用性強的幾類中、大規模集成器件,並結合實例介紹了它們在各領域中的應用;對可編程邏輯器件及其硬體描述語言也進行了系統介紹。
全書共10章,主要內容有:邏輯函數、集成邏輯門、組合邏輯電路、集成觸發器、時序邏輯電路、硬體描述語言、半導體存儲器、可編程邏輯器件、脈衝單元電路、模數及數模轉換技術等。各章均附有內容提要、小結、思考題和習題。
3.Vivado從此開始
本書涵蓋了Vivado的四大主題:設計流程、時序約束、設計分析和Tcl腳本的使用,結合實例深入淺出地闡述了Vivado的使用方法,精心總結了Vivado在實際工程應用中的一些技巧和注意事項,既包含圖形界面操作方式,也包含相應的Tcl命令。本書語言流暢,圖文並茂。全書共包含405張圖片、17個表格、172個Tcl腳本和39個HDL代碼,同時,本書配有41個電子教學課件,為讀者提供了直觀而生動的資料。本書可供電子工程領域內的本科高年級學生和研究生學習參考,也可供FPGA工程師和自學者參考使用。
4.Xilinx新一代FPGA設計套件Vivado應用指南
本書系統論述了新一代FPGA設計套件Vivado的性能、使用方法以及FPGA的開發方法。全書內容包括Vivado設計套件的特性,全面可編程FPGA器件的架構,使用Vivado套件創建複雜數字系統設計項目,模擬系統功能,RTL分析產生網表文件,性能要求的時序約束及綜合,布局布線及靜態時序分析和生成位流文件等全部設計過程,基於項目和非項目批作業兩種用Tcl指令的設計模式,同步設計技術、HDL編碼技術、時序收斂和HI.S優化DSP演算法等關鍵技術,並以實例介紹了嵌入式系統的設計方法等。
5.Xilinx?FPGA設計權威指南?Vivado集成設計環境
本書全面系統地介紹了Xilinx新一代集成開發環境Vivado的設計方法、設計流程和具體實現。全書共分8章,內容包括:Vivado設計導論、Vivado工程模式和非工程模式設計流程、Vivado調試流程、基於IP的嵌入式系統設計流程、Vivado HLS設計流程、System Generator設計流程、Vivado部分可重配置設計流程和Vivado高級設計技術。本書參考了Xilinx公司提供的Vivado最新設計資料,理論與應用並重,將Xilinx公司最新的設計方法貫穿在具體的設計實現中。
6.基於FPGA的嵌入式圖像處理系統設計
本書詳細介紹了FPGA這種新型可編程電子器件的特點,對FPGA的各種編程語言的發展歷程進行了回顧,並針對嵌入式圖像處理系統的特點和應用背景,詳細介紹了如何利用FPGA的硬體並行性特點研製開發高性能嵌入式圖像處理系統。作者還結合自己的經驗,介紹了研製開發基於FPGA的嵌入式圖像處理系統所需要的正確思路以及許多實用,並給出了許多圖像處理演算法在FPGA上的具體實現方法以及多個基於FPGA實現嵌入式圖像處理系統的應用實例。
7.基於FPGA的數字圖像處理原理及應用
本書首先介紹FPGA程序設計和圖像與視頻處理的關鍵基礎理論,然後通過實例代碼詳細講解了如何利用FPGA實現直方圖操作中的直方圖統計/均衡化/線性拉伸/規定化、線性濾波器操作中的均值濾波器、Sobel運算元(濾波、求模、求角度)、非線性濾波器操作中的排序類演算法/形態學濾波、圖像分割演算法中的局部自適應分割/Canny運算元等。本書在模擬測試部分設計了一種完善的通用測試系統,並利用此測試系統在每一章的模擬測試環節對所設計演算法進行嚴格的測試和驗證。本書在很後一章介紹了在視頻處理領域常見的輸入/輸出介面。本書偏向於工程應用,在書中有大量關於如何利用FPGA實現圖像處理演算法的實例及代碼,並對這些演算法的原理及其實現過程、演算法測試等做了詳細的介紹,全部的演算法都進行了模擬測試驗證。
8.數字信號處理的FPGA實現
FPGA仍舊是快速創新的領域,很高興SpringerVerla9公司給我這個機會將FPGA領域的新發展囊括到本書的第3版中。本版新增了總計150多頁全新的理念和當前的設計方法。第3版的創新主要包括以下幾方面。
現在許多FPGA都包含嵌入式l8位×18位乘法器,因而推薦在以DSP為主的應用中使用這些器件,因為嵌入式乘法器可以節省很多LE。例如,在本版的所有示例,中都用到的CycloneIIEP2C35F672C6器件就具有35個18位×18位乘法器。
9.FPGA設計實戰演練(邏輯篇 高級技巧篇)
FPGA設計實戰演練共分為兩冊,分別是邏輯篇和高級技巧篇。
邏輯篇:主要面向廣大的FPGA/CPLD初學者,從零基礎開始講述FPGA/CPLD以及相關的基礎知識,並以一個支持各種入門、進階的子母板形式的學習套件為實驗平台,針對Altera公司的Cyclone Ⅲ器件量身打造的24個應用實例貫穿其中。實例講解深入淺出,不僅有基本的Verilog語法講解,也有設計思路和背景知識的詳細描述;?開發工具(Quartus Ⅱ ModelSim)的使用更是手把手、圖文並茂地展示給讀者。
高級技巧篇:現代FPGA的結構越來越複雜,多時鐘域的設計現在已是常態。對於功能電路來說,複位結構都必不可少。在同步邏輯設計中如何很好地處理非同步複位,甚至在多時鐘域之間傳遞(非同步)複位信號也是邏輯工程師經常面臨的挑戰。本書除專門介紹了上述電路的設計方法外,還介紹了狀態機的設計。在介紹這些通用電路結構的基礎上,還介紹了代碼優化以及如何對設計進行綜合與布局布線優化方面的相關內容。
10.FPGA項目開發實戰講解
本書立足於工程實踐經驗,首先介紹FPGA的原理、語法、設計技巧,然後詳細介紹了7項常用技術的實現。每項技術從以下幾方面介紹:相關技術介紹、FPGA方案框圖設計、子模塊設計、模擬和測試、項目開發過程中遇到的問題、定位和解決措施,其中插入了大量的狀態機轉換圖和關鍵代碼,方便讀者學習。
FPGA工程師經典必讀10 本全階學習推薦書目,資料截圖如下:
如何領取以上完整FPGA經典開發電子書?