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