為什么異步時鍾不要設false path


白山頭 白山頭講IC

 

為什么異步時鍾不要設false path

對於初學者,常常認為異步電路應該設false path。甚至很多老手也是這么認為的。
其實針對於異步電路,是有專門的sdc的命令來完成這項任務的。

set_clock_groups -asynchronous

 

用作用上來看,似乎和false path的效果是一樣的。那么為什么還有這么個命令呢。

設想一下,有兩個clock, clka和clkb,屬於異步關系,應該怎么設置呢?

用clock group的方法:

set_clock_groups -group clka -group clkb 【命令1】

 

用false path的方法:

set_false_path -from [get_clock clka] -to [get_clock clkb] 【命令2】

set_false_path -from [get_clock clkb] -to [get_clock clka]


比較下來,似乎clock group的方法更為直觀一些, 但是差別也不大。
那么設計這個異步命令的真正原因是什么?它和false path的作用的根本區別是什么?

 

在set_false_path的manual里面,有這么一句話解釋了兩者的真正區別:

 

 

總結下來就是,異步電路的話,一定要用命令1,同步電路的話,再用命令2. 兩者對於crossstalk的計算方法不同。

筆者就曾經在項目中遇到過這個問題,本來應該設異步的情況下,設置了false path。由於是在timing clean之后發現的這個問題,那么修改之后就很容易比較兩者之間的差別。
結果就是改為命令1的設置之后,timing變差了很多,有些path甚至有幾百ps之多。

如果感興趣的話,可以用自己的design做個實驗,可能有驚喜。

那么manual里說的的crosstalk分析究竟有什么差別呢?

 

 

 

如圖,在crosstalk分析中,當信號A和信號B跳變發生於同一時刻,那么信號B會因為信號A的影響,產生一個delta delay。而如果信號A的跳變過早或者過晚,那么對於信號B的delay就沒有影響。

那么兩條net哪個時aggressor,哪個時victim呢?這取決於我們在分析哪個net。由於我們分析的是信號A對信號B的影響,所以這里的信號A就是aggressor,信號B就是victim。反之亦然。通常實際設計中的對於一個victim,aggressor不止一條,同樣,對於一個aggressor,也會有多個victim。

當進行on-chip-variation mode 分析的時候。每一個aggressor和victim的跳變,都會有個最早到達時間和最晚到達時間。這個最早和最晚到達時間中間的window,就稱為timing window。只有當aggressor和victim的timing window有重疊時,delta delay才會產生,也就是說,aggressor才會對victim產生影響。

 

如果設set false path,工具會繼續按照同步關系計算timing window。

而我們知道,對於aggressor和victim屬於兩個具有異步關系的clock的情況,aggressor的跳變可能發生於victim整個時鍾周期的任何時刻。而不只是在按照同步clock計算出來的timing windlow中。

而按照同步關系來計算的話,aggressor對victim的timing window之外的跳變的影響,工具就忽略了。這可能會導致嚴重的后果,輕則性能下降(setup),重則芯片fail(hold)

 

總之,謹慎設置false path,力爭芯片一次成功。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM