1. 程式人生 > >FPGA程式如何模組化設計?

FPGA程式如何模組化設計?

綜合與可綜合的HDL設計


綜合的定義


綜合就是針對給定的電路實現功能和實現此電路的約束條件,如速度、功耗、成本及電路型別等,通過計算機進行優化處理,獲得一個能滿足上述要求的電路設計方案。 
被綜合的檔案是HDL檔案(或相應檔案等),綜合的依據是邏輯設計的描述和各種約束條件,綜合的結果則是一個硬體電路的實現。該方案必須同時滿足預期的功能和約束條件。對於綜合來講,滿足要求的方案可能有多個,綜合器將產生一個最優的或接近最優的結果。因此,綜合的過程也就是設計目標的優化過程,最後獲得的結構與綜合器的工作效能有關。


FPGA/CPLD綜合軟體


FPGA/CPLD綜合軟體包括:Synopsys公司的FPGA Compiler II、Synplicity公司的Synplify/Synplify Pro、Mentor公司的LeonardoSpectrum及FPGA/CPLD廠商整合開發環境中自帶的綜合工具,如Altera Quartus II軟體中的綜合軟體等。


綜合的特點


綜合的特點體現在以下幾個方面:綜合是在一定的限制條件下進行的,比如時序、面積或物理約束等;綜合器獨立於具體設計工藝,如果工藝改變,可使用新工藝元件庫重新綜合;綜合器很難得到硬體設計的所有實現方案,不可能得到最優的硬體結果;不同的綜合器使用不同的機制和演算法,因此對相同的HDL描述可能得到不同的結果;不同的綜合器對HDL語句和語法的支援不同,需要通過察看綜合軟體的相關文件進行了解。 
可綜合的資料型別包括列舉型別、整數型別、陣列型別(一維陣列、二維陣列)及記錄型別。綜合器不支援的資料型別包括:物理型別,如時間型別;浮點型別,如實數型別;存取型別及檔案型別等。


面向綜合的編碼風格


設計描述的編碼風格將直接影響EDA軟體工具的綜合結果。好的描述方式易於被綜合器識別且能夠被綜合出設計者所期望的電路。電路的質量取決於設計者使用的描述風格和綜合工具的能力。 


形成良好的編碼風格應注意以下幾個方面:


對希望形成組合邏輯的if和case語句,要完整地描述其各個分支,避免形成鎖存器(可行的方法之一是給所有被賦值訊號賦初始值); 


儘量使用簡單的邏輯及數字運算子; 


程序的敏感清單應列舉完全,否則可能產生綜合前後模擬結果不同的現象; 


在迴圈中不要放置不隨迴圈變化的表示式;


對 於複雜的數字運算要充分進行資源共享,如採用if塊等; 


對於長的組合鏈路應該在程式碼編寫階段注意描述成樹狀結構; 


時序邏輯儘可能採用同步設計; 


對具有不同的時序或面積限制的設計,應儘可能採用不同的程式碼描述以達到不同的要求(一般而言,面積與延時是相互衝突的,在FPGA 中面積代表資源的多少); 
對於複雜系統設計,應儘量採用已有的演算法和模組來實現。




設計實現


設計實現即利用實現工具把邏輯對映到目標器件結構的資源中,決定邏輯的最佳佈局,選擇邏輯與輸入輸出功能連線的佈線通道進行連線,併產生相應檔案(如,配置檔案與相關報告)的過程。通常可分為如下五個步驟:


1)轉換:將多個設計檔案進行轉換併合併到一個設計庫檔案中。 


2)對映:將網表中的邏輯閘對映成物理單元或元素,即把邏輯設計分割到構成可程式設計邏輯陣列內的可配置邏輯塊與輸入輸出塊及其他資源中的過程。


