????????預綜合過程是指在綜合過程之前的一些為綜合作準備的步驟,包括Design Compiler的啟動、設置各種庫文件、創建啟動腳本文件、讀入設計文件、DC中的設計對象、各種模塊的劃分以及Verilog的編碼等等。
一、Design Compiler的啟動
? ? ? ? 目前,DC的啟動方式有三種:
? ? ? ? 較為推薦第三種批處理的方式。圖中的命令意思是:使用拓撲模式啟動DC,啟動的同時執行run.tcl腳本文件,并且把啟動過程中顯示在終端的信息記錄到run.log中。|??tee ?-i就是寫進信息的管道命令,將dc_shell -topo -f run.tcl 執行后顯示的信息(輸出結果),流入到run.log文件中。這樣子是為了在DC啟動失敗的時候,通過查看啟動信息,進而排除錯誤。
二、庫文件的設置
????????在Design Compiler的運行過程中需要用到幾種庫文件,他們是工藝庫、鏈接庫、符號庫以及綜合庫,下面對他們一一說明。
? ? ? ? 詳細可見邏輯綜合——工藝庫
1、目標庫(target_library)
? ? ? ?目標庫是綜合后電路網表要最終映射到的庫,讀入的HDL代碼首先由synopsys自帶的GTECH庫轉換成Design Compiler內部交換的格式,然后經過映射到工藝庫和優化生成門級網表。目標庫是由Foundary提供的,一般是.db的格式。這種格式是DC認識的一種內部文件格式,不能由文本方式打開。.db格式可以由文本格式的.lib轉化過來,他們包含的信息是一致的。一個例子如下:
?????????從圖中可以看出,工藝庫中包含了各個門級單元的行為、引腳、面積以及時序信息(有的目標庫還有功耗方面的參數),DC在綜合時就是根據target_library中給出的單元電路的延遲信息來計算路徑的延遲。并根據各個單元延時、面積和驅動能力的不同選擇合適的單元來優化電路。
? ? ? ? 在DC中,使用以下命令來設置目標庫
dc_shell > set target_library my_tech.db
2、鏈接庫(link_library)
????????link_library設置模塊或者單元電路的引用,對于所有DC可能用到的庫,我們都需要在link_library中指定,其中也包括要用到的IP。
????????值得注意的一點是:在link_library的設置中必須包含’*’, 表示DC在引用實例化模塊或者單元電路時首先搜索已經調進DC memory的模塊和單元電路,如果在link library中不包含’*’,DC就不會使用DC memory中已有的模塊,因此,會出現無法匹配的模塊或單元電路的警告信息(unresolved design reference)。
????????另外,設置link_library的時候要注意設置search_path
????????圖中設置了link_library,但是DC在link的時候卻報錯,找不到TOP中引用的DECODE模塊,這說明link_library默認是在運行DC的目錄下尋找相關引用。要使上例的DECODE能被找到,需要設置search_path。? ? ? ?
3、符號庫 (symbol_library)
????????symbol_library是定義了單元電路顯示的Schematic的庫。用戶如果想啟動design_vision來查看、分析電路時需要設置symbol_library。符號庫的后綴是.sdb,如果沒有設置,DC會用默認的符號庫取代。
????????設置符號庫的命令是
dc_shell > set symbol_library my.sdb
4、綜合庫(synthetic_library)
????????在初始化DC的時候,不需要設置標準的DesignWare庫standard.sldb用于實現Verilog描述的運算符,對于擴展的DesignWare,需要在synthetic_library中設置,同時需要在link_library中設置相應的庫以使得在鏈接的時候DC可以搜索到相應運算符的實現。
三、啟動文件.synopsys_dc.setup的設置
????????啟動文件顧名思義,就是DC在啟動的時候首先讀入的文件,DC在啟動的時候,會自動在三個目錄下搜索該文件,對DC的工作環境進行初始化:
- $SYNOPSYS/admin/setup目錄下,DC安裝的標準初始化文件。
- 當前用戶的$HOME目錄下,一般用于設置一些用戶本人使用的變量以及一些個性化設置。
- DC啟動所在的目錄下,一般用于與所在設計相關的設置。
????????其中后面的setup 文件可以覆蓋前面文件中的設置。該文件主要包括庫的設置、工作路徑的設置以及一些常用命令別名的設置等等。
????????由于dcshell的啟動腳本和tcl的腳本語法不一致,所以如果只有一種方式的啟動腳本,那么運行另一種方式的時候會報錯。因此,DC的啟動腳本有一種兼容兩種方式的格式。下面是這種腳本的舉例——
????????它區別與其他啟動腳本的特征是第一行有一個”#”,說明它是dcshell的一個子集,同時兼容兩種方式。文件的第一段設置工藝庫和鏈接庫,第二段設置符號庫和搜索路徑,第三段設置DC命令的別名,這一點與Shell相似。?
四、讀入設計文件????????
????????Design Compiler支持多種硬件描述的格式,.db、.v、.vhd、等等,對于dcsh工作模式來說,讀取不同的文件格式只需要帶上不同的參數,對于TCL的工作模式來說,讀取不同的文件格式需要使用不同的命令。
read –format verilog[db、vhdl etc.] file ????????//dcsh的工作模式
read_db file.db ???????????????????????????????????????????????//TCL工作模式讀取DB格式
read_verilog file.v????????????????????????????????????????????//TCL工作模式讀取verilog格式?
????????Design Compiler可以讀取設計流程中任何一種數據格式,如行為級的描述、RTL級的描述、門級網表等等,不過由于不同的數據格式使得Design Compiler綜合的起點不同,即使實現相同的功能,也可能會產生不同的結果。
????????讀取源程序的另外一種方式是配合使用analyze命令和elaborate命令:
- analyze是分析HDL的源程序并將分析產生的中間文件存于work(用戶也可以自己指定)的目錄下;
- elaborate則在產生的中間文件中生成verilog的模塊或者VHDL的實體,缺省情況下,讀取的是work目錄中的文件。
????????當讀取完所要綜合的模塊之后,需要使用link命令將讀到Design Compiler存儲區中的模塊或實體連接起來,如果在使用link命令之后,出現unresolved design reference的警告信息,需要重新讀取該模塊,或者在.synopsys_dc.setup文件中添加link_library,告訴DC到庫中去找這些模塊,同時還要注意search_path中的路徑是否指向該模塊或單元電路所在的目錄。
五、設計對象
????????上圖是一個Verilog描述的設計實例,里面包含了我們所要討論的幾種設計對象。這些對象也是今后DC命令的操作對象。Verilog描述的各個模塊可以稱之為設計(Design),里面包含時鐘(Clock),他的輸入輸出稱為端口(Port),模塊中的互連線是線網(Net),內部引用的元件稱為引用(Reference),引用的實例稱為單元(Cell),引用單元的內部端口是管腳(Pin)。?
????????其中值得注意的是DC識別Clock不是通過HDL的書面表達,而是要通過設計者施加一定的約束來區分的,具體內容后續會討論。
?六、設計的劃分
????????把一個復雜的設計分割成幾個相對簡單的部分,稱為設計劃分(Design Partition)。這種方法,也可以稱為“分而治之”(Divide and conquer)的方法,在平常的電路設計中這是一種普遍使用的方法,一般我們在編寫HDL代碼之前都需要對所要描述的系統作一個系統劃分,根據功能或者其他的原則將一個系統層次化的分成若干個子模塊,這些子模塊下面再進一步細分。這是一種設計劃分,模塊(module)就是一個劃分的單位。
????????在運用DC作綜合的過程中,默認的情況下各個模塊的層次關系是保留著的,保留著的層次關系會對DC綜合造成一定的影響,比如在優化的過程中,各個子模塊的管腳必須保留,這勢必影響到子模塊邊界的優化效果。下面我們將詳細介紹在作設計劃分的過程中要注意的幾點原則,并根據每個原則舉一個實例說明。
1、組合電路
????????不要讓一個組合電路穿越過多的模塊
????????上圖中的組合邏輯電路存在于寄存器A與寄存器C之間,它同時穿過了模塊A、模塊B以及模塊C。前面提到了,如果直接將這樣的劃分交給DC綜合,那么綜合后的電路將仍舊保持上面的層次關系,即端口定義不會改變。這樣的話,DC在作組合電路的優化的時候就會分別針對A、B、C三塊電路進行,這樣勢必會影響到DC的優化能力,不必要的增加了這條路徑的延時和面積。因此,可以考慮將三塊分散的組合邏輯劃分到一個模塊中,如下圖所示——
?????????
????????這張圖說明了組合電路劃分到一個模塊之后的電路情況,這樣DC就可以充分的施展它的的優化技巧,綜合出比較滿意的電路來。為什么說它只是一個較好的劃分呢?因為它只是考慮到組合電路的最優劃分而沒有想到時序電路部分。我們進一步修改:
?
????????在這張圖里,組合邏輯被劃到了C模塊中,它不僅能保證組合的最佳優化還能保證時序的最佳優化,因為里面的寄存器在優化的過程中可以吸收前面的組合邏輯,從而形成其他形式的時序元件,如由原先的D觸發器變成JK觸發器、T觸發器、帶時鐘使能端的觸發器等等。這樣工藝庫中的大量的時序單元都可以得到充分的利用了。?
2、時序電路
????????通過前面的討論,可以知道:在編寫代碼或者綜合的過程中,我們可以把模塊盡量寫成這樣的邏輯結構:將所有的輸出寄存起來。其實這樣不但是最佳的優化結構,也可以簡化時序約束(使得所有模塊的輸入延時相等)。
????????就算遵循了輸出寄存的原則,我們還是可能犯下面的錯
????????圖中可以看到,一個與非門連接了A、B、C三個模塊,同樣的不難看出來,它也會影響到C的組合邏輯的優化。一般這種情況只會在自下而上的綜合策略中才出現。可以通過把與非門吸收到C中的組合邏輯的方法消除粘滯邏輯(如下圖),從而使得電路的頂層模塊僅僅是將子模塊拼接在一起,而沒有獨立的電路結構,這樣的一個另一個好處是可以使得在自下而上的設計策略中不需要編譯頂層模塊。?
????????
3、模塊大小
????????綜合時間主要受到硬件條件(主頻、內存)的制約,對于早期的工作站而言,硬件水平不高,跑一個大型的設計可能會一次花上幾天時間才會有結果,這樣對調試和縮短工期是不利的,所以需要根據工作站的能力選擇合適的模塊大小。
????????
????????這個例子的模塊大小從500門到37萬門不等,假設工作站的硬件條件限制最多只能跑30萬門的設計,那么上面的這種劃分就有一些弊病。首先,TEENY模塊太小,不適合優化出最好的結果,可以考慮將它合并到其他模塊中。其次,另一個組合模塊邏輯太大,這勢必使得綜合的時間變得不能承受。因此,改進的劃分可以如下圖所示——
????????可以看到,雖然各個模塊也是大小不一,但卻可以取得較前面的劃分更好的結果。值得注意的是——Design Compiler軟件本身沒有模塊大小的限制,它完全根據工作站的環境決定,在具體作設計的時候,我們可以在硬件條件允許的條件下編譯較大的模塊,假如硬件條件的確有限,只能選擇小的模塊來綜合了
4、同步邏輯
????????將同步邏輯部分與其他部分分離
????????上圖是一個芯片的頂層設計,可以看到它被分層了三個層次——最外邊是芯片的Pad,Pad是綜合工具中沒有的,也不是工具能生成的,它由Foundry提供,并由設計者根據芯片外圍的環境手工選擇;中間一層被分成四個部分,其中最里面那個稱為Core,也就是DC可以綜合的全同步邏輯電路,另外的三個部分DC不能綜合,需要其他的辦法來解決:ASYNCH是異步時序部分,不屬于DC的范疇;CLOCK GEN是時鐘產生模塊(可能用到PLL),盡管有一部分同步電路,但也不符合綜合的條件;JTAG是邊界掃描的產生電路,這一部分可以由Synopsys的另外一個工具BSD Compiler自動生成。
5、group / ungroup
????????上面我們介紹了四個劃分的原則,當然這些原則并不是我們在編寫HDL代碼的時候就必須遵守的,它只是說明什么樣的設計劃分對于DC來說是最理想的,能得到最優化的結果。事實上除了通過HDL中的模塊體現劃分,我們還可以運用DC的兩個命令(Group及Ungroup)來調整設計劃分。
? ? ? ? 比如在第一點中提到的例子
?????????第一步是使用group命令,創建一個新的模塊NEW_DES(設計名),單元名為U23,包含了U2和U3,這個命令很直觀,很容易看懂。
????????第二步則是使用ungroup命令,將U23中的U2和U3的邊界去掉,使之稱為一個整體: