時(shí)鐘樹(shù)優(yōu)化與有用時(shí)鐘延遲
時(shí)鐘樹(shù)優(yōu)化與有用時(shí)鐘延遲在 “后端時(shí)序修正基本思路” 提到了時(shí)序優(yōu)化的基本步驟。其中,最關(guān)鍵的階段就是時(shí)鐘樹(shù)建立。基本的優(yōu)化都優(yōu)先在數(shù)據(jù)路徑上進(jìn)行,并且希望路徑盡量的短,最好在一個(gè)時(shí)鐘周期之內(nèi)。當(dāng)然,如果考慮輸入、輸出延遲,收斂悲觀因素,庫(kù)的建立時(shí)間,與時(shí)鐘不確定性,以及不同時(shí)鐘沿觸發(fā)等因素,這個(gè)要求還要進(jìn)一步的壓縮,這些將在以后陸續(xù)進(jìn)行討論。
通常,我們希望時(shí)鐘樹(shù)偏差(clock tree skew) 越小越好,目標(biāo)為零。所以,在建立時(shí)鐘樹(shù)(CTS)之前,我們首先將時(shí)鐘設(shè)定為理想時(shí)鐘。這樣的好處是,優(yōu)化數(shù)據(jù)路徑時(shí),不會(huì)對(duì)時(shí)鐘路徑有額外的修改。而且,因?yàn)榕懦藭r(shí)鐘的影響,可以看到最終優(yōu)化的結(jié)果,是否能夠滿足時(shí)序的要求。如果不滿足,最要考慮的就是數(shù)據(jù)路徑組合邏輯是否太多,導(dǎo)致延遲過(guò)長(zhǎng)。其他,可以估計(jì)一下RC延遲所占的比例,比如15%左右,過(guò)長(zhǎng)時(shí),檢查是否路徑邏輯單元之間是否間隔的太長(zhǎng)等等。不過(guò),本
文重點(diǎn)要討論的是,路徑過(guò)長(zhǎng)時(shí),如何通過(guò)增加有用時(shí)鐘延遲(useful skew) 來(lái)達(dá)到時(shí)序的滿足。
IC compiler 有這樣的命令 skew_opt ,還有其兩次流程(two pass)可供參考。
閱讀過(guò)本文后,我相信大家可以大致了解其工作的基本思路。
如果流程不正確,skew_opt 可能花費(fèi)過(guò)長(zhǎng)的運(yùn)行時(shí)間,而且,不能達(dá)到預(yù)期的效果。如果我們清楚其中的原理,就可以更好,更自由的運(yùn)用與發(fā)揮。
在不要考慮過(guò)多的情況下,如圖,在理想時(shí)鐘前提下,時(shí)序無(wú)法滿足,即slack < 0 。原本我們可以做:
1,最短化數(shù)據(jù)路徑,
2,提前啟動(dòng)時(shí)鐘路徑,
3,推遲捕獲時(shí)鐘路徑。
因?yàn)檫x項(xiàng)1,我無(wú)法壓縮它,現(xiàn)在我可以做的,就只有選項(xiàng)2和3了。
以選項(xiàng)3為例,目標(biāo)為加長(zhǎng)捕獲時(shí)鐘路徑:
set slack [get_attr [get_timing_path] slack]
set_clock_tree_exceptions
-float_pin_max_delay_rise $slack
-float_pin_min_delay_rise $slack
-float_pins $capture_clock_pin
以上是icc 命令的范例,大體上表達(dá)將小于零的slack 以時(shí)鐘特例的形式賦給捕獲時(shí)鐘路徑在寄存器的時(shí)鐘腳位。這樣,icc在進(jìn)行時(shí)鐘樹(shù)綜合的時(shí)候,就會(huì)有意在捕獲路徑上增加多的延遲單元,起到人為的偏移,從而實(shí)現(xiàn)用戶的意圖。
當(dāng)然, skew_opt 中,還有運(yùn)用set_clock_latency和balance_group 來(lái)輔助時(shí)鐘樹(shù)平衡,以達(dá)到更好的效果。