3)佈局佈線:佈局是指從對映中取出定義的邏輯和輸入輸出塊,並把它們分配到 FPGA 內部的物理位置。通常基於某種先進的演算法,如最小分割、模擬退火和一般的受力方向張弛等來完成;佈線是指利用自動佈線軟體使用佈線資源選擇路徑,試著完成所有的邏輯連線。在佈局佈線過程中,可同時提取時序資訊形成時序分析報告。 


4)時序提取:產生反標檔案,供後續的時序模擬使用。 


5)配置:產生FPGA配置時所需的位流檔案。




增量設計


傳統方法vs增量設計


傳統的FPGA設計過程中,每次修改都將導致整個設計的重新編譯,如此,時序也將產生變化,針對這一現象,引入了增量設計的概念。 


增 量設計主要是指增量編譯:根據設計者的分割設定,對不同的層次和模組分別編譯。在對設計進行重新編譯時,可以保持未修改部分的編譯結果,從而節省編譯時間。 
增量設計可將設計中無需修改的部分鎖定並保持其效能,僅對設計中變化的部分重新處理。使用增量設計,設計人員可在驗證過程中加速設計變化的除錯,將更多時間用於調整設計中的關鍵元件,甚至在後期設計規範發生改變時,也不會影響整個設計的主要進度。 


對於設計中未改變的部分,由於它們佈局佈線都保持不變,效能也不會變化,因此無需進行重新驗證,從而可以節省大量的設計時間。增量設計有助於模組化設計和基於團隊的設計流程。 


圖1 傳統方法vs增量設計(略)


設計分割


設計分割指使用者定義的邏輯分割,它與物理區域不同。邏輯分割應與設計的層次邊界相符合,其中,每個設計實體並不自動成為一個分割。設計分割具有不同的設計檔案,如果使用第三方綜合軟體,要為每個分割生成各自的EDIF或VQM檔案。最優化過程不能跨越分割的邊界,每個分割部分獨立的進行綜合和適配。


圖2給出了設計分割示意,頂層劃為一個分割,其他層次結構的子模組根據具體情況進行分割。不一定每個設計實體即為一個分割,也可以是幾個設計模組的組合。 


圖2 設計分割(略)


對於不同的設計流程,Altera提供了不同的軟體支援。自頂向下(Top-Down)的設計流程,整個設計在頂層編譯,可由一個設計者或專案管理者完成編譯設計,Altera Quartus II 5.0 和5.1中完全支援。自底向上(Bottom-Up)的設計流程,整個設計是在底層編譯,在各個設計者分別優化後進行整合。目前Altera Quartus II 5.0和5.1中尚無匯入和匯出功能,因此並不支援自底向上(Bottom-Up)的設計流程,而藉助LogicLock可實現該設計流程。


圖3 增量編譯流程(略)


增量編譯流程


增量編譯流程如圖3所示,首先,準備利用增量編譯的專案。包括:詳細的設計分析,識別設計的層次;生成設計分割;使能“完全增量編譯”或者“只進行增量綜合”;用LogicLock生成設計版圖等。


利用LogicLock布圖


利用LogicLock生成設計版圖:對包括頂層在內的每個分割產生一個LogicLock區域,而後每個LogicLock區域或設計分割將被獨立放置在分開的物理區域上,手動或使用Altera Quartus II早期時序估計工具分配物理位置。 


LogicLock區域由位置和尺寸定義。用原點表示位置:對於Stratix,Cyclone和MAX II器件,原點位於區域左下角,而其他Altera器件,原點則位於區域左上角。區域的寬度和高度決定了區域的尺寸。


推薦的設計分割用法與佈局方式


根據設計經驗,分割中有一些推薦用法,包括:所有分割的輸入輸出埠要有暫存器;應令跨邊界的連線最少;將關鍵路徑限制在每個分割的內部;分割不應太小(如<1000個邏輯單元);可能需要均衡使用資源;及分割邊界上不使用三態或雙向埠等。 
同時,推薦的布圖方式包括:避免區域間相互覆蓋及使用父區域和子區域,從而保持設計的邏輯層次關係,提高區域佈局的靈活性等。 


