Design Compiler指南——設計綜合過程

????????在前面一章介紹完施加約束之后,接下來要做的工作就是將設計進行綜合編譯(compile),本文我們將主要討論綜合編譯的過程。主要分為這樣幾個部分:

  • 優化的三個階段及其特點
  • 編譯的策略
  • 編譯層次化的設計

一、優化的三個階段

????????這一節我們介紹Design Compiler進行優化的三個階段:結構級、邏輯級以及門級,在不同的階段,DC運用的方法和優化余地是不一樣的,我們將對這幾個階段的特點和優化方法進行一個介紹,這里一起歸納一下,希望能加深認識。

????????上圖是這三個階段的關系圖,可以看到,結構級屬于最高的抽象層次,當讀入Verilog代碼或者沒有經過映射的db文件后,DC的優化從這個階段層次開始,可以說,結構級是優化的最高層次,所以對DC來說,這個層次的綜合可以稱為高層次綜合(High-Level Synthesis)。結構層的下一個優化階段是邏輯級階段,也是讀入映射過的db文件的DC的初始優化階段。再往下一個階段是門級階段,也是優化的最后階段,這里所要作的工作主要就是GTECH到工藝庫的映射。

1、結構級優化

????????因為結構級是優化過程中層次最高的一級,因此它也是DC可以采用的優化方法最多的一級,它的主要優化方法如下圖所示

1)DesignWare選擇

????????DW選擇是結構級優化的一個很主要的特點,在這個階段DC能夠根據設計者施加的時序或者面積的約束在DW的不同實現方式中找到它認為最佳的實現方案。比如加法器的實現方式一共有如下幾種

????????其中DW Foundation需要有專門的license,而且使用之前還要設置綜合庫(synthetic library)。?

2)共享子表達式(Sub-Expressions)

????????這里的子表達式主要是指數學表達式,比如下面這個例子,如果按照原來的語句綜合,會包含6各加法器,但是如果表達式之間的公共項提取出來,便可以大大的減小面積,如下圖

????????如果要直接綜合出共享后的電路,可以在編寫RTL代碼的時候強制指定共享項:

3)資源共享(Resource Sharing)

????????資源共享的原理與共享子表達式類似,只不過這里指的所謂資源是一些HDL的運算符和表達式,比如加(+)、減(-)、乘(*)、除(/)以及大于(>)、大于等于(>=)、小于(<)、小于等于(<=)。比如給定一個語句

????????DC會根據具體的約束條件綜合出最符合要求的結構來。

4)運算符排序(Operator Reordering)

????????對于下面這個表達式Z <= A + B + C + D(輸出Z是施加了一定時序約束),DC最初是按照從左至右的順序計算的,也就是說它最初的排序如下

????????如果幾個輸入信號到達的時間相同,DC會通過運算符排序優化成下圖的平衡的結構,減小延時:

????????如果A信號較遲到達,則綜合出的電路結構會如下 :

2、邏輯級優化

????????在經過結構級優化之后,電路被轉化成了工藝無關的GTECH庫的形式,這級也稱為邏輯級,對于邏輯級優化來說,只有一個方法,那就是——結構化 (structure)或者扁平化(flatten)。

1)結構化(structure)

????????結構化是DC在邏輯級的默認的優化方法,它是指:使用電路的一些中間項構成一個多級的電路結構。如下圖的電路一共有三級邏輯,下一級的輸入是上一級的輸出,使用這種優化方法一般情況下能綜合出兼顧時序和面積的電路來。

????????結構化電路的典型是奇偶校驗電路。

2)扁平化(flatten)

????????扁平化是將所有的組合邏輯打平成乘積項和(SOP)的兩級結構,類似與可編程陣列邏輯(PAL)。使用這種結構的特點由于沒有利用中間項,綜合后電路面積將會變得很大,但是卻不一定能取得較好的時序。

????????扁平化結構的電路和設置扁平化的DC命令如下所示:

dc_shell > set_flatten true -effort low | medium | high

綜合結構化和扁平化的特點,可以歸納如下:

