1. 程式人生 > >Quartus II LogicLock及增量編譯Design Partition

Quartus II LogicLock及增量編譯Design Partition

首先,得先看看QuartusII的編譯過程是個怎麼樣的,要了解這個過程很簡單,看看下面這張圖,誰都不陌生:

增量編譯04.jpg

當我們點全編譯之後,下面的幾個過程就會一個一個打上勾,而我們編譯的過程也就是和這個執行過程是一致的:先是分析綜合,再是佈局佈線,然後是彙編(這裡不是指組合語言的彙編,而是說將佈局佈線後的“電路”彙編成可下載到晶片內的“程式”),還有時序分析以及生成網表。

我們仔細看它編譯的過程會發現其中耗時最多的是分析綜合和佈局佈線(這點從上圖右側的時間標註也能看出來),所以我們想提高編譯速度也應該從這點入手。

Quartus也有相關的自動增量編譯的設定,如下圖:

增量編譯05.jpg

第一個是多核處理器的設定,這樣可以提高整體的速度;第二個則是採用Smart Compilation,智慧編譯方式,它可以完成的功能——如果設計原始檔沒有改動,那Quartus將不再進行分析綜合,而直接進入佈局佈線階段。另外,還有一個設定也可以勾選上:

增量編譯06.jpg

Rapid recompile,即如果設計沒有修改那不進行重新編譯。

從編譯過程,我們再來看看我們的設計流程:

增量編譯07.jpg

可以發現,其實設計過程和編譯過程是一樣的。而增量編譯的原理就是,減少每次編譯裡我們設計已經完成的部分,進而不需要再重複設計者認為已經完成的工作。說得再直白一點:我們設計者手動得將整個工程分成N個子模組(此處指的是邏輯模組),並設定各個模組的狀態(已經完成了,不需要更改了,編譯時就採用上一次的結果),這樣編譯器在分析綜合的時候便可以對那些不需修改的部分直接採用上次的結果。佈局佈線的時候也是一樣的,如果該子模組不需要更改了就採用上次的結果,如需更改再重新進行佈局佈線,只不過佈局佈線的過程要相比分析綜合複雜一些。

而上面提到的將整個工程手動分成N個模組,我們就要用到Quartus提供的兩個高階工具——Design Partitions和LogicLock Regions。

本篇,來仔細看看怎麼使用增量編譯。

增量編譯主要用到的兩個工具——Design Partition和LogicLock。

增量編譯09.jpg

增量編譯10.jpg

首先要提出一個概念,網上大多對增量編譯的簡要說明是:採用LogicLock進行增量編譯。這是錯誤的看法!LogicLock並不是增量編譯的一部分,只是在增量編譯過程中建議使用LogicLock!

另外,上一篇裡面提到關於增量編譯原理個人的理解:將整個工程分成多個“邏輯區域”,然後每次編譯中通過設定各個區域的網表型別來決定本次編譯是否對該區域重新執行,“增量編譯”是針對整個工程在設計過程中後一次編譯與前一次編譯的一個“增量”過程,其實Altera的官方名稱應該叫——“漸進式編譯模式”。

那從對原理的理解就可發現,其實我們只要用到Design Partition就可以完成“增量編譯”了。下面簡單介紹如何使用Design Partition工具:

首先,得對整個工程進行一次全編譯(也可不編譯,只進行頂層模組的分析,如下圖有左邊標出的小圖示則可點開分析頂層模組下的子模組),經Analysis過程Quartus可自動分析出整個工程頂層模組下含有哪些子模組;

增量編譯12.jpg

然後,便通過Design Partition對子模組進行“邏輯分割槽”。一般情況下,我們可以直接將上一步中分析出的子模組設定成“邏輯區域”;

增量編譯11.jpg

設定好了以後開啟Design Partition Window可看到如下圖:

增量編譯13.jpg

它的結構圖與Project Navigator裡的很像,有一個TOP模組,下面還有我們設定的各個小區域。表中的各列引數則是對各區域形式的一個設定,其中最關鍵的一個設定是Netlist Type,它有四個可選值——Source File,Post-Synthesis,Post-fit,Empty(如上圖中所標1,2,3,4,上圖是為了將各Type全面的顯現出來,而不是最終設定)。它們各自的含義是:

Source File:如果原始碼未修改,則僅不重新Analysis,還需進行Synthesis和Fitter;