其次,執行完全編譯。執行完全編譯即啟動完全編譯並編譯每一個分割,從而生成在隨後增量編譯中重新使用的綜合後和適配後的網表。 


最後,對設計進行修改並執行增量編譯。完全編譯後,在設計與除錯階段需反覆進行設計的修改及增量編譯。


執行增量編譯


在下一次編譯期間為每個分割設定使用的網表型別,如表1所示,然後重新編譯設計。


表1 :網表型別設定(略) 




設計優化與模組化設計方法


設計優化


FPGA設計過程中,必須採用與其結構相適應的優化技術,才能有效發揮FPGA晶片的能力。設計優化是指在設計沒有達到使用者要求的情況下,對其進行改進,以便滿足設計的初始規格。 


設計優化的主要內容包括:理解整個設計;對設計進行約束和設定;優化資源利用;輸入輸出時序優化;速度優化;編譯效果優化及編譯和測試時間優化。其設計流程如圖4所示。 


圖4 設計優化流程(略)


只有深入理解整個設計,才能對其進行優化。包括理解系統時序,如系統時鐘、模組時鐘、時鐘域及時鐘來源等內部時鐘問題。 


在理解整個設計的基礎上,須對設計進行約束和設定,約束和設定旨在完成編譯後,可以根據編譯結果對設計進行分析,找到設計中的真正瓶頸,從而有效的引導後續的優化過程。利用Altera提供的開發工具及其他廠商的EDA軟體都可設定各種設計約束。 


完成約束、設定後,通常將檢視並分析編譯產生的報告,包括:瞭解設計的資源使用情況,以便在後續的設計優化中更合理的分配和使用資源;檢視並分析時序報告,判斷各種時序關係和系統執行速度等指標是否滿足了設計的需求,以便對不滿足要求的部分進行修改和優化。


優化資源的利用


設計過程中,由於資源數量限制,造成系統不能在目標器件中實現,則需對資源利用進行優化。FPGA的資源,包括:邏輯單元、塊RAM、I/O引腳、DSP塊、鎖相環、佈線資源及各種硬IP核等。 


設計中最根本、最有效的優化方法是對設計輸入(如HDL程式碼)的優化,比較常用的面積優化方法包括:模組的時分複用、改變狀態機的編碼方式及改變模組的實現方式等。 
當 設計中位置約束或者邏輯鎖定約束較多時,可能會造成區域性設計擁擠,導致佈線資源緊張,此時,可適當解除或放鬆佈線擁擠區域的約束 。


輸入輸出時序優化


輸入輸出時序優化需要重點考慮的問題是可程式設計邏輯器件與外圍晶片間的介面時序。在同步系統設計中,外部晶片和可程式設計邏輯器件使用的時鐘經常是同相位的。設計主要關心晶片輸入引腳的建立時間和保持時間、資料的時鐘到輸出延時及資料的輸入到輸出延時等。 


輸入輸出時序的優化方法:根據外圍器件和PCB連線情況,保留一定餘量,計算I/O時序要求,並將這些時序要求在EDA軟體中對設計進行約束,編譯軟體將根據約束條件進行自動優化;使用I/O單元的觸發器;及使用鎖相環電路等。


速度優化


速度優化即最高時鐘頻率優化,其最有效的方法是對設計程式碼進行優化。具體優化方法包括:增加流水線級數、組合邏輯分割和平衡、複製高扇出的節點及令狀態機僅完成控制邏輯的功能等。


編譯效果優化


使用不同的隨機數種子,編譯結果將在小幅度內變動。如果設計已經非常接近系統需求,則可以嘗試改變隨機數種子,使效能達到系統需求。同時,使用軟體工具,如Altera的"Design Space Explorer",可以一次執行多種編譯設定和優化目標,探索設計的優化空間。


編譯和測試時間優化