????????由于DC默認是用結構化的方式綜合邏輯級電路,而且這種方式可以得到兼顧時序和面積的結果,因此我們可以先用這種(結構化)方式優化。在優化后的電路中找出關鍵路徑,看看關鍵路徑上有沒有符合使用SOP電路的模塊,再將這些方便使用SOP的模塊set_flatten,以便取得最佳的效果。?

3、門級優化

????????門級優化是優化的最后階段,它所要完成的任務就是將GTECH的電路映射到最終的工藝庫中,并且保證映射后的電路不違反設計規則(Design Rule)。

1)工藝映射

????????工藝映射包括組合邏輯映射時序邏輯映射。組合邏輯映射是指DC使用工藝庫中的各種門替換GTECH單元,并選擇能實現相同邏輯的符合時序及面積要求的單元。

????????時序邏輯映射的方法和組合邏輯相類似,也是出于速度和面積的考慮,盡量使用復雜的時序單元吸收一部分組合邏輯。?

?

2)設計規則檢查(DRC)

????????對于工藝庫的單元而言,Foundry都指定了每個單元的工作條件的限制,比如最大電容(max_capacitance)等等,這些限制也可以稱為設計規則(Design Rule),在設計規則限定的范圍內,Foundry提供的參數才有實際的意義。比如一個單元允許的最大電容為5pf,而實際工作電路中出現的電容值為10pf,那么這時,便違反了設計規則,單元的參數也就不能確保是準確的了。

????????因此,DC在作門級優化的時候,在映射的過程中也會檢查電路的設計規則,一般的做法是在單元中插入buffer增加驅動能力,或者將小驅動的單元替換為大單元。設計規則檢查分為兩個過程——DRC I 和DRC II 。

????????DRC I是指Design Compiler在不影響電路的時序和面積的前提下修正違反規則的一些單元,如果在這個前提下不能完全修正,則要進行下一步的檢查,即DRC II,這一步的修正必然是以犧牲一部分時序和面積為代價的。

二、編譯策略

????????編譯過程是指設計經過三個階段的優化,最終形成門級網表的過程,在這一節里,我們主要就編譯的策略,它包含如下幾方面的內容——

  • 中斷編譯的方法
  • 從報告中檢查時序,調整策略
  • 修正保持時間違反(Hold time violations)

1、中斷編譯的方法

????????在DC-Tcl的界面下,當我們鍵入compile命令時,DC就開始了編譯,也就是優化的過程。優化是在設計規則的條件下,運用不同的算法,綜合最終出滿足時序和面積的電路。優化首先是時序驅動(timing-driven)的一個過程,其次再是面積。如果找到了一個滿足時序和面積等約束的電路,編譯將會停止;如果通過種種編譯仍不能滿足時序,編譯也會停止下來;另外,我們也可以人為的中斷編譯。

????????人為中斷編譯的方法是鍵入Ctrl-C,經過一段時間的等待后(有可能時間會很長),優化過程暫停,并彈出如下菜單:

????????這里有四個選項,設計者可以根據情況作出選擇。

????????DC在編譯的過程中,會自動打印出一個報表,報告編譯的總時間,設計的面積,關鍵路徑的時序違反和總共時序違反情況,我們可以根據需要更改打印的列項目:

2、分析報告,調整策略

????????一般情況下,我們先作一個默認的編譯,這樣一般可以取得既快又準確的結果,然后在編譯完成后使用一些報告時序的命令,并分析它們的輸出結果,使用的命令主要有

????????從這些報告中,我們可以看到電路中是否有違反的約束,如果有,那么它是什么類型,還有電路中的最大負裕量(worst negative slack)是多少,等等。下面我們就幾個常見的約束違反情況,談談糾正它的綜合策略

1)較大的時序違例

? ? ? ? 以下圖為例

????????從report_constraint –all這個命令的報告可以看出,需要到達的時間是1.20ns,而實際到達為2.84ns,違反了1.64ns。之所以判斷它是一個較大時序違反的情況,并不是因為1.64這個絕對值很大,而是相比較需要時間而言,1.64是一個較大的值。一般而言,如果電路中的最大負裕量(簡稱WNS)所占時鐘周期的15%以上的話,可以認為電路存在較大的時序違反

