FPGA設計工程師總是希望其設計能夠“畢其功於一役”,但由於複雜的大型系統中牽涉到各種複雜功能、性能要求,以及數量龐大的系統閘,因此,不管花費多少的時間和精力,通常都需要更改設計、修正一些邏輯問題或做進一步的最佳化。
與傳統的設計流程相比較,為支援設計/合成及佈局佈線實體實現而開發的增量設計流程(incremental design flow),卻非常適用於對設計中的特定部分進行修改或最佳化,而且不會影響到其他已經達到設計要求的部分。如果因為系統記憶體受限或外延的執行時間,而不適合採用從上而下的嚴密方法時,設計工程師還可採用增量設計流程完成一項大型的設計。
此外,在增量設計流程中還採用了一些其他的設計策略,以便在繼續且獨立地開發設計中某些部分的同時,可以將該設計中另外的一些部分凍結。
傳統設計的建立和實體實現
一般的FPGA開發流程有以下幾個步驟:
- ●用HDL語言建立設計;
- ●執行合成前(pre-synthesis)模擬;
- ●設定約束;
- ●合成設計;
- ●執行合成後(post-synthesis)模擬;
- ●進行佈局佈線;
- ●以及分析設計的時序性能。
若能滿足功能和時序性能的要求,則可產生編程檔案並對元件進行編程。Libero IDE(Integrated Design Environment;整合設計環境)白金版工具配備了Actel及其合作夥伴所提供的一流開發工具,可成功地管理“一次性成功”的設計。為了改善性能,SmartTime時序分析和約束管理工具更提供了識別和分析設計中關鍵路徑的功能。此外,Magma PALACE實體合成工具一般都能提升Fusion可編程系統晶片(PSC)和ProASIC3元件的整體性能。
但若在初始佈局完成後,還需要進一步將設計的某些部分最佳化,那該怎麼辦?若性能還不穩定,或有些區塊 (block) 還有功能問題時,又該怎麼辦?
增量設計概述
增量設計流程(圖一)與傳統的合成/實體實現流程非常相似。不過,該流程在初始合成計畫設定和編譯之後,增加了一些編譯點(compile point)。這些編譯點是設計的一部分,但以相對獨立的合成單元存在;它們有自己的約束檔案,並個別最佳化;而且只在必要時,才需根據設計相依性(design dependency)分析和設計變更性質進行重新合成。
為確保增量設計的穩定性,以及實現具有多個輸出網表的階層化佈局佈線(每個編譯點有一個輸出網表,每個設計的頂層有一個網表),這些編譯點會被鎖定。鎖定編譯點是指在合成該編譯點的上一層時,不對該點重新最佳化,其階層介面(hierarchical interface)保持不變,且不對其邊界進行最佳化。這意味著同一個被鎖定的編譯點的所有範例,都將採用相同的實體實現,在合成中均獲得相同的對待。
另外,設計團隊可同時在各個編譯點獨立展開工作。每個編譯點均視為可進行增量修改和個別映射的單獨區塊。設計中可識別和套疊任意數目的編譯點。採用編譯點後,就可管理設計變更,且不影響設計的其他部分。
增量設計流程中採用一種“基於差異”的增量合成方法,記錄設計的變化和相依性。這樣,只有那些直接受增量變更影響的設計部分,才會重新合成。這種合成方法也可確保網表中所作的增量變更,能被相對應的網表導入和編譯功能所識別。設計工程師可用Layout Options(佈局選項)功能表中的Incremental Mode(增量模式)和Lock Existing Layout(鎖定現有佈局)選項來盡可能地保持原有的佈局佈線。只有那些與合成工具產生的編譯點變更直接相關的佈局部分,才會被更新和修改。
Synplify Pro合成工具的MultiPoint功能和Actel的Libero整合設計環境(IDE)一起提供有效的增量設計方法,管理真正的工程設計變更通知(engineering change order;ECO)需求。兩者的結合使設計工程師能對原設計作模組級變更,即只更改那些需要變更的部分。這種設計流程可將變更對那些原已成熟設計部分的影響降到最低,因此能夠節省時間和資源。
例如,可用Synplify Pro中的MultiPoint為日後設計或重新設計預留多個編譯點。也可將設計分成一些較小的合成物件,以便對其中一些區塊進行修改,同時又不影響另一些區塊。在特大型設計中,MultiPoint還能對增量區塊進行設計和合成,以避免發生系統記憶體或執行時間方面的問題。
Libero可接受Synplify Pro的MultiPoint合成所產生的更新網表。Libero中增量佈局佈線流程提供ECO方法,而且,只更新那些需要更新的佈局部分,原佈局中(由使用者選擇)的其餘部分將不受影響。顯然地,用增量佈局方法比重新進行整個佈局快許多。
在許多情況下,可能需要回到最初的設計,進行功能和性能修改,使其達到設計的要求。此時,若使用Synplify Pro中的MultiPoint合成和Libero IDE中的佈局佈線選項,設計工程師就可用有效的增量ECO模式方法,以最短的時間完成設計更新,且不會影響到那些已經完成的寶貴設計和開發工作。
而且,Libero IDE中的設計視圖可以在同一設計計畫中,獨立保存設計的不同版本。這個功能可讓設計工程師保存先前約束和佈局佈線的檔案,進而在增量設計佈局與原來的佈局間進行比較。這樣,就能輕鬆判斷增量修改後的設計是否能滿足設計要求,或原來的方案是否更好些。有了這些視圖,就能輕鬆地在原始佈局上進行修正,或以各增量佈局為起點,逐一逐次地進行更改,並比較每次迭代的結果。
《圖一 利用Synplify Pro和Libero IDE實現的增量設計流程》 |
|
增量設計流程具有許多優點:
- ●可將大型設計分解成一些較小的區塊,減少合成和佈局佈線的整體執行次數和記憶體需求;
- ●可在Synplify Pro中標示出網表或佈局中感興趣的區域,以增量方法進行修改,並且將對原佈局的影響降到最低,同時還能節省重新合成和佈局執行時間;
- ●傳統從下到上的設計需要設計工程師編寫和維護一些費時且易出錯的腳本,用於引導合成和記錄設計的相依性。增量流程採用基於差異的增量合成方法,不需要這類腳本;
設計課程
準備採用增量流程的設計
建立設計後,使用Synplify Pro合成工具中MultiPoint的第一步是,在啟動Synplify Pro時建立實現選項。該選項包含元件、速度級別、全局頻率以及其他設計和最佳化參數。之後,也可以建立一些採用不同參數或包含設計變更的實現方案,來測試設計的變更效果。例如可為初始參數和HDL設計代碼建立名為“實現方案 1”的實現方案。
Synplify Pro的Compile Only(純編譯)功能有助於Synplify Pro的SCOPE約束編輯器理解設計中的階層結構。Synplify Pro中的SCOPE約束編輯器管理合成和佈局佈線的約束條件,同時也用於定義各編譯點及其相對應的約束條件。編譯點和約束條件都保存在約束檔案中,作為該實現方案的一部分,且約束條件已設定為編譯點定義的一部分。編譯點被定義在新的頂層約束檔案中,或者說,編譯點的定義被添加到已有的頂層約束檔案(.sdc)中。
然後,從Synplify Pro的工具列中啟動SCOPE,並從Select File Type(選擇檔案類型)對話方塊中選擇Top Level Module(頂層模組)。使用這個功能表命令,可根據設計識別出的模組列表建立各編譯點。使用者可鎖定某些感興趣的模組或功能區塊。這些被鎖定的區塊將被Synplify Pro識別為編譯點,並同時設定好其他的一些頂層約束,例如:輸入/輸出延遲、時脈頻率或多週期路徑等。
必須在相對應的.sdc檔案中為每個編譯點規定其約束條件,並在頂層.sdc檔案中為整個設計添加單獨的頂層約束條件。設計環境提供名為Create SCOPE File(建立SCOPE檔案)的對話方塊,讓使用者可以輕鬆地建立編譯點和約束條件。
在SCOPE中完成編譯點和約束的設定後,就可以對頂層設計進行合成處理。合成設計可分為三個步驟︰
- (1)從最底層向上合成編譯點;即從該設計階層架構的最底層的編譯點開始合成。每個編譯點被獨立合成。Synplify Pro為每個編譯點建立子目錄,目錄按編譯點命名。該目錄儲存編譯點的一些中間檔案,如RTL網表、映射網表以及模型建立檔案。模型建立檔案包含合成下一層時所需的階層界面時序和資源訊息。該檔案一旦生成,就不需要更新,除非出現界面變更或用戶有特殊要求需要更改。
- (2)所有編譯點都合成後,Synplify Pro將根據各編譯點的模型建立訊息,從上而下合成整個設計。
- (3)然後為整個設計產生單一網表和約束檔案。
分析Synplify Pro的結果
評估合成結果的方法有好幾種。Synplify Pro將時序和區域寫入實現方案目錄中的日誌檔案。可在Synplify Pro的HDL Analyst RTL和Technology schematic views中評估設計;確定其是否已達到設計目的。也可檢視和隔離某些關鍵路徑,搜索和標示出某些重點設計目標,在原始檔案間進行交叉探測(cross-probe)。在這個層面上發現的任何錯誤都應當予以修正。
合成或以增量方式重新合成
Synplify Pro可以讓使用者以增量方式合成設計或對整個設計進行合成。如果某一編譯點從未改變,Synplify Pro便會使用前次合成執行時產生的模型建立檔案。可選擇以增量方式合成設計(即執行run incrementally指令),該指令只合成編譯點;而且,只有那些已經出現原始碼(source code)、約束或實現變更的編譯點才會改變。也可用re-synthesize all(重新合成所有)指令重新合成整個設計。一般來說,選擇以增量方式合成設計比較省時。
實體實現:將更新的網表導入Libero
一旦Synplify Pro產生網表,就自動成為Libero IDE檔案管理器的一部分,並且可用於佈局佈線(即可被佈局功能使用)。在設計流程和檔案管理器與Libero之間的使用者介面上,很容易就可以找到和選出Synplify Pro所建立的網表實現方案,如(圖二)。
《圖二 在Libero IDE中識別和選擇網表的使用者介面》 |
|
假設該網表是更新後的網表,包含設計和合成過程中產生的增量變更,使用者可能首先希望保護Libero初始佈局佈線過程中所產生的原始佈局。在Libero中,可將原始佈局保存為實體設計View(也稱為implementation)檔案,可按使用的方便性為該視圖命名,例如命名為Design_Layout_1。Libero不會用更新的網表結果覆蓋Design_Layout_1這個檔案,它可以在同一計畫中建立新的View。例如,可將名為Design_Layout_2的檔案用於存放更新網表的實現和測試結果。這個功能讓使用者能夠比較用Synplify Pro產生增量網表變化前後的結果。
接下來,在Libero中打開實體實現工具Designer,將更新的網表用新的實現方案名稱導入Libero,並編譯設計。
編譯設計後,在Libero的佈局選項中完成設計佈局。該功能表的預設選項(default selection)會對整個佈局進行重新佈局佈線。對於包含已經MultiPoint更新後的網表,建議採用完全佈局佈線。
完全佈局佈線的佈局效率最高,但需要對所有時序進行重新驗證。從增量修改策略的角度來看,只對那些直接受增量變化影響的佈局部分進行重新佈局佈線也許更為有利。佈局選項功能表包括Place Incrementally(放置增量)、Lock Existing Placement(Fix;鎖定現有放置或修正)和Route Incrementally(佈線增量)。
Place Incrementally(沒有鎖定)使用現有的元件佈局作為參考起始點,但大多數情況下,會得到不同的佈局結果。Place Incrementally採用針對元件增量佈局的高級演算法,以盡可能地滿足時序要求。用Lock Existing Placement(Fix)鎖定現有的佈局,可降低佈局結果因增量變更而引起的不可預測性,這是因為Libero的佈局過程沒有涉及到所有的固定(不改變的)區塊。
若加入增量變更,使用者需要確保FPGA陣列具有足夠的設計空間。如果增量變更大,而且設計空間已經非常緊張,佈局便可能不會成功。如果事先知道以後會進行增量變更,可使用Libero IDE的平面空間規劃工具(Chipplanner)在晶片上為變更保留一些區域。該方法與鎖定初始佈局配合,就可快速、有效地將增量變更加入,而且能按要求保留原佈局中的某些部分。
增量佈線企圖保留設計的現有佈線,但並不能保證其不會受到影響,因為這取決於網表變更的性質。
評測更新後的佈局
完成佈局後,使用Libero的靜態時序分析工具SmartTime來驗證新的實現方案之整體元件性能;必要時,分析關鍵路徑。比較Design_Layout_1和Design_Layout_2增量佈局流程的性能結果,並確定增量更新是否已達到設計目標,如(圖三)。
元件編程和除錯
在採用ECO流程達到設計目標後,就可使用Libero IDE提供的FlashPro系統內編程(ISP)工具、Silicon Sculptor編程工具,以及Synplicity的 Identify及Actel的Silicon Explorer元件除錯工具和驗證工具。
結論
Synplify Pro MultiPoint合成和Libero IDE開發工具為管理ECO需求提供了一有效的增量設計流程。兩者結合後,使設計工程師能對原設計進行模組級的變更,而且只更改那些需要變更的部分。這種設計流程可將變更對那些原已成熟設計部分的影響降到最低;由於不需要對整個設計重新佈局,因而節省了時間。使用者可使用Synplify和 Libero中的實現選項和視圖,建立起不同設計的選項方案,進而分析和比較這些方案,並選出性能最佳的方案。
---作者任職於Actel---