1.關于ICG 現在基本上都是使用集成的ICG了,ICG的時鐘pin是through pin,不是sink pin,所以不會跟其他sinks點做balance。也就是說root 到icg/cp一定會比root到reg/cp短,導致enable logic容易有setup violations問題。 為了避免這一塊出問題有很多策略,比如克隆icg,控制icg位置,額外加margin優化相關的data path減小icg fanout等等,另外ICC/FC有很多原生命令去優化icg避免問題的發生。 ![]() (1)放松skew。現在大部分項目里只要時序能收斂,global skew大一點也無可厚非。set_clock_tree_options -target_skew 0.3 (default: 0) (2)控制CTS階段scenario數量。使用的scenario能覆蓋所有sdc即可,使用的太多的話,clock qor/run time/clock buffer都會不好。 set_scenario_status [get_scenarios -filter active] false set_scenario_status $scenario -active true (3)func與scan分開長tree。在一些只有func和scan兩個mode的項目里,可以考慮先長func tree設don't touch后再做scan tree,這樣也可以減少clock buffer數量,但是這種方法有時候時序會不如一起長tree的方式。 set_scenario_status -active false [get_scenarios] set_scenario_status -active true [get_scenarios FUNC] clock_opt -from build_clock -to route_clock set_dont_touch_network -clock_only [all_clocks] set_scenario_status -active false [get_scenarios] set_scenario_status -active true [get_scenarios {FUNC SCAN}] clock_opt -from build_clock -to route_clock (4)把latency最長的path盡可能做短。latency長要么邏輯多,要么距離root遠,要么就是時序單元有很長的內部延時,長tree算進去了。項目中有遇到mem channel里沒加soft blockage,sinks跑到channel 里面去了,導致tree被拉長。可以根據cell 的instance name 來判斷插入cell 的目的是啥。 另外,一些sram內部有一部分延遲在CTS階段算到clock tree上,導致長tree會拉長其他寄存器的latency。需要把這些pin抓出來,offset設成0。 set_clock_tree_options -offset 0 [get_pins $list] CTS階段相關的命令: 有時候為了做短某一部分sinks 的tree latency,可以在CTS時不讓工具去做balance,可以人為的給這些sinks 指定latency。 set_clock_balance_points -consider_for_balance false -balance_points [get_clock_tree_pins -filter "is_sink == 1"] 也可以在CTS 使用remove_clock_balance_points,然后再人為設置set_clock_balance_points 指定需要長多長。 如果時鐘邏輯比較復雜,可以允許CTS優化tree上的組合邏輯,使用相同的VT。 set_dont_touch [get_flat_cells $clock_opt_cell_list ] false set_lib_cell_purpose -include cts [get_flat_cells $clock_opt_cell_list] 3. Transition violations修復問題 (1)不同scn 下sdc對端口set_load約束不一致,導致transition不一致,需要更改sdc (2)節省面積空間,端口不插IO buff,完全靠約束去cover,工具dmsa修復的效果不好,可以在端口插驅動居中的buffer然后magnet_placement 去legalize并fixed。 add_buffer [get_ports] BUFX6 -new_cell_name IOBUF magnet_placement -logical_levels 1 -mark_fixed [get_pots] set_dont_touch [get_flat_nets -of [get_ports]] true (3)修復hold不想size_cell(tran可能惡化),可以使用 fix_eco_timing -pba_mode path -type hold -method {insert_buffer_at_load_pins} -buffer_list $list (4)第一輪PT的時候,發現transition 太差 route_opt階段的transition violation可以使用report_constraints -all_violators -max_transition報告出來,抓出其中violation net的driver pin,使用set_route_opt_target_endpoints -ldrc_objects加route_opt去修,效果很好,setup和hold violation也許因為GBA和PBA的差異導致ICC2和PT的報告有些許出入,但是transition violation基本上差不多。看到log里Route-opt initial QoR Summary后有如下信息就算設置成功了。 INFO: Marking 2 targeted_ep objects for LDRC INFO: Enable Target Endpoint Optimization Flow with SETUP 0 HOLD 0 LDRC 1 (5)如果某一組邏輯比較差,可以指定這一組邏輯使用ULVT 4. buffer原理 buffer實際就是兩個串聯的反相器,時鐘buffer本身是輸入負載較小,輸出驅動能力較強。因此前級電路驅動buffer容易,而buffer驅動后級電路也比較容易。組成buffer 的兩個反相器中,前者反相器驅動能力小,后者驅動能力很強,這就能夠實現輸入負載小但輸出驅動大,所以 buffer 的兩個沿是不對稱的。時鐘路徑中為了做出質量更高的tree,一般會只用inv,因為上升沿和下降沿是對稱的。 5. 三態緩沖器(buffer)的原理Three-state buffer又稱為三態門、三態驅動器,其三態輸出受到使能輸出端的控制,當使能輸出有效時,器件實現正常邏輯狀態輸出(邏輯0、邏輯1),當使能輸入無效時,輸出處于高阻狀態,即等效于與所連的電路斷開。 為減少信息傳輸線的數目,大多數計算機中的信息傳輸線均采用總線形式,即凡要傳輸的同類信息都走同一組傳輸線,且信息是分時傳送的。在計算機中一般有三組總線,即數據總線、地址總線和控制總線。為防止信息相互干擾,要求凡掛在總線上的寄存器或存儲器等,它的傳輸端不僅能呈現0、1兩個信息狀態,而且還應能呈現高阻抗狀態(又稱高阻狀態),即此時好像它們的輸出被斷開,對總線狀態不起作用,此時總線可由其它器件占用。 |
|