??????確認存在較大時序違反之后,下一步就是找出原因,消除違反情況。可供參考的步驟有下面幾種:

  1. 檢查約束條件,看是否有疏漏或錯誤
  2. 檢查模塊劃分,看組合邏輯是否穿過多個模塊
  3. 重新編譯優化后的網表
  4. 修改RTL代碼???

重新編譯(Re-Compile)

????????當重新讀入映射后的網表進行重新編譯時,DC會自動將門級的網表重新返回到GTECH的結構,相當于邏輯級。然后分別進行邏輯級和門級的優化,但是同時也可以進行DesignWare的替換。

????????如果設計者僅僅將映射后的網表拿來再做一次compile,編譯后的結果并不會不一定會比原來的好,無非把以前做過的優化再跑一遍。因此,重新編譯之前會改變一些參數,如——改變設計約束、改變set_structure和set_flatten參數以及改變編譯的map_effort

改變map_effort重新編譯

????????對設計進行編譯的時候,有三種編譯級別可以選擇,它們分別時低級、中級和高級。

dc_shell > compile?-map_effort low | medium | high

????????不同的級別編譯要求的編譯時間和編譯結果都各不相同,compile –map_effort low編譯時間最短,但是結果不一定好,它一般用于設計預估(Design Exploration),不用在重新編譯環節。
compile –map_effort medium是DC默認的編譯級別,大多能在一定的時間內得到較為滿意的結果。這也是我們推薦的初始編譯級別。

????????compile –map_effort high 編譯的過程中會使用前面的級別中沒有的算法,因此它所要求的時間是最多的,結果也是相對最好的。這種級別一般用在重新編譯的階段。

修改RTL代碼

????????修改源代碼所能取得的效果是最直接的,同時也是代價最高的。修改代碼后,DC會從最上層的結構級開始優化,前面也討論過,越上層次的優化方法越多。所以通常這樣得到的結果也越滿意。但是,修改代碼也不一定放之四海皆準的方法,因此并不是所有的設計我們都能獲得源代碼,同時也不是可以隨便修改的。

2)較小的時序違例

? ? ? ? 以下圖為例

????????從上圖看出,相比較1.20的允許路徑延時,0.10的負最大裕量(WNS)是比較小的(小于15%),而且已經認定了約束和模塊劃分都是正確的,那么應該怎樣修復這個錯誤呢?

????????這里主要講一下Incremental Mapping:

dc_shell > compile?-incremental_mapping

????????這個開關告訴DC,在重新編譯的時候不需要把網表返回到GTECH結構,因此也不需要作邏輯級優化,速度也較一般的編譯更省時間。這里DC所要作的是進行門級單元的替換,即在不違反設計規則的情況下用延時小的單元替換延時較大的單元。另外,如果讀入的是db格式的網表,在這個階段也可以進行DesignWare的替換。

????????如果要同時優化多條路徑,需要使用另外一個命令——set_critical_range。這個命令設置的critical_range是以WNS的值為基準的,優化的是和這個值的絕對值差設置值的那些路徑。因此,如果設置值為0,那么就僅僅優化一條關鍵路徑。

dc_shell > set_critical_range 2 [current_design]

3)設計規則違反

????????有些時候的時序違反是由于設計規則違反引起的,比如說一個單元的扇出(fanout)過大,導致它的transition time的時間迅速增加。對于這種情況,我們可以通過

dc_shell > report_net -connections -verbose

dc_shell > report_timing -net

????????兩個命令審查連線的連接和負載情況。

????????要修正設計規則的錯誤,可以使用一個編譯的開關:

dc_shell > compile -only_design_rule

????????如下面這個例子,為了滿足最大電容的規則,在A端口的內部加上了一個buffer,用于緩沖N路徑對A的負載。

3、修正保持時間違例