Post-Synthesis:如果原始碼未修改,不需重新Analysis、Synthesis,結果只進行Fitter;

Post-Fit:如果原始碼未修改,保留前次Analysis、Synthesis、Fitter結果;

Empty:標誌為空分割槽,編譯時將忽略此分割槽。

這樣我們就很明白了,其實要想達到“增量編譯”的目的,只需將各個子模組設定在Design Partition裡,並將未進行修改的各個模組設定成Post-fit,而修改過的模組設定為Source File。需要注意的是,頂層模組TOP的狀態也需設定為Post-fit。

大家可以試試效果,個人試驗的效果很顯著……原來編譯一次需5分多鐘,這樣的方法如果只改變一個分割槽的內容,只需1分多鐘。

我們先來搞清楚兩個概念——邏輯分割槽”和“物理分割槽

前面所講到的Design Partition只是將設計進行“邏輯分割槽”,直白點說就是將我們的設計分成N個小的模組,每個模組有著單獨的邏輯和功能,它告訴編譯器,這部分邏輯是一個分割槽A,那部分邏輯是另一個分割槽B,在進行這樣的分割槽之後,編譯器在整個工程的綜合、佈局佈線上面並不會有什麼太大的變化,這個邏輯上的分割槽只是用來讓使用者清楚,哪部分邏輯是分割槽A的,哪部分邏輯是分割槽B的。之後使用者就可通過設定A、B分割槽的屬性型別來告訴編譯器,哪部分已經不需要重新綜合、佈局佈線了;哪部分已經修改了,需要重新進行綜合等等。

而我們來看看LogicLock的作用,是對設計進行“物理分割槽”,更準確的說,它是對目標器件進行“物理分割槽”,然後將邏輯上的功能模組分配到一定的分割槽內。也就是說,我們先對目標器件進行物理區域劃分,把它分成幾個“地盤”,然後選擇一個邏輯功能模組分配到某個“地盤”裡,告訴編譯器,以後這部分邏輯功能就只能在這個“地盤”裡面佈局佈線了。同樣的,使用者可以對各個模組進行屬性上的設定,告訴編譯器以什麼樣的形式在“地盤”裡面進行佈局佈線。

下面簡單介紹下LogicLock的使用,我們前面已經用Design Partition進行了“邏輯分割槽”,我們可以用同樣的方法,在設計的樹形結構裡面右鍵,然後如下圖:

增量編譯15.jpg

把各個子模組加入到LogicLock Region裡面之後如下圖:

增量編譯14.jpg

裡面有兩個主要的引數,Size和State:Size有兩個選項,Auto、Fixed;而State也有兩個選項,Locked、Floating。但是並不是有著四個組合,其實只有著下面三種狀態:

增量編譯16.jpg

第一種,Auto+Floating:由編譯器自動選擇區域大小和位置;(在Chip Planner裡面由虛線顯示)

第二種,Fixed+Floating:由編譯器選擇位置,但由使用者設定區域大小;(在Chip Planner裡面由短實線顯示)

第三種,Fixed+Locked:區域大小和位置都由使用者來設定。(在Chip Planner裡面由實線顯示)

那我們來說說LogicLock在增量編譯裡面有什麼作用呢?還是需要強調一下,增量編譯不是一定非要用到LogicLock,但Quartus推薦在增量編譯時使用LogicLock!為什麼呢?因為它可以讓增量編譯的思想貫徹得更徹底。

我們想想在前面用Design Partition時出現的一種情況:改動後的模組邏輯功能上變化比較大,影響了其它“邏輯分割槽”的佈局佈線,這樣未改動部分也需要進行重新編譯了。但如果這個時候使用的是LogicLock,由於每個邏輯功能模組都分配了一定的“物理區域”,改動後的模組再怎麼變也是在它自己的“地盤”裡,不會影響到別的“地盤”的佈局佈線。

但LogicLock也會帶來一定的負面影響,最直接的,一般情況下,時序分析後的Fmax都要更低一些。這是為什麼呢?其實想想也能知道,如果沒有使用LogicLock,編譯器可以自動從全域性出發去做出做大的優化,而我們人為地進行了物理分割槽限定,那即使可能每個小模組做到了很好的優化,但是由於各個區域之間的佈局佈線受到了限制,那自然會有所影響。但也不能如此絕對地斷定,如果在佔用資源很龐大的情況下,使用這種方法還能帶來意想不到的效果