UltraFast是Xilinx在2013年底推出的一套設(shè)計方法學指導,旨在指引用戶最大限度地利用現(xiàn)有資源,提升系統(tǒng)性能,降低風險,實現(xiàn)更快速且可預(yù)期的設(shè)計。面向Vivado的UltraFast方法學的主體是UG949文檔,配合相應(yīng)的Checklist,隨Vivado版本同時更新,用戶可以在Xilinx的主頁上免費下載。目前,針對Vivado設(shè)計套件的UltraFast中文版也已經(jīng)上市,另外一套全新的針對嵌入式可編程設(shè)計的UltraFast嵌入式設(shè)計方法指南UG1046也已經(jīng)在Xilinx官網(wǎng)上開放下載。
盡管UltraFast這個字眼經(jīng)常在網(wǎng)上看到,不論官方還是其他媒體上說起Vivado設(shè)計套件時也常常提到,但很多用戶仍然對這個概念十分模糊,有不少人下載文檔后看到300頁的PDF頓時也失去了深入學習和了解的興趣。
適逢《Vivado使用誤區(qū)與進階》系列連載半年多,大部分預(yù)先列好的主題也都已經(jīng)按照計劃完成,我們準備把這些短文集結(jié)為一本電子書,方便更多讀者隨手翻閱或是必要時用作設(shè)計參考。借此機會,套用在Xilinx內(nèi)部被譽為 “Vivado之父”的產(chǎn)品營銷總監(jiān) Greg Daughtry在去年第一屆Club Vivado中所提出的 “時序收斂十大準則” 的概念,試著用十分鐘的篇幅來概括一下什么是UltraFast,以及怎樣利用UItraFast真正幫助我們的FPGA設(shè)計。
時序設(shè)計的十大準則,基本上也涵蓋了UltraFast設(shè)計方法指南的基本要點。UG949中將FPGA設(shè)計分為設(shè)計創(chuàng)建、設(shè)計實現(xiàn)和設(shè)計收斂幾大部分來討論,除了介紹所有可用的設(shè)計方法和資源,更多的是一些高級方法學技巧,這些技巧基本上都跟時序收斂有關(guān)或是以時序收斂為目標,有些通用的方法和技巧甚至脫離了具體選用的FPGA器件的限制,適用于更廣泛意義上的時序收斂。
最寶貴的是,所有這些UltraFast設(shè)計方法學技巧都來自一線技術(shù)支持人員的經(jīng)驗以及客戶的反饋,是業(yè)界第一本真正意義上完全面向用戶的指南,這一點只要你試著讀過一兩節(jié)UG949就會有明顯感覺,所有其中提到的技巧和方法都具有很高的可操作性,可以帶來立竿見影的效果。
接下來我們就由這十大準則展開,帶領(lǐng)各位讀者在十分鐘內(nèi)理清UltraFast方法學的脈絡(luò),一探其究竟。
準則一:合適的代碼風格
理想環(huán)境下,源代碼可以獨立于最終用于實現(xiàn)的器件,帶來最佳的可移植性和可復(fù)用性。但是,底層器件各自獨特的結(jié)構(gòu),決定了通用代碼的效率不佳,要最大化發(fā)揮硬件的性能,必然需要為實現(xiàn)工具和器件量身定制代碼。
關(guān)于Xilinx器件和Vivado適用的代碼風格,我們有以下建議:
?
準則二:精準的時序約束
精準的時序約束是設(shè)計實現(xiàn)的基礎(chǔ),對時序驅(qū)動工具Vivado來說,約束就是最高指示,是其努力實現(xiàn)的目標。很多時候我們發(fā)現(xiàn),約是有經(jīng)驗的工程師約是喜歡用一些舊有經(jīng)驗套用在Vivado上,例如很多人偏愛用過約束的方式來追求更高的性能,但實際上對Vivado來說,大部分的過約束只會阻礙時序收斂。
簡要概括而言,精簡而準確的約束是時序收斂的必要條件,而UltraFast中提出的Baseline基線方法則是充分條件。
具體的約束方法我們在《XDC約束技巧》中有詳細討論,除了保證語法正確,還要注意設(shè)置XDC約束的順序,通常第一次運行時只需要約束所有時鐘,然后在內(nèi)部路徑基本滿足時序約束的情況下加入關(guān)鍵I/O的約束,其次再考慮必要的時序例外約束。
所有這些約束都必須遵循精簡而準確的原則,且可以借助Vivado中的XDC Templates以及Timing Constraint Wizard的幫助來進行。
Baseline基線方法可以說是UltraFast的靈魂部分,強烈建議所有Vivado的用戶都能精讀UG949中的這部分內(nèi)容,并將之應(yīng)用在具體的設(shè)計中。有機會我會深入展開一篇專門介紹Baseline方法的短文,這里先將其核心的概念做一個總結(jié)。
?
?
上圖展示了同一個設(shè)計在三個不同階段用同樣的命令報告時序所得到的最差路徑,可以清晰的看出,即使不做任何源代碼上的改動,設(shè)計中真正最差的路徑已經(jīng)不會作為最差路徑出現(xiàn)在布局布線后的報告中。這正是因為Vivado時序驅(qū)動的天性決定了其在設(shè)計實現(xiàn)的每一步都是以開始時讀到的設(shè)計輸入和約束為依據(jù),盡量將最好的資源用在最差的路徑上,從而盡最大可能實現(xiàn)時序收斂。
這便是Baseline理論的基礎(chǔ),除了按順序設(shè)置精準的時序約束,在設(shè)計實現(xiàn)的每一步,用戶都需要關(guān)注時序報告,并以其為依據(jù)來調(diào)整設(shè)計源代碼或是應(yīng)用其他必要的約束和選項來優(yōu)化設(shè)計。保證每一階段之后的時序報告都滿足約束或是僅余300ps以內(nèi)的時序違例,再進入下一階段的設(shè)計實現(xiàn)過程,否則,應(yīng)該繼續(xù)在當前階段或是退回到上一階段調(diào)整后重跑設(shè)計,直到滿足要求再繼續(xù)。
越早發(fā)現(xiàn)和定位問題,越是可以通過少量的努力來達到更大范圍的改進。
準則三:管理高扇出網(wǎng)絡(luò)
高扇出網(wǎng)絡(luò)幾乎是限制FPGA設(shè)計實現(xiàn)更高性能的第一大障礙,所以我們需要很嚴肅地對待設(shè)計中的高扇出網(wǎng)絡(luò)。
很多人會陷入一個誤區(qū),反復(fù)糾結(jié)到底多大的扇出值算是大?其實這一點不是絕對的,在資源充裕時序要求不高的情況下幾千甚至上萬都不算大,反之在局部關(guān)鍵路徑上僅有幾十的扇出也可能需要進一步降低。
在Vivado中,我們除了關(guān)注時序報告,尤其是布局后布線前的報告來定位關(guān)鍵路徑上影響時序的高扇出網(wǎng)絡(luò)外,還有一個專門的命令report_high_fanout_nets ,在給其加上 -timing的選項后,可以在報告高扇出路徑的同時報告出這條路徑的Slack,幫助用戶直觀了解當前路徑的時序裕量。此外,這個命令在報告中還會指出高扇出網(wǎng)絡(luò)的驅(qū)動類型,是FF或是LUT等。
找到目標后,可以利用max_fanout來限定其扇出值,讓工具在實現(xiàn)過程中復(fù)制驅(qū)動端寄存器來優(yōu)化。如果高扇出網(wǎng)絡(luò)并不是由同步邏輯來驅(qū)動,則可能需要修改代碼。還有一些工具層面上的降扇出方法,比如選擇更強更有針對性的策略,或是允許多次物理優(yōu)化phys_opt_design,甚至是通過我們在《用Tcl定制Vivado設(shè)計實現(xiàn)流程》中提到的“鉤子”腳本等方式來進行局部降扇出的物理優(yōu)化等等。
但有一點需要注意,Vivado綜合選項中的全局扇出限定要慎用 ,不要將其設(shè)置的過低以免綜合出的網(wǎng)表過于龐大,帶來資源上的浪費,并可能導致局部擁塞。
準則四:層次化設(shè)計結(jié)構(gòu)
隨著設(shè)計規(guī)模的不斷擴大,以及SoC設(shè)計的興起,越來越多的IP被整合到大設(shè)計中,曾經(jīng)為高性能設(shè)計而生,便于統(tǒng)一管理和控制的自頂向下的設(shè)計流程變得不再適用,F(xiàn)PGA設(shè)計也跟大規(guī)模SoC設(shè)計一樣,需要采用層次化的設(shè)計流程,即自底向上的流程。這也要求設(shè)計者在源代碼階段就考慮到最終的實現(xiàn),處理好模塊的層次邊界。
Vivado中的IP設(shè)計是原生的自底向上流程,用戶可以將IP生成獨立的DCP再加入到頂層設(shè)計中去。我們也鼓勵用戶將某些相對固定或獨立的模塊綜合成DCP后加入頂層設(shè)計,這么做除了加快設(shè)計迭代外,也更利于設(shè)計開始階段的調(diào)試和問題的定位。
Vivado中的OOC模式甚至還支持完全層次化的設(shè)計,即將底層模塊的布局布線結(jié)果也進行復(fù)用,這么做雖然流程復(fù)雜,卻帶來了更全面的控制性,也是部分可重配置技術(shù)的實現(xiàn)基礎(chǔ)。
準則五:處理跨時鐘域設(shè)計
FPGA設(shè)計中通常都帶有跨時鐘域的路徑,如何處理這些CDC路徑非常重要。由于Vivado支持的約束標準XDC在處理CDC路徑上與上一代ISE中支持的UCF約束有本質(zhì)區(qū)別,如何約束以及怎樣從設(shè)計上保證CDC路徑的可靠性就成了重中之重。
《XDC約束技巧之CDC篇》中對Vivado中的跨時鐘域設(shè)計有詳細描述,UG949中也有不少篇幅用來討論CDC路徑的各種設(shè)計技巧和約束方法。建議用戶深入學習和了解這部分的內(nèi)容,其中有不少概念并不僅僅局限于FPGA設(shè)計中的跨時鐘域設(shè)計,放在其他IC設(shè)計上也一樣有效。
需要提醒大家的是,一定要利用好Vivado中的各種報告功能,例如report_cdc和DRC報告中的methodology_checks來檢測設(shè)計中的CDC結(jié)構(gòu)問題,并作出具體的設(shè)計調(diào)整或是補全CDC約束。另外要注意各種不同的CDC路徑處理方法之間的優(yōu)劣,選擇最適合自己設(shè)計的方式,配合相應(yīng)的約束來保證跨時鐘域路徑的安全。
準則六:少而精的物理約束
不同于對時序約束尤其是時鐘約束之全面而精準的要求,Vivado對物理約束的要求只有一個字:少。這里的物理約束更多強調(diào)的是除了I/O引腳位置這些必要項之外的約束,例如對RAMB和DSP48的位置約束,還有局部的floorplan計劃。
很多資深工程師非常喜歡畫floorplan,因為其對設(shè)計的數(shù)據(jù)流和資源使用情況了如指掌,根據(jù)自己理解畫出的floorplan通常也算合理。但是,floorplan在Vivado中的重要性遠低于以往在ISE上的作用。根據(jù)客戶的實際經(jīng)驗反饋,絕大多數(shù)的設(shè)計中都無需任何floorplan(某些時序要求較高的SSI芯片設(shè)計上可能需要),因為算法的改進,Vivado在布局上比上一代ISE更聰明,沒有任何物理約束(除了IO引腳位置約束)的設(shè)計反而能在更短的時間內(nèi)更好地滿足時序要求。
在確實需要鎖定某些宏單元以及進行floorplan的設(shè)計中,一般我們會推薦先不加任何物理約束來跑設(shè)計,在其他諸如改進源代碼,設(shè)置約束和選項,改變策略等辦法都試過后,再嘗試物理約束。而且,最好只在少量關(guān)鍵的設(shè)計區(qū)域進行floorplan,切忌過度約束,不要創(chuàng)建資源利用率過高的pblocks,同時避免重疊的pblocks區(qū)域。
順便提一下,Vivado IDE中的Device視圖可以通過設(shè)置不同顏色來高亮顯示不同模塊,用戶可以根據(jù)當前設(shè)計的布局結(jié)果配合時序報告和關(guān)鍵路徑來創(chuàng)建和調(diào)整floorplan,操作非常便捷。
?
?
準則七:選擇實現(xiàn)策略
從ISE升級到Vivado后,很多用戶發(fā)現(xiàn)SmartXplorer功能不見了,當設(shè)計進行到后期,假如不能遍歷種子,常讓人感到無所適從,甚至懷疑到了這一步Vivado便無計可施。那么事實到底如何呢?
嚴格來講,Cost Table 其實是一種無奈之舉,說明工具只能通過隨機種子的改變來“撞大運”般篩選出一個最佳結(jié)果,這也解釋了為何改變Cost Table的結(jié)果是隨機的,一次滿足時序,并不代表一直可以滿足。
因為更高級算法的引入,Vivado中的設(shè)計實現(xiàn)變得更加可靠,而且是真正意義上的可預(yù)計的結(jié)果。但這并不代表在Vivado中對同一個設(shè)計進行布局布線只能有一種結(jié)果。我們可以通過“策略”來控制實現(xiàn)過程中的算法側(cè)重,從而可以產(chǎn)生更優(yōu)化的結(jié)果。
策略(Strategy)是一組工具選項和各個階段指示(Directive)的組合,Vivado IDE中內(nèi)置了幾十種可供用戶直接選用,但如果窮盡各種組合,整個實現(xiàn)過程大約有上千種策略。當然,我們沒必要遍歷每種策略。而且因為策略是一種可預(yù)計可重現(xiàn)的實現(xiàn)方法,所以對同一個設(shè)計,可以在選擇幾種有側(cè)重點的策略后挑選出效果最好的那個,只要設(shè)計后期沒有大的改動,便可一直延用同樣的策略。
具體策略的特性,請參考UG949和UG904等文檔,也可以在Vivado中通過help菜單了解。更多時候,選擇怎樣的策略是一種經(jīng)驗的體現(xiàn),另外,即使找到了最佳實現(xiàn)策略,也仍舊有可能不滿足時序要求,這時候我們還可以參考《用Tcl定制Vivado設(shè)計實現(xiàn)流程》中所述,對設(shè)計實現(xiàn)的流程進行進一步的個性化定制。
另外要強調(diào)一點,修改策略來提升性能必須放在調(diào)整代碼、約束和選項等更直接高效的優(yōu)化方法之后進行,其能帶來的性能提升比起前述優(yōu)化方法來說也更加局限。
準則八:共享控制信號
共享控制信號這一點充分體現(xiàn)了設(shè)計必須考慮到用于底層實現(xiàn)的芯片結(jié)構(gòu)的重要性,在Xilinx的芯片上,時鐘、置位/復(fù)位和時鐘使能等信號通稱為Control Set,進入同一個SLICE的Control Set必須統(tǒng)一。換句話說,不同Control Set控制下的FFs不能被Vivado放進同一個SLICE。
為了提升SLICE的利用率,獲得更高效的布局方案,提升時序性能,我們必須控制一個設(shè)計中Control Set的總數(shù),盡量共享控制信號。具體做法包括:
盡量整合頻率相同的時鐘和時鐘使能信號;
在生成IP時選擇“共享邏輯”功能,則可以在不同IP間盡可能的共享時鐘資源;
遵循Xilinx建議的復(fù)位準則:
盡量少使用復(fù)位
必須復(fù)位時采用同步復(fù)位
確保使用高電平有效的復(fù)位
避免異步復(fù)位(RAMB和DSP48模塊中不支持異步復(fù)位)
Xilinx的復(fù)位準則必須嚴格遵守,根據(jù)現(xiàn)場支持的經(jīng)驗來看,很多設(shè)計性能的瓶頸就在于設(shè)計源代碼時沒有考慮底層實現(xiàn)器件的硬件結(jié)構(gòu)特點,尤其以復(fù)位信號的實現(xiàn)問題最為突出。
準則九:讀懂日志和報告
任何一個工具的日志和報告都是衡量其性能最重要的一環(huán),正因為有了完備的日志與報告,用戶才可以通過其中顯示的信息,定位設(shè)計中可能的問題,決定優(yōu)化方向。
Vivado日志中將信息顯示為三大類,分別為Error、Critical Warning和一般Warning/Notes等。Error會導致工具直接中斷,其他警告不會中斷工具運行,但所有的Critical Warning都需要用戶逐一檢查并通過修改設(shè)計、增加約束或設(shè)置選項之類的辦法來修復(fù)。
Vivado的報告功能很強大,除了《讀懂用好Timing Report》中描述的時序分析報告,還有很多重要的報告,小到檢查設(shè)計中的特定時序元件和鏈路,大到各種預(yù)置和自定義的DRC檢查,不僅提供給了用戶多樣的選擇,也進一步保證了設(shè)計的可靠性。
Vivado也一直在增強和更新報告的種類,比如2014.3之后還增加了一個設(shè)計分析報告report_design_analysis,用來報告關(guān)鍵路徑上的潛在問題以及設(shè)計的擁塞程度。完整的report命令和功能可以在UG835中查詢。
準則十:發(fā)揮Tcl的作用
Tcl在Vivado中的作用不容小覷,不僅設(shè)計流程和報告全面支持Tcl腳本,就連XDC約束根本上也來自于Tcl,用戶甚至可以直接把包含有循環(huán)等功能的高級約束以Tcl的形式讀入Vivado中用來指引整個實現(xiàn)流程。
《Vivado使用誤區(qū)與進階》系列中有三篇關(guān)于Tcl在Vivado中的應(yīng)用文章,詳細描述了如何使用Tcl創(chuàng)建和應(yīng)用約束,查找目標和定位問題;如何用Tcl來定制Vivado的設(shè)計實現(xiàn)流程,為圖形化界面提供更多擴展支持;以及如何用Tcl實現(xiàn)ECO流程。Tcl所帶來的強大的可擴展性決定了其在版本控制、設(shè)計自動化流程等方面具有圖形化界面不能比擬的優(yōu)勢,也解釋了為何高端FPGA用戶和熟練的Vivado用戶都更偏愛Tcl腳本。
另外,隨著Xilinx Tcl Store的推出,用戶可以像在App Store中下載使用app一樣下載使用Tcl腳本,簡化了Tcl在Vivado上應(yīng)用的同時,進一步擴展了Tcl的深入、精細化使用。最重要的是,Tcl Store是一個基于GitHub的完全開源的環(huán)境,當然也歡迎大家上傳自己手中有用的Tcl腳本,對其進行補充。
小結(jié)
關(guān)于UltraFast的要點總結(jié)基本可以概括在上述十點,這也可以看作是對《Vivado使用誤區(qū)與進階》系列短文的一個串燒。說實話,八九頁的篇幅要將整個UltraFast講透基本沒有可能,對于正在使用Vivado做設(shè)計或是有興趣試用的讀者們,強烈建議各位在Xilinx官網(wǎng)絡(luò)下載完整的UltraFast指南并通讀。
這篇短文和這本電子書旨在幫助大家盡快上手Vivado和XDC,寶劍在手,再加上蓋世神功傍身,行走江湖豈不快哉。衷心祝福大家在FPGA設(shè)計之路上收獲更多喜悅,讓Xilinx和Vivado為您的成功助力。
評論