????????一個時序電路要想正常工作,除了必須滿足建立時間要求之外,也需要滿足保持時間要求。雖然保持時間檢查和建立時間檢查是同樣重要的,但是我們在實際綜合的過程中卻不是把它們同時考慮,而是更多的把保持時間的檢查放到布局后。這是因為

  • 時鐘偏移必須要到布局完成后才能得到準確值
  • 修正保持時間的通常做法是插入buffer,而這可能會增加建立時間違反的可能性,并且增大了組合電路的面積
  • 保持時間檢查用的一般都是電路工作的最佳條件,而在這個條件下,連線延時往往是被忽略的,連線延時也是必須在布局后才準確。

????????如果確定要同時作建立和保持時間檢查,那么在施加電路約束的時候要加入相應的開關,如:

????????以及設置各自的工藝庫——?

????????

????????默認情況下,DC不修正保持時間的違反。如果確定要作修正,需要先設置一個變量再作檢查 :

dc_shell > set_fix_hold [all clocks]

dc_shell > compile -only_design_rule

????????加上only_design_rule的開關后,編譯過程中僅僅更換單元大小,并增加buffer,以便修正設計規則違反和保持時間違反。

三、層次化設計的編譯

????????一個層次化設計的編譯過程包含兩個階段:1、將所有的子模塊映射到門級,2、優化。

??????????在一個層次化的設計中,我們可能會遇到下面這種情況

??????

????????上圖中,被綜合的模塊中D_design中含有三個子模塊U1、U2和U3,其中U1和U3都是由模塊Ades例化而來,這里的Ades稱為多次例化的模塊。對于這樣一個設計,在compile之前使用check_design作檢查的時候會報一個warning,即設計中存在多次例化的模塊(multiple instantiations),如果在這種情況下,我們不考慮多次例化的模塊(Ades),那么在繼續的compile時候程序會終止退出。因此,必須對它進行處理,這里我們介紹兩種方法——uniquify和compile + dont_touch。?

1、uniquify

????????使用uniquify,DC會對每個例化的模塊作一份拷貝,然后對它們分別取一個名字,即把不同的例化模塊當作不同的兩個模塊處理。

????????注意看上圖,U1和U3兩個模塊的設計名分別由原來的Ades變成了Ades_0和Ades_1,因此在編譯時,DC會將它們當作兩個不同的模塊,這樣就可以根據它們不同的周圍環境作優化。

????????使用uniquify的具體實現方法如下

?dc_shell > uniquify

dc_shell > compile

2、compile + dont_touch

????????這種方法先將多次例化的模塊作單獨的約束和編譯,然后在整合到上一級模塊的過程中將它的屬性設置為dont_touch,再編譯。

????????上圖中,U1和U3兩個模塊的設計名都沒有變化,只是在編譯D_design之前先將Ades編譯一次。這樣U1和U3實際上是一模一樣的模塊。

????????compile+dont_touch的實現方法如下

????????這里的約束文件有兩個,一個是Ades的Aconstraints.tcl,另一個是D_design的Dconstraints.tcl,并且在source后一個約束文件之前要對編譯過的Ades設置成dont_touch。
在設置了dont_touch屬性之后,編譯D_design的時候就會忽略Ades,這樣有好處也有壞處,好處是可以保護模塊不被修改,但是這樣同時也限制了DC對U1和U3的進一步的優化。?

3、uniquify Vs compile + dont_touch

????????通過對上述兩種方法的介紹,我們不難看出它們各自的優缺點——

????????compile+dont_touch由于只需要對多次例化的模塊編譯一次,因此可以減少整個設計的編譯時間,也可以減少內存的使用量。在多次例化的模塊很復雜并且工作站的硬件條件有限的情況下,使用這種方法的優越性的比較明顯的。還有,如果這個Ades是一個第三方提供的硬核(hard-core),那么我們也只能使用這種方法。

????????使用這種方法的缺陷也是顯而易見的:由于頂層模塊在編譯的時候Ades設置了dont_touch,這就妨礙了DC針對Ades的各個實例周圍環境的不同的進一步優化,從而使得結果不能真實的反映各個實例周圍的環境變化。

