在 sta 分析時,經常會碰到 clock gating cell (一般是 ICG cell 或者 latch)引起的 violation,這種 violation 很常見,而且往往很難修。
為什么 gating cell 容易出問題?出了 violation 又該如何解呢?
首先,gating cell 容易出問題是因為其一般出現在 clock path 的中間,而且往往比較靠近 clock source,其latency 較小,當 tool 去check gating cell 的timing 時,其sink point 是在gating cell上,而 CTS 的sink point 是在 gating cell 后面的register, 所以對包含 gating cell 的 path 就會出現:launch clock 較長,而 latch clock 很短的情況,於是導致嚴重的 setup violation。
################## update 0321 #########################
以 ICG cell 為例,常見的 clock gating check 的 path 如下圖:
圖中 Reg1 產生 clock enable 信號,用來控制 ICG cell 的開關狀態,
在 cts 階段,tool 在圖中會看到兩個 sink 點: Reg1/CK, Reg2/CK ,
所以 tool 會對這兩個點做 balance,那么做完 cts 后就有: T1 =~ T2 + T3 ;
但是在 sta 時,由於 enable 信號是由 CLK 采集的,所以需要 check 從 Reg1 到 ICG cell 的 timing,
此時 launch clock latency = T1 , capture clock latency = T2,
又因為 T1 =~ T2 + T3 , 所以可以認為 T1 >> T2,
這樣 capture clock 就比 launch clock 短很多,很容易出現 setup violation !
那么這種 violation 該怎么解呢?
兩種思路: 1) 縮短 data path 或者 launch clock, 2) 墊長 capture clock
首先,墊長 capture clock 不太可行,因為 gating cell 一般都比較靠近 source 點,后面 fanout 較多,影響可能比較大;
而縮短 data path 也不好做到,因為從 start register 到 gating cell 一般比較近,能夠縮的余地不大;
所以綜合考慮,縮短 launch clock path (即縮短T1)是最佳選擇。
縮短 T1 可以用 float pin 來實現,
set_clock_tree_exceptions -float_pin Reg1/CK -float_pin_rise 0.5
甚至可以考慮 抓出所有產生 enable 信號的 register,讓它們單獨 cts,不要和 gated clock 做 balance
#######################################################
一般 clock gating cell 是 AND 、OR 、latch、ICG ,常見的的一種 gating 結構如下圖:
圖中的 register 是用於同步 EN 信號,防止出現亞穩態或毛刺
如果將這個 reg 和 AND 封裝起來做成單個cell,就是一個簡單的 ICG cell。
此外,用 AND 做的 gating cell 容易產生 clock glitch或 clipped clock,原因如下圖:
##################################################################
典型的 clock gating check timing path 如下圖:
圖中gating cell 的 B 端是clk,A 端是 enable,A 端的電平變化可以控制 B 端的 clk 是否送出去,以此控制gating cell 的開關
首先 CTS 是去 balance “從source 到 C1(就是T1)” 和 “從 source 到 C2(就是T3+T4)” 這兩段clock,即 T1 =~ T3+T4;而 gating check 時,launch clock path 是 從source到C1(就是T1),而 latch clock path 是 從source到B(就是T3),又因為gate cell 一般靠近source,所以這里 T3 比 T1 小得多,skew 超大,於是 gating check 就會出現較大的 setup violation。
那么這種 violation 改如何解呢?
兩種思路: 縮短 data path 或者 launch clock path, 墊長 latch clock path
首先,墊長 latch clock path 不太可行,因為 gating cell 一般都比較靠近 source 點,后面fanout較多,影響可能比較大;
而縮短data path 也不好做到,因為從 start register 到 gating cell 一般比較近,能夠縮的余地不大;
所以綜合考慮,縮短 launch clock path (即縮短T1)是最佳選擇。
縮短 T1 可以用 float pin 來實現,
set_clock_tree_exceptions -float_pin C1 -float_pin_rise 0.5
其它與 clock gating 相關知識:
1. set_clock_gating_check -setup 0.2 開啟 gating check 並預留 0.2 的 setup margin,設置這個margin 可以壓短 data path
2. DC 綜合時可以用 set_clock_gate_latency,在綜合時就考慮到 gating path 的 timing 問題
3. gating cell 一般是 AND ,OR ,latch,ICG