本文轉自:自己的微信公眾號《集成電路設計及EDA教程》
數字IC設計中Setup的分析與優化貫穿前后端設計中,最好在開始后端設計之前就獲得一個沒有Setup違反的網表,下面按照從前到后的流程逐一講解每個階段如果出現Setup違反該如何解決。下面用到的命令,主要針對的是Synopsys公司的綜合工具DC以及布局布線工具ICC。還有需要注意的是,Setup的修復和之后要講解的Hold的修復有很大的不同,Setup的違反隨着布局到布線階段的推進,它是越來越惡化的,不像Hold,線延遲會有益於Hold的修復的,因此存在少量的違反是沒有問題的。因此,在開始下一階段的Setup修復之前,最好將本階段的Setup違反都清掉。如果是需要用CCD來修復的Setup違反,那么在CTS之前,這些違反可以不用考慮。 1、邏輯綜合階段就有Setup違反:1.1 在DC中用重定時(Retiming)或者Pipeline修復;例如:
在本例中,在采用寄存器Retiming之前,有四級組合邏輯,並且在關鍵路徑的endpoint處只有一個寄存器。采用Retiming技術后,已被四個寄存器取代的那一個寄存器已經被反向移動了兩級組合邏輯,且關鍵路徑現在包含兩級/部分。每級/部分的關鍵路徑延遲小於初始單級設計中的關鍵路徑延遲。如在本例中,通過Retiming來減少延遲通常會導致設計中寄存器數量的增加,但通常這種增加很小。
1.2 在DC中通過group ungroup的方法來對critical的模塊進行優化;將那些critical的模塊group到一起,然后ungroup,讓DC對其進行充分的優化,不會因為在不同的group內而優化受到限制。另外,如果License支持的話,可以用Compile_ultra,它會自動做auto-ungrouping的操作,如下圖所示:
FF1和FF2之間的好多級組合邏輯經過compile_ultra編譯優化之后,可以打破hier的限制,在時序方面可以優化的更好。
1.3看違反是否很少,並向前向后查看路徑的時序,判斷在后端中用CCD是否有可能修復;如果該路徑的前后時序非常寬裕,那么在后端中用CCD來修復也是可以的。 1.4 用DCT進行增量編譯由於DC進行綜合時一般用Wire Load Model分析時序,所以不是很准確,並且分析時也沒有標准單元或者Macro的具體物理位置,所以分析優化過程不是很貼近物理實際。為了解決這個問題,可以用DCT來解決(結合MCMM)。具體步驟為:ICC導出Floorplan的DEF給DCT,然后用Compile_ultra進行再次綜合。詳細流程如下:
1.5 修改電路結構/算法
如果上述方法都不行,那么需要查找設計中的Setup違反是什么樣的情況,是很多路徑都有一些小的違反還是說這些違反都集中在一個模塊上,且違反很大。如果是前者則可以通過DCT再次編譯來解決,如果是后者,需要分析在后端中用CCD是否有可能解決,如果不行的話,便只能通過修改電路結構或者更改電路的算法來進行修復了,在系統級或者算法級來解決這種問題也是最有效、程度最好的方法了,不過可能會比較耗時。我曾遇到過這種情況,某個DSP模塊的時序非常差,基本上通過軟件修復是不可能的,后來換了種算法,在精度、面積、時序上都有了很大的提升,設計的Setup違反也不存在了。 2、布局之后CTS之前有Setup違反:2.1 用DCT進行增量編譯首先用零互連延遲模式報告一下,看設計中是否有setup的違反,如果沒有的話,那么應該是線延遲太大使得嚴重偏離了之前的理想情況,這個可以用DCT來進行再次綜合。在DCT中將所有的scenario都讀入進去,並讀入ICC導出的DEF文件,然后進行增量編譯;
2.2 在ICC中將timing critical的單元靠近放置如果是規模太大使得線延遲太大導致的,在后端設計中也可以將一些critical的單元靠近放置,如果在同一個模塊內部,可以創建plan_group;此外還可以對某些具體的net設置netweight來使得這些critical path上的單元靠近放置。 3、CTS之后有違反:看做完CTS之后的Skew+jitter+margin和之前設置的setup uncertainty是否相差較大,如果是這樣,說明uncertainty值設置的有問題,無法較貼切的模擬做完CTS之后的時序效果。需要調整之前的setup uncertainty值,然后去看setup是否能夠meet。 如果有少量的path由於datapath延遲過長導致setup timing很難meet,可以在CTS過程中采用CCD用useful skew來向前向后借timing,命令為:>clock_opt -concurrent_clock_and_data 當然,也可以有針對性的手動進行操作,在前后級有margin的情況下(大前提),可以對launchpath進行early,或者對capturepath進行late。下面舉個例子。 如下圖所示,時鍾周期為10 ns,圖中標明了各時鍾路徑的延遲。可以看到有一條路徑的slack為-1ns,說明這條路徑違規。可以看到與這條路徑相關的skew是T3 - T2= -1ns。
在用UsefulSkew之前,設計中存在Setup的違反下面我們利用useful skew向前面一個slack比較充裕的路徑(slack=2 ns)借點time,來修正現在這條路徑,即對T2所在的launch path進行early操作:
在采用Useful Skew之后,設計中不存在Setup的違反
4、布線完成后有少量違反:4.1 可以用ICC中的CCD來修復,>set_concurrent_clock_and_data_strategy>route_opt -concurrent_clock_and_data 4.2 在先進工藝節點下,連線延遲占了很大的比重,這主要是由於net和via上的電阻太大導致的,我們可以控制在route的時候來優化這些高阻抗網絡,具體方法:在用route_opt繞線之前,我們可以在set_optimization_strategy命令后邊將-high_resistance選項設置為true來啟用該功能。當使能高阻抗優化時,時序驅動的布線引擎在插入過孔時會考慮導線電阻,以減小導線電阻,同時保持可布線性。
5、chipfinish階段有少量違反:可以用ICC中的CCD來修,>focal_opt -concurrent_clock_and_data-setup_endpoints all 6、布局布線中的任何一個階段其實在ICC中布局布線的任何一個階段都是可以用PT進行ECO來修復Setup違反。
網易雲課堂
課程
《Calibredrv教程-提高流程自動化》