????????uniquify由于把各個多例化模塊作為獨立的模塊來看,因此DC可以分別針對它們作出更好的優化,從而得到的結果也是比較理想的。缺點就是編譯的時間稍微較長,但是對于一些不大的模塊來說,這些是可以忽略的。????????

????????正因為uniquify可以綜合出更好的結果,所以如果一般推薦使用uniquify解決多例化模塊的綜合問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253638.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

How to find Material based on Sales Organization and Distribution Channel

Fetch data from Database View /BEV1/RBEA_V Fields: VKORG - Sales Organization VTWEG - Distribution Channel MATNR - Material Number 轉載于:https://www.cnblogs.com/JulietLV/p/7436028.html

iOS開發 iOS10兼容訪問http

添加NSAppTransportSecurity的字典會自動變成 AppTransportSecurity再添加 allow Arbitary Loads Boolean YES轉載于:https://www.cnblogs.com/diweinan/p/6233052.html

django 利用PIL 保存圖片

在使用django時不知道怎么保存圖片&#xff0c;又不想用它的form &#xff0c;在網上找了許久&#xff0c;終于找到個解決方案&#xff0c;利用PIL.image 將POST上來的圖片保存到media目錄下&#xff0c;然后再修改models from PIL import Imagescreen_name request.POST.get(…

圖像轉灰度圖

MyYuanLaiPic imread(e:/image/matlab/darkMouse.jpg);%讀取RGB格式的圖像 MyFirstGrayPic rgb2gray(MyYuanLaiPic);%用已有的函數進行RGB到灰度圖像的轉換 [rows , cols , colors] size(MyYuanLaiPic);%得到原來圖像的矩陣的參數 MidGrayPic zeros(rows , cols);…

Design Compiler指南——后綜合過程

本文我們著重討論使用Design Compiler綜合大型設計時要注意的一些問題&#xff0c;比如怎樣調整綜合方法&#xff0c;出現約束違反后怎樣修正&#xff0c;怎樣給不同的子模塊作時序和負載預算&#xff0c;以及給整個設計在具體綜合之前先作一個預估(Design Exploration)等等。 …

web worker原理 SSE原理

第一部分 什么是 web worker&#xff1f; 我們一直強調JavaScript是單線程的&#xff0c;但是web worker的出現使得JavaScript可以在多線程上跑&#xff0c;只是web worker本身適合用于一些復雜的、耗費cpu的運算&#xff0c;不能操作window、document、parent對象&#xff0c…

如何尋回xp盤符丟失的數據

分區丟失是比較常見的數據恢復案例&#xff0c;需要注意&#xff0c;分區丟失后不要再重建新的分區。保護好資料丟失現場&#xff0c;可以最大程度的恢復出資料。具體的恢復方法看正文了解。 工具/軟件&#xff1a;星空數據恢復軟件 步驟1&#xff1a;先百度搜索并下載程序打開…

afx_msg函數意思

應用程序框架產生的消息映射函數 例如&#xff1a;afx_msg void OnBnClickedButton1(); 其中 afx_msg為消息標志&#xff0c;它向系統聲明&#xff1a;有消息映射到函數實現體&#xff1b; 而在map宏定義中&#xff0c;就有具體消息和此函數的映射定義&#xff08;可以是自定義…

文件得編碼和文件名的編碼是不一樣的

1.新知識&#xff0c;通過文件后墜名的編碼判斷文件類型&#xff0c;可以有效的防止腳本文件偽裝為正常得文件。 2.攔截器和過濾器。 過濾器只能夠在http請求和回復的時候進行處理。 但是攔截器可以在很多地方攔截&#xff0c;例如程序拋異常等都可以捕獲的到。還可以進行權限得…

Visual computing——概述

Visual Computing&#xff08;視覺計算&#xff09;是所有處理二維圖像和三維模型的計算機科學學科的總稱&#xff0c;即計算機圖形學、圖像處理、可視化、計算機視覺、虛擬和增強現實、視頻處理&#xff0c;但也包括模式識別、人機交互、機器學習等方面。核心挑戰是視覺信息&a…

