在Innovus中從ccopt 后的timing report中可以看到clock delay是從負值開始算起的,這個是因為在ccopt過程中進行了的update latency的動作。
基於block level的設計進行分析,假設在sdc中對clock 沒有設置source&network latency(就是0),在ccopt之前clock模式是ideal的,所有的clock latency都是按照0計算。
當cts完成之后,clock模式切換為propagate ,工具會計算到達每個sink 點的latency 長度。
如下圖所示,cts之后,latency (insertion delay)為3.5ns。圖中兩邊虛線框代表block 的IO,左邊為input port,右邊為 output port。如果不進行update latency,對於input port(假設下圖中io和內部寄存器都約束在同一個clk下),setup timing會樂觀很多,對於ouput port ,setup timing會悲觀很多,因為寄存器有latency,io clock latency為0。
所以,工具對root點的pin 反標一個負的latency,在理想完全balance情況下,在timing rpt中可以看到到達內部寄存器的值為0,這樣就可以確保io timing不會過於樂觀和悲觀。控制這個過程的property 是update_io_latency。
set_ccopt_property update_io_latency true
需要注意下面兩點:
-
如果是在做top only的pr實現,或者整個設計是flat進行的,要設置update_io_latency為false,可以考慮一下為什么。
-
在ccopt之前不要設置clock 模式為propagate