IC設計中邏輯綜合的一般步驟及相關基本概念
綜合中的延遲及關鍵路徑
圖1 常見的時序路徑示意圖
圖1中給出了常見的兩個寄存器R1和R2之間的時序路徑。R1和R2分別具有延遲Tck-q和Tsetup,TM和TN分別是M和N邏輯具有的延遲。B對R1來說是輸出端口,輸出延遲為Tsetup+TN,而對R2是輸入端口,輸入延遲為Tck-q+TM,於是這條單周期路徑的總延遲為Tck-q+TM+Tsetup+TN。
從延遲的角度來說,關鍵路徑就是指那些總延遲大於相應周期時間的路徑。消減關鍵路徑的延遲要從消減路徑中的各部分延遲入手,主要方法就是利用綜合工具對路徑施加約束條件來限制優化,達到減小路徑延遲的目的。
綜合的主要過程
1. 翻譯:讀入電路的RTL級描述,並將語言描述翻譯成相應的功能塊以及功能塊之間的拓撲結構。這一過程的結果是在綜合器內部生成電路的布爾函數表達式,不做任何邏輯重組和優化。
2. 優化:根據所施加的時序和面積約束,按照一定的算法對翻譯結果進行邏輯重組和優化。
3. 映射:根據所施加的時序和面積約束,從目標工藝庫中搜索符合條件的單元來構成實際電路的邏輯網表。
一般的綜合步驟如表1所示。從表1中可以看出,約束條件是綜合過程的重要組成部分。綜合正是通過設置約束條件來優化設計,以達到設計要求的。
對關鍵路徑延遲的
主要約束處理方法
通過選擇器件的處理方法
從最直觀的角度看,時序邏輯和組合邏輯都由基本的電路單元組成,因此,選擇延遲小且不影響芯片性能的器件是既簡易又高效的處理方法。例如,基本電路單元庫中的DFFXL寄存器雖然面積較小,但它的延遲相關參數Tck-q、Tsetup較大,容易形成關鍵路徑,於是可以通過設置set_dont_use等約束來禁用它。在一些特殊情況下,基本電路單元庫中的器件不能滿足要求,這時需要采用自定義的電路單元。
對端口間邏輯的處理方法
這是諸方法中最常用、最有效、最重要的,一般通過set_input_delay、set_output_delay、set_max_delay等來實現,有以下幾種情況:
如果兩個寄存器之間的邏輯比較少,那么可以對其輸入延遲和輸出延遲施加較寬裕的約束,即設置較大的set_input_delay和set_output_delay值,表明所做邏輯不受壓縮,映射電路基本單元庫的自由度較大。這樣,兩者的實際延遲之和將不大於單周期時間(非關鍵路徑),不僅滿足設計要求,而且對其他關鍵路徑的影響很小。
如果兩個寄存器之間的邏輯比較多,那么就要對其輸入延遲和輸出延遲施加較嚴厲的約束,即設置較小的set_input_delay和set_output_delay值,表明所做邏輯需要壓縮,而映射電路基本單元庫的自由度也較小。但這並不表示越小越好,如果設的值很小(甚至為零),那么會使綜合器對這條路徑的邏輯壓縮得過大,而導致其它關鍵路徑的延遲增加,甚至導致其它非關鍵路徑轉化為關鍵路徑。因此要憑借經驗,不斷改變所設的約束值,最終使所有路徑的延遲都不大於單周期時間,滿足設計要求。
對於一般芯片設計(中小規模),在以上兩種情況下,對其輸入延遲和輸出延遲合理施加約束,基本就能滿足設計要求。如有個別幾條關鍵路徑延遲仍然較長,可以通過設置set_critical_range和group_path來加以約束。這兩種約束對所約束路徑的邏輯壓縮效果較好,且不會影響其它路徑的延遲。采用這樣的約束之后,關鍵路徑通常都能被消除了。
對於一些大規模的芯片設計和上述處理后仍然存在關鍵路徑的情況,就要用set_max_delay來進行約束,這種約束的效果非常明顯,但會影響其它路徑的延遲。因此也要憑借經驗,不斷改變所設的約束值,最終使所有路徑的延遲都能滿足設計要求。
對層次間邊界的處理方法
圖2 邊界轉化示意圖
硬件描述語言描述的RTL級電路通常是多層次模塊,對其進行綜合后得到的電路依然以獨立模塊的方式存在,即存在邊界問題,因此綜合中有專門針對邊界問題的約束,利用這些約束可以打散邊界、保持邊界,或重新整合邊界,從而優化邊界,達到設計要求。
如圖2所示,約束group用來生成新的層次模塊,而約束ungroup的作用剛好相反,它用來打散邊界,消除層次模塊。通常它們都會結合起來使用,但不管以哪種方式選擇邊界,都應該根據具體的設計要求,參照綜合結果,選擇最好的方法。
在用硬件描述語言描述RTL級電路時,有時會專門設計某些單獨模塊(類似全定制電路)來簡化實現一定的功能,從而縮短延遲並減小面積。在綜合中利用約束set_dont_touch可以保證這類模塊不受影響,保持邊界。
對電路結構的處理方法
綜合概述
一般情況下,設計者在描述RTL級電路時就應該考慮諸多因素,對電路結構進行規划,而在綜合中只要將RTL代碼映射到基本電路單元庫幾乎就能達到預期要求。但在有些狀況下,還是需要利用一些約束來進行優化,這里僅以最常見的set_structure和set_flatten來加以說明。
structuring是綜合中默認的邏輯優化策略,它同時考慮了延遲(速度)優化及面積優化;而flattening這種策略往往以犧牲面積來達到縮短延遲的目的。
對某一邏輯的RTL級描述采用structuring和flattening兩種策略得到的綜合電路分別如圖3、圖4所示。flattening策略下得到的電路只有兩級,延遲小於structuring策略下得到的三級電路,但電路面積比較大。當今IC工藝已經進入深亞微米級,因而在設計中往往需要首先考慮延遲因素,但究竟選擇哪種策略,還是要根據具體的設計要求而決定。
如果采用上述方法后還不能消除關鍵路徑達到設計要求,就需要改進系統級設計,修改RTL代碼,再重新進行綜合。