設計較大或約束較多時,編譯時間往往很長,從而影響開發進度。縮短編譯時間有以下3種常用方法:使用快速編譯方式,其特點是速度快,但可能在一定程度上影響設計效能;使用增量編譯,最大限度的利用上一次的編譯結果;反標註,使邏輯的位置和佈線成為下一次編譯的約束,對這部分不進行重新編譯。


模組化設計方法


模組化設計


模 塊化設計是將複雜的大型設計分成多個模組,利用基於團隊的優勢,分別進行設計和除錯。採用模組化設計,可以進行系統的標準化設計,即將一些系統中常用的功能塊進行模組化設計、除錯和包裝,以備呼叫。 


與傳統設計流程相比,模組化設計流程的輸入模組是已經優化並達到時序收斂的子模組,通過模組化設計方法繼承以往編譯與實現的結果,在保證每個子模組時序收斂的基礎上,達到頂層設計的時序收斂。因此有效避免了對整個系統進行的繁瑣的設計編譯、時序分析以及優化的反覆迴圈,提高了設計效率。 


模組劃分的一般原則:模組內部聯絡緊密;各個模組的功能儘量獨立;模組間連線儘量簡單。


模組化設計基本流程


模組化設計的基本流程(如圖5所示),分為兩部分,一:模組化設計輸入與綜合,包括:頂層模組設計(輸入與綜合)、子模組劃分及子模組的輸入與綜合。二:模組化設計實現,包括模組分割,新增設計約束、各子模組的實現(佈局佈線)及設計整合:將頂層設計和各子模組合併。 


圖5 模組化設計基本流程(略)


頂層設計是進行模組化設計的必要條件,包括:所有全域性邏輯、輸入輸出埠、類似黑匣子的子模組及模組間、模組與輸出輸入埠間的訊號連線等。專案設計人員設計各個子模組的邏輯實體,綜合出各個子模組的網表。


模組化設計的實現包括三個階段:初始預算、模組實現及設計整合。初始預算階段,專案負責人對設計的整體進行分割和邏輯資源的分配,主要任務包括:對設計進行全域性區域規劃和佈局;規劃每個模組的規模和區域;規定每個模組的輸入輸出埠及最初的時序約束。 


模 塊實現階段,專案設計人員將實現頂層設計中確定的各個模組,包括:添入功能實體、新增約束、進行佈局佈線。當最終實現結果滿足模組的設計要求,則該模組的實現階段完成。設計整合階段,專案負責人將所有實現好的有效模組的設計結果與頂層設計結果進行整合,從而完成整個設計,包括:對設計進行合併及對合並後的設計進行佈局佈線。


Altera LogicLock工具


Altera LogicLock工具是Altera Quartus II軟體內嵌的高階工具,LogicLock模組化設計流程支援複雜設計的某個模組獨立進行設計、實現及優化,並將該模組的實現結果約束在規劃好的FPGA區域內。這樣在進行設計整合時,能夠更好的繼承每個模組的實現結果,提高模組複用效率,縮短設計週期。 


基於LogicLock的模組化設計流程如下:1.合理規劃設計層次並劃分模組;2.使用Quartus II軟體自帶的綜合軟體或其他第三方綜合軟體,對設計的每個模組進行綜合;3.對每個子模組建立Quartus II軟體工程,在每個獨立的工程中分別對每個子模組進行設計優化,以滿足每個子模組的時序效能和麵積目標,建立LogicLock區域;4.當所有子模組都滿足要求後,匯出所有模組和LogicLock區域的反標資訊,作為後續設計的約束;5.建立頂層工程,根據設計要求選擇節點反標或佈線反標,將每個子模組的LogicLock區域反標資訊匯入頂層設計中;6.編譯頂層設計,並觀察頂層設計是否滿足設計需要。 


通過 LogicLock可以將關鍵路徑分組,便於時序優化;繼承模組的設計優化成果,便於設計重用;通過增量的編譯與實現,有效縮短設計編譯時間;支援模組化設計方法,便於分工協作與並行設計。