推薦!手把手教你使用Git

一&#xff1a;Git是什么&#xff1f; Git是目前世界上最先進的分布式版本控制系統。 二&#xff1a;SVN與Git的最主要的區別&#xff1f; SVN是集中式版本控制系統&#xff0c;版本庫是集中放在中央服務器的&#xff0c;而干活的時候&#xff0c;用的都是自己的電腦&#xff0…

I2C協議學習

I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半導體&#xff08;現被NXP收購&#xff09;開發的兩線式串行總線&#xff0c;常用于微控制器與外設之間的連接。 一、概述 以下是 I2C 總線的一些特性&#xff1a; 只需要兩條總線&#xff1b;一條串行數據線 (SDA) 和…

ajax的簡單介紹

響應主體&#xff0c;就是服務器給我們返回的結果內容&#xff08;瀏覽器里的responsive&#xff09; 請求主體&#xff0c;是我們給服務器的數據 輸入域名發起一次請求&#xff0c;得到的可能是標簽&#xff0c;標簽可能還要在發一次請求 post怎么發請求&#xff1a;form表單 …

DM365 color space

YUV的幾種格式 420P&#xff1a;420P數據的存放方式一般是先存放Y&#xff0c;然后存放U&#xff0c;最后存放V的數據&#xff0c;每一個像素使用12bits(1.5BYTE)保存。 422P&#xff1a;422P數據的存放方式也是先存放Y&#xff0c;然后存放U&#xff0c;最后存放V的數據&…

JavaScript 標準參考教程-閱讀總結(三)

1、DOM模型 DOM 是 JavaScript 操作網頁的接口&#xff0c;全稱為“文檔對象模型”&#xff08;Document Object Model&#xff09;。它的作用是將網頁轉為一個 JavaScript 對象&#xff0c;從而可以用腳本進行各種操作&#xff08;比如增刪內容&#xff09;。 1&#xff09;do…

P1136 迎接儀式

P1136 迎接儀式 題目描述 LHX教主要來X市指導OI學習工作了。為了迎接教主&#xff0c;在一條道路旁&#xff0c;一群Orz教主er穿著文化衫站在道路兩旁迎接教主&#xff0c;每件文化衫上都印著大字。一旁的Orzer依次擺出“歡迎歡迎歡迎歡迎……”的大字&#xff0c;但是領隊突然…

云服務器 VNC 遠程連接

此服務器買來是為了搭建IC EDA云的&#xff0c;因此選用的是centOS 6的環境&#xff0c;對各EDA軟件兼容較好。本人手頭拮據&#xff0c;因此買的是騰訊云活動期間的云服務器&#xff0c;只能說夠用吧。 一、桌面安裝 在云服務器控制臺登陸上遠程主機&#xff0c;依次執行下列…

Python自動化測試框架有哪些?

作者 | KITTY GUPTA 譯者 | 張健欣 令開發者萬分高興的是&#xff0c;開發自己的測試框架的日子終于結束了。以前&#xff0c;開發團隊接手一個項目并開始開發時&#xff0c;除了項目模塊的實際開發之外&#xff0c;他們不得不為這個項目構建一個自動化測試框架。一個測試框架應…

面試題——4種數組去重的方法

數組去重或者其衍生作為筆試題或者機試題出現的幾率也是很大的&#xff0c;寫出的方法越多&#xff0c;則讓面試官覺得你思維越開闊&#xff0c;那么成功的幾率當然就大了。 廢話不多說&#xff0c;下面來說說下面我整理的4中數組去重的方法 方法一&#xff1a; findInArr方法s…

MFc消息映射機制理解

何謂消息、消息處理函數、消息映射&#xff1f;消息簡單的說就是指通過輸入設備向程序發出指令要執行某個操作。具體的某個操作是你的一系列代碼。稱為消息處理函數。在SDK中消息其實非常容易理解&#xff0c;當窗口建立后便會有一個函數&#xff08;窗口處理函數&#xff09;開…