?
6.6??增量式設(shè)計(Incremental?Design)技巧
本節(jié)將對ISE下增量式設(shè)計做一個全面的介紹。FPGA作為一種現(xiàn)場可編程邏輯器件,其現(xiàn)場可重編程特性能夠提高調(diào)試速度。每次硬件工程師可以很方便地改變設(shè)計,重新進(jìn)行綜合、實現(xiàn)、布局布線,并對整個設(shè)計重新編程。
然而當(dāng)設(shè)計算法比較復(fù)雜時,每一次綜合、實現(xiàn)、布局布線需要花很長的時間。即使僅僅改變設(shè)計中的一點(diǎn),也會使綜合編譯的時間成倍增加。而且更為麻煩的是如果整個工程的運(yùn)行頻率很高,對時序的要求也很嚴(yán)格,這樣重新布線往往會造成整個時序錯亂。
運(yùn)用增量式設(shè)計可以有效地解決這一問題。一方面大大節(jié)約綜合、布局布線的耗時,另一方面可以繼承前一設(shè)計中已有的成果,是一種比較常用的設(shè)計流程。
6.6.1??增量式設(shè)計的必要性
增量式設(shè)計(Incremental?Design)方法是一種能在小范圍改動情況下節(jié)約綜合、實現(xiàn)時間并繼承以往設(shè)計成果的設(shè)計手段。作為一個流程,增量設(shè)計能夠極大地減小布局布線時間,并且當(dāng)對一個近似完整的設(shè)計作小的變動,可以保持整個系統(tǒng)的性能。
在增量設(shè)計中每一個邏輯分組在Xilinx的FPGA里受到約束以使之只占有自己的空間。在設(shè)計中,對當(dāng)對其中之一的邏輯分組做改動時,一個增量設(shè)計流程可以確保未做改動的邏輯分組在進(jìn)行綜合輸出時不變化。接著布線工具對改動了的邏輯分組重新進(jìn)行布局布線,而未改動的邏輯分組則繼續(xù)以前的布局布線結(jié)果,這使得整個設(shè)計的布局布線時間得以削減。
增量式設(shè)計對一處復(fù)雜的設(shè)計來說是非常必要的,主要是因為增量式設(shè)計有以下兩個方面的優(yōu)點(diǎn)。
1.減小綜合、布局布線的耗時
當(dāng)僅對大型設(shè)計工程的局部進(jìn)行改動時,增量設(shè)計流程僅僅改動的部分重新編譯,如果改動模塊的接口設(shè)計恰當(dāng),將不會影響其余部分的綜合與實現(xiàn)結(jié)果,布局布線時也只對改動部分重新布線,未改動的部分保持不變,從而節(jié)約了整個編譯、布局布線與優(yōu)化的耗時。
2.能夠很好地繼承未修改區(qū)域的實現(xiàn)成果
這一點(diǎn)對于對時序要求很嚴(yán)格的設(shè)計來說是很有用的。如果一個設(shè)計經(jīng)過多次調(diào)試,附加合適的約束,設(shè)置恰當(dāng)?shù)膮?shù)達(dá)到了最佳實現(xiàn)成果。但是因為對某個細(xì)節(jié)進(jìn)行了修改,就需要全部重新綜合、布局布線,這樣可能前面所做的精心調(diào)整工作都無效了。
通過增量式設(shè)計,可以解決這一問題。對于已達(dá)到設(shè)計要求的部分將其保持不變,僅對修改的部分重新編譯、布局布線,從而保證在最大程度上繼承以往的實現(xiàn)結(jié)果。
6.6.2??增量設(shè)計流程
具體的增量設(shè)計流程如圖6.29所示。
增量設(shè)計的流程可歸納如下。
1.創(chuàng)建邏輯分組(Create?Logic?Group)
在增量設(shè)計中為了實現(xiàn)減小綜合、布局布線耗時,極大程度地繼承未修改區(qū)域的成果,必須要求將設(shè)計分成多個邏輯分組。每個邏輯分組應(yīng)該分配一定的邏輯區(qū)域,當(dāng)某一邏輯分組的內(nèi)容發(fā)生改變時,增量設(shè)計可以在該邏輯分組分配的邏輯區(qū)域內(nèi)對其進(jìn)行重新綜合和布局布線,而不會影響到其他的邏輯分組。
所謂“邏輯分組”,是惟一的邏輯層次中的若干邏輯實體的劃分。比如在頂層邏輯層次中每個子模塊即為一個邏輯分組。在代碼中即為頂層中“module(Verilog)”和“entity(VHDL)”定義的子模塊的實體。在一個設(shè)計中往往將實現(xiàn)的不同功能設(shè)置為不同的模塊,然后在一個頂層模塊中實例化所有這些不同功能的模塊,從而實現(xiàn)一個完整的功能,那么這些不同功能的模塊就可以看作是不同的邏輯分組。
在進(jìn)行邏輯分組時,需要考慮以下因素。
(1)設(shè)計中所有邏輯除了IOB和時鐘邏輯,都應(yīng)該包含在邏輯分組當(dāng)中。
(2)頂層模塊不應(yīng)該包含復(fù)雜邏輯,僅僅包含一些I/O定義、時鐘分配邏輯和所有子模塊的實例化,直正的功能實體用子模塊的邏輯描述。增量設(shè)計方法希望將所有的邏輯實體分割到子模塊中去,而頂層模塊不含任何實際的邏輯功能,以便于做相應(yīng)的區(qū)域約束。
頂層包含實際邏輯功能的缺點(diǎn)在于:當(dāng)頂層改變時,相關(guān)的Logic?Group的接口將發(fā)生變化,從而影響Logic?Group的結(jié)構(gòu),在做編譯和布局布線時,會影響增量設(shè)計的效能。
(3)邏輯模塊分組必須以寄存器輸出,即用寄存器分割模塊。這一點(diǎn)其實不僅僅是增量設(shè)計的需求,也是合理劃分模塊的一個基本要求。
如果采用同步時序方式設(shè)計電路,用寄存器分割邏輯模塊,模塊間的接口盡量簡單,則時序優(yōu)化路徑集中在同一模塊內(nèi)部而不是模塊之間的邊界上。這樣能夠使綜合器完整地掌握需要時序優(yōu)化的路徑,從而避免了因一個模塊內(nèi)部改變而通過邊界影響到其他模塊的時序這種不利于增量設(shè)計的情況發(fā)生。
(4)每個邏輯分組為其附加區(qū)域分組約束。
2.增量綜合(Incremental?Synthesis)
所謂增量綜合是指只有改變的部分重新綜合,而對未改變部分保持原有的綜合結(jié)果的一種綜合技術(shù)。傳統(tǒng)的綜合技術(shù)即使有微小的改動,也會對整個設(shè)計重新綜合。
如果要實現(xiàn)增量綜合必須對綜合工具做相應(yīng)的設(shè)置。在這里主要講述ISE自帶綜合工具XST是如何實現(xiàn)增量綜合的,對于其他綜合工具如:Synplify/Synplify?Pro和Leonardo?Spectrum綜合工具,在這里不做詳細(xì)介紹。
XST支持單一工程的模塊級增量綜合(BLSI)。實現(xiàn)的方法為在XST的約束文件(擴(kuò)展名為xcf)中附加邏輯分組約束,從而告知XST?Logic?Group的邊界。
XST在綜合時,所有的編譯與優(yōu)化都不超越用戶在XCF文件中約定的Logic?Group的邊界,以達(dá)到在細(xì)微修改后僅僅對Logic?Group內(nèi)部進(jìn)行重新綜合的目的。這樣一個邏輯分組HDL源代碼的改變就不會對其他邏輯分組造成影響。
?
對于VHDL來說,XST可以自動檢測出哪一個邏輯分組的內(nèi)容發(fā)生了改變。但對于Verilog來說,必須應(yīng)用“resynthesize”屬性。例如下面就是一個邏輯分組A的Verilog源代碼發(fā)生細(xì)微的改變時的XCF文件范例。
MODEL?"top"?incremental_synthesis?=?yes;? //對top使能增量設(shè)計
MODEL?"A"?incremental_synthesis?=?yes; //對A使能增量設(shè)計
MODEL?"B"?incremental_synthesis?=?yes; //對B使能增量設(shè)計
MODEL?"C"?incremental_synthesis?=?yes; //對C使能增量設(shè)計
MODEL?"top"?resynthesize?=?no; //通知綜合工具哪個模塊發(fā)生改變
MODEL?"A"?resynthesize?=?yes; //no為未改變,yes為已改變
MODEL?"B"?resynthesize?=?no;
MODEL?"C"?resynthesize=?no;
對于Verilog設(shè)計工程,當(dāng)某一邏輯分組發(fā)生改變時,要為其附加相應(yīng)的綜合約束,才能實現(xiàn)增量綜合。
另外需要注意的問題是,增量綜合是在保留結(jié)構(gòu)層次模式(Keep?Hierarchy)下完成的,在進(jìn)行增量綜合時,在“Processes?for?Source”中選擇“Synthesize-XST”,單擊右鍵,設(shè)置綜合屬性如圖6.30所示。
如圖6.30所示,要完成增量綜合,要完成兩種設(shè)置,選擇“Keep?Hierarchy”設(shè)置為YES或Soft,選擇“Synthesis?Constraints?File”設(shè)置綜合約束文件的路徑。
增量綜合后,需要檢查綜合報告。
圖6.30??增量綜合屬性設(shè)置對話框
?
3.創(chuàng)建區(qū)域分組約束
創(chuàng)建區(qū)域分組約束是增量設(shè)計中最重要的一步。區(qū)域分組約束做得不好會增加綜合、布局布線耗時,甚至有可能導(dǎo)致布局布線無法完成。區(qū)域分組約束的創(chuàng)建是利用ISE下的PACE工具,在PACE下完成區(qū)域分組約束后,ISE會自動將其寫入UCF文件中。
為增量設(shè)計創(chuàng)建合理的區(qū)域分組約束要遵循以下原則。
·??所有I/O引腳位置必須鎖定。
·??將與I/O端口聯(lián)系密切的區(qū)域分組布置在相應(yīng)I/O端口的附近。
·??區(qū)域分組約束的范圍不應(yīng)該重疊。
·??盡量保證每個區(qū)域的資源利用率基本一致,避免出現(xiàn)某一區(qū)域利用率達(dá)到99%,而另一區(qū)域的利用率只有10%的情況。
·??如果一個區(qū)域分組中包含F(xiàn)PGA的多種資源,如:Slice、Block?RAM、TBUF、Multipliers等,這時很有必要將不同的資源設(shè)置在不同的區(qū)域,然后將幾個不同位置區(qū)域拼合為一個區(qū)域分組??梢允褂肞ACE、Floorplanner等工具完成,也可以在約束文件中使用如下約束:
INST?Logic_Group_A?AREA_GROUP?=?AG_Logic_Group_A?; //AREA分組
AREA_GROUP?"AG_Logic_Group_A"?RANGE?=?SLICE_X0Y20:SLICE_X20Y30?;//SLICE約束
AREA_GROUP?"AG_Logic_Group_A"?RANGE?=?RAMB16_X0Y2:RAMB16_X0Y2?;//RAM約束
AREA_GROUP?"AG_Logic_Group_A"?RANGE?=?MULT18X18_X0Y1:MULT18X18_X0Y1;//MULT約束
AREA_GROUP?"AG_Logic_Group_A"?RANGE?=?TBUF_X0Y0:TBUF_X1Y0; ?//TBUF約束
4.增量實現(xiàn)(Incremental?Implement)
第3步的創(chuàng)建區(qū)域分組約束也可以作為增量實現(xiàn)的內(nèi)容,增量實現(xiàn)的步驟如下。
(1)設(shè)置區(qū)域分組約束。
(2)映射、布局布線得到初始指引文件。
(3)下載調(diào)試,需要修改時,對細(xì)微細(xì)節(jié)進(jìn)行修改,然后實現(xiàn)增量綜合。
(4)增量綜合后在初始指引文件下進(jìn)行第二次映射與布局布線。
(5)下載調(diào)試,如仍有問題,重復(fù)步驟(3)~步驟(5),直到符合設(shè)計要求為止。
在增量實現(xiàn)過程中,必須要對布局布線的屬性進(jìn)行相關(guān)的設(shè)置。首先應(yīng)該使能增量設(shè)計,具體設(shè)置如圖6.31所示。在“Processes?for?Source”中選擇“Implement?Design”,單擊右鍵,出現(xiàn)屬性對話框。選擇“Incremental?Design?Properties”,然后選擇“Enable?Incremental?Design?Flow”,使能增量設(shè)計。
圖6.31??項目管理器中啟動增量設(shè)計功能對話框
在增量設(shè)計中,如果是用Synplify/Synplify?Pro等第三方綜合工具,那么需要由綜合工具生成向?qū)募笇?dǎo)實現(xiàn)工具進(jìn)行實現(xiàn)流程。選擇如圖6.31中的“Run?Guided?Incremental?Design?Flow”選項,表示將由指定的向?qū)募碇笇?dǎo)實現(xiàn)工具進(jìn)行實現(xiàn)流程。
向?qū)募商峁㎝ap.ncd文件和Par.ncd文件。其中,Map.ncd文件包含了slices、IOBs等映射信息。Par.ncd文件包含了布局和布線信息。實現(xiàn)工具根據(jù)這兩個文件的信息來確定沒有改變的模塊和已經(jīng)改變的模塊,把沒有改變的模塊放進(jìn)向?qū)募涗浀纳洗尉C合實現(xiàn)的位置。對布線器來說,該布線資源同時也將被保留,其布線關(guān)系也不會改變。
使用向?qū)募獙崿F(xiàn)具的屬性做部分修改。將“Map?Guide?Mode”和“PAR?Guide?Mode”分別改成增量型(Incremental),如圖6.32和圖6.33所示。
圖6.32??使用指引文件指引映射? 圖6.33??使用指引文件引導(dǎo)布局布線
?
進(jìn)行了上述設(shè)置后,需要指定映射和布局布線的指引文件。
整個增量實現(xiàn)步驟完成后,需要檢查映射報告(擴(kuò)展名為map)和布局布線報告(擴(kuò)展名為par),看是否真的完成了增量設(shè)計。
6.6.3??小結(jié)
本節(jié)對增量式設(shè)計方法的概念以及設(shè)計流程做了全面的介紹,希望讀者能夠掌握增量設(shè)計的基本流程,并應(yīng)用到自己的工程設(shè)計當(dāng)中。在6.9節(jié)中會通過一個具體的實例來說明增量設(shè)計的整個流程。
增量設(shè)計在大型的工程設(shè)計中是很有用的,可以為設(shè)計節(jié)約大量的時間。增量設(shè)計中一個難點(diǎn)在于分組區(qū)域約束的設(shè)置,這不但需要對整個工程有全面的把握而且要求對于FPGA器件的內(nèi)部結(jié)構(gòu)有一定的了解,這需要在實踐中不斷積累經(jīng)驗。