在開始之前有兩件事想征求一下大家的意見:
-
最近有同學反映文章中很多專業詞匯不太明白,因此想開一個系列專門講一些后端的基礎知識和詞匯,畢竟后端的知識頗為繁雜,對入門者極為不利。因此如果大家有不懂的知識盡管留言,我會以適當的形式統一講解。
-
如果有人對提高效率的腳本、命令等感興趣,我也想將自己的一點經驗和大家分享。如果大家有實際工作或學習中遇到的這方面問題也可以留言提出來,看看能不能有比較好的解決方案。
言歸正傳,上次討論了CTS的策略以及CTS用的SDC的基本寫法。在進一步討論之前,我們先回憶一下CTS的基本流程:
在我們已經決定了如何進行時鍾樹綜合后,就需要對EDA工具進行一系列的設置來使其能夠忠實地反應我們的策略。因此,今天我們談談CTS的設置。
有人可能擔心不同的工具中CTS的方法是否會有不同。以我接觸過幾種主要的工具的經驗來看,雖然某些設置的叫法可能不同,但是其本質並沒有變化。比如Innovus的CCOpt中將這些設置稱為CTS spec,但是其本質內容大同小異。
在具體討論CTS設置之前,我們首先需要了解工具在CTS階段的行為到底是什么。換句話說,所謂時鍾樹綜合,到底是在綜合什么東西呢?
時鍾樹綜合階段,工具首先對clock line上的cell/net進行DRV優化,主要包括max_transition, max_capacitance, max_fanout, max_net_length等約束;在此之后,會分別對每個clock的latency和skew進行優化,也就是盡量縮短每個clock的latency並減小sink之間的skew;最后,如果有clock之間的latency需要balance,還會將這些clock的latency盡量做平。
1. Target Skew:clock內部或clock之間需要實現的目標skew值。
在之前的文章中提到過,對於CTS我們需要達到三個目標:skew盡量小、latency盡量短、common path盡量長。而target skew這個設置的目的就是告訴工具,我們希望時鍾樹綜合后能夠達到的skew值是多少。在ICC2中可以采用如下命令實現:
set_clock_tree_optio
ns -target_skew 100 -clock CLK ;# unit : ps
2. Clock Max Transition: clock line上cell的最大transition/slew值。
我們知道transition基本是cell高低電平翻轉所需要的時間。對於clock line上的cell,我們一般需要對其施加比其他cell更嚴格的transition約束。不同工藝,不同design和不同時鍾頻率的芯片對此可能都有不同的設置,但是我們可以大致遵從時鍾周期的10%-20%的規律。對於某些頻率較低的design可能需要更緊的約束。在ICC2中可以通過如下命令實現:
set_max_transition 200 -clock_path [get_clocks CLK] ;# unit : ps
3. CTS exceptions:精確控制部分時鍾樹的設置。在此我們遵從ICC的術語,在ICC2中某些術語已經棄用,但仍能找到對應的設置方法。
stop pin : 使CTS在某處停止或者用於告訴工具將某些pin/port辨認為sink;
set_clock_balance_points -clock clock -consider_for_balancing true -balance_points pins
exclude pin : 將某些pin/port從balance對象中移除,否則CTS將默認balance所有sink;
set_clock_balance_points -clock clock -consider_for_balancing false -balance_points pins
float pin : 用於對某些sink設置useful skew。用法為在sink的clock pin上加上一個正的或者負的delay,從而使工具在計算latency的時候考慮到這些delay而把clock tree做長或者做短。
set_clock_balance_points -clock [get_clocks CLK] -delay 50 -balance_points [get_pins U2/CLK]
non-stop pin : 工具CTS時可能會在某些地方停住,此時我們需要告訴工具穿過這些地方 繼續向前,比如分頻DFF。在ICC2中取消了原來在ICC中存在的non-stop pin設置,改為統一在sdc中通過create_generate_clock來實現這一功能。
4. CTS cells : 控制clock line上使用cell的種類。
因為我們需要clock line上的delay和variation盡可能的小,所以很多時候就需要人為規范CTS時使用的cell種類。一般在多種Vth共存的design中,我們總是會使用最快的cell,同時盡可能避免特別小和特別大的cell用於CTS。
set_lib_cell_purpose -include cts [get_lib_cells $cts_cells]
5. Clock Routing Rules : 控制時鍾樹上net的繞線規則。包括金屬層、線寬、線間距、是否需要shielding等(NDR:Non-Default Rule)。
一般來說clock繞線需要選取盡量高層的金屬,盡量寬的線寬來實現更短的latency,同時需要盡量寬的線間距來降低crosstalk的影響。因此,常用的routing rule可能包括2x width 2x spacing, 3x width 2x spacing等,有些公司可能還需要加上shielding。此設置可應用create_routing_rule來實現:
create_routing_rule CTS_NDR -default_reference_rule \
-widths { M1 0.1 M2 0.11 M3 0.11 M4 0.11 M5 0.11 } \
-spacings { M2 0.16 M3 0.45 M4 0.45 M5 1.1 }
上述routing rule還有很多其他option,大家可以在實際使用中慢慢體會。
6. 設置balance groups。
在實際設計中,我們有時可能會遇到某些path的launch和capture分屬於不同的clock,因此需要對不同的clock進行balance。可以通過下面的命令實現:
create_clock_balance_group -objects {clk1 clk2 clk3} -name balance_group1
至此,CTS的基本設置就算告一段落了。其實在ICC2中還有很多其他的option和命令來微調CTS,但是對於clock不太復雜的design,上述設置完全夠用了。
除了保證CTS的基本質量之外,對於某些特殊design或者先進工藝,CTS的EM以及Power問題也是我們關注的重點。尤其是在傳統CTS之外的一些特殊時鍾樹,比如H-tree, fishbone等,都是一些很有意思的話題。希望以后我們有機會能夠共同探討。
在下次CTS系列的最后一片文章中,我將會和大家聊聊如何調用工具命令跑CTS以及如何查看CTS的結果,同時會涉及如何debug一些CTS的常見問題,敬請關注。