ICG(Intergrated Clock Gating)作為low power的設計手法之一,已經在實際中得到廣泛應用。它們能夠在某些時候將某些clock關斷從而達到降低功耗的目的。然而從時序的角度,經常會發生ICG的setup難以收斂的情況。
為什么會出現這種情況呢?
下圖展示了一種簡單的帶ICG的clock tree結構:

一般每個ICG會控制一個或多個DFF,通過某個DFF傳遞過來的控制信號控制ICG的開啟或者關斷。
然而,在CTS(clock tree synthesis)工具或者命令綜合時鐘樹的時候,ICG不會被看作sink因此并不會作為balance對象,因此就會出現如下這種結果:

由上圖可以看出,在分析setup時:
launck clk delay = a + b
capture clk delay = a
因此,**對于ICG的setup path,天然存在clock skew**:**b**,而skew的大小完全取決于ICG距離sink DFF有多遠。
在出現setup violation的ICG path上,比較多見的就是**因為ICG和sink DFF的clock之間存在較多邏輯或者物理上距離較遠,從而導致skew較大而發生setup violation**。
針對這種現象,在實際設計中,我們可能會考慮將出現setup violation的ICG盡量放在sin DFF附近以減小skew。與此同時,EDA工具也提供命令來收緊ICG的timing constraint來迫使工具來優化這些path,比如**set\_clock\_gating\_check**命令。
往期問題答案:
**fix hold violations時,插入buffer或者delay cell的位置,是靠近launch端還是capture端,還是并無任何要求呢?**
在邏輯和物理上都應該盡量靠近capture端,也就是endpoint。在邏輯上更靠近endpoint能夠保證插入的cells只會影響到有violation的path,物理上更靠近endpoint能夠有效避免DRV,因為修hold時加入的cell普遍驅動能力較弱。