You are on page 1of 8

ICC2(三)CTS 阶段常用命令_拾陆楼的博客-CSDN博客

_icc set_power_options -leakage true


blog.csdn.net/m0_61544122/article/details/124778140


ICC2
专栏收录该内容

38 篇文章
51 订阅

订阅专栏
clock_opt通过-from和-to分为build_clock,route_clock和final_opt,默认从build_clock
到final_opt顺序执行,对应的操作分别是时钟树综合与优化(skew、latency与面积,max
transition与max cap);时钟树detail route;基于propagated clock latency的优化,时序
优化、DRV优化、面积与功耗优化,以及legalize placement。build_clock时钟树综合采取
Gate-By-Gate CTS的方法,即从后往前分段长tree,先balance ICG到sink pin,再balance
ICG到ICG,最后是root到ICG。

关于clock_opt常用命令及用法如下:

1、preCTS check design

check_design -check pre_clock_tree_stage -open_message_browser

报告常见问题:

CTS-006 有冲突的点,比如func tree上的through pin同时是scan tree上的sink 点;

CTS-012 don't touch net,常见iso cell相关net;

CTS-015 max/min delay用于优化data path,cts会忽略它;

CTS-019 clock sink是output port,除非用set clock balance points指定为sink 点,不然工


具不会balance;

CTS-903 clock tree上的cell没定义成clock reference list,所以不会size,用


set_lin_cell_purpose -include指定clock cell;

CTS-905 clock 没有sink;

CTS-907 set disable timing;

CTS-914 set_input_transition超过set_max_transition限制;

report_clock_setting

##报告max_tran max_cap;NDR rule;clock cell spacing rule;clock tree reference

1/8
2、set_clock_tree_options

set_clock_tree_options -target_skew 0.2 -corner {xx} -target_latency 1.5 -clocks xxx

## target latency约束最小latency

set_clock_balance_points -consider_for_balancing true/false -balance_points {xx/ck} -clock


xxx

#是否要balance,以及balance的leaf pin。

set_clock_tree_options -offset 0

#有些mem自带clock latency原因是lib 里有如下定义

timing_type :max_clock_tree_path;

timing_type :   min_clock_tree_path;

二者大小不同产生天然的skew,在report_clock_qor时对应的pin的latency报告里会多出
一个lib cell clock balancing offset的值,要在set_clock_balance_points里用-offset设置成
0,这里用-delay也行,再去报告report_clock_qor时lib cell clock balancing offset就变成
了clock balancing offset 0了

set_clock_tree_options -delay 0.1

#希望tree做短用正值,希望tree做长用负值 

3、clock tree reference

set_dont_touch [get_flat_cells $clock_opt_cell_list ] false

set_lib_cell_purpose -include cts [get_flat_cells $clock_opt_cell_list]

#指定clock tree可以优化的cell 类型

set_dont_touch [get_flat_cells $clock_opt_buf_list ] false

set_lib_cell_purpose -include none [get_flat_cells $clock_opt_buf_list]

set_lib_cell_purpose -include cts [get_flat_cells $clock_opt_buf_list]

#指定长tree用的buf /inv list

4、ccd
传统的CTS标准是latency、skew和area,使用ccd会根据sink之间的时序关系调整latency,
clock_opt阶段使用ccd会工具会默认将cts.compile.enable_local_skew和
cts.optimize.enable_local_skew设为true来执行local skew的优化。

2/8
set_app_options -name clock_opt.flow.enable_ccd -value true

cts阶段即clock_opt -from build_clock -to route_clock 不推荐使用

postcts即clock_opt -from final_opto可用,而且不推荐在这个阶段修hold,会造成利用


率激增

set_app_options -name ccd.max_prepone -value 0.2

set_app_options -name ccd.max_postpone -value 0.4

#分别限制latency减少和增加的值,这里是0.2ns和0.4ns,默认情况下clock_opt阶段没
有限制

group_path -name in2reg -from [all_inputs] -to [all_regsiters]

set_app_options -name ccd.skip_path_groups in2reg

#减少资源浪费,跳过in2reg这种path group

set_app_option -name ccd.enable_top_wns_optimization -value true

#在clock_opt build_clock阶段通过优化WNS最差的300个endpoint来优化TNS

set_app_option -name ccd.optimize_boundary_timing -value false

set_app_option -name ccd.optimize_boundary_timing_upstream -value false

#默认是true,工具会优化boundary时序,为了把run time用于优化内部时序可以设false

 5、clock_opt fix hold violation 

 set_app_options -name clock_opt.hold.effort -value none

# 这里不推荐在clock_opt阶段修hold

 set_app_options -name clock_opt.flow.skip_hold -value true

set_app_options -name opt.dft.clock.aware_scan_reorder -value true

#优化scan chain改善hold时序,默认为false 

6、clock route

set_app_options -name cts.compile.enable_global_route -value true

#控制synthesize_clock_trees使用global route,绕线更接近route阶段,时序分析更准
确,这里如果使用clock_opt命令默认使用global route。

3/8
7、NDR rule 

create_routing_rule icc2rm_2w2s -default_reference_rule -multiplier_width 2  -


multiplier_spacing 2

set_clock_routing_rules -net_type root/internal -rule icc2rm_2w2s -min_routing_layer ME3


-max_routing_layer ME6

 关于默认的root、sink,internal定义如下:

root  Nets connected to the clock root

sink Nets connected to one or more clock sinks

internal Internal nets in the clock tree (all nets except the

root and sink nets)

可以看到root的定义是连接clock root的net,如图1。

 图1.root,internal,sink net type 

用户也可以自定义root type,通过:

 set_clock_tree_options  -root_ndr_fanout_limit 300 

fanout超过指定数量的net也被定义为root,如图2:

4/8
图2.user specified root type 

set_app_options -name clock_opt.flow.optimize_ndr -value true

## 优化WNS关键路径的NDR rule,软约束

set_app_options -name clock_opt.flow.optimize_layers -value true

## 优化关键路径层次,改善时序

 8、spacing rule

set_clock_cell_spacing_rule -x_spacing 5.6 -y_spacing 0.65 -lib_cells */CKBUFXX

#控制CKBUFXX之间的spacing rule

create_keepout_margin -outer {0.28 0 0.28 0} [get_flat_cells -filter "ref_name =~ INV* &&


is_clock_network_cell == true"]

#所有的clock buf / inv都应该与其他cell有一定距离,对dynamic ir drop比较好

9、get_clock_tree_pins
 用来抓clock tree上的cell pin,包括root、create clock和generate clock的clock source
pin、ICG clock pin、 clock tree上的组合逻辑、CTS过程中插入的buf和inv,以及sink
pin,也可以-clock或者-from -to报指定范围的clock pin。

get_clock_tree_pins -uique_cells -filter "is_sink == 1"

## 所有的sink pin

get_flat_cells -of [get_clock_tree_pins -uique_cells -filter "is_on_repeater == 1 &&


is_cts_added == 1"]

##  cts阶段插的buffer和inverter

5/8
10、dont touch clock 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

 #先做func然后设dont touch,接下来一起CTS时func就不会被动到。

set_dont_touch_network -clock_only [get_pins xx/xx]

# 给[get_pins xx/xx]后面的clock network设dont touch

set_dont_touch [get_nets -segments $CTS_DONT_BUFFER_NET_LIST] true

#给net设dont touch 

11、clock balance group

create_clock_balance_group -name group -objects {clk1 clk2 ... ...} -offset_latencies {0


-100 ... ...}

report_clock_balance_groups

remove_clock_balance_groups group

# 工具根据sdc会自动把clock group做balance,用户可以自定义balance group,然后把


group内最长的clock path做平,用户可以用-offset_latencies指定相对长度

12、skew group

create_clock_skew_group -name sg1 -objects {reg1/CP reg2/CP reg3/CP}

# skew group可以指定一组sink pin只跟列表内彼此之间balance。

13、split clock cell

6/8
split_clock_cells -cells [get_cells U1/ICG*]

通过split clock cell的方式修DRC问题,前提是clock cell必须要有DRC,不能有dont


touch,size only或者fixed属性,split 之后产生的新cell后缀为split_XX。

14、mark clock tree as Synthesized


通过mark_clock_trees 标记已经长过tree的clock,可以利用这个命令实现分mode长tree,
比如先function后scan。

set_scenario_status -active true [get_scenario {FUNC SCAN}]

set_app_options -name cts.common.skip_cts_clocks -value scan_clk

clock_opt -from build_clock -to route_clock

mark_clock_trees -clock [get_object_name [remove_from_collection [all_clocks]


scan_clk]] -dont_touch -freeze_routing

set_app_options -name cts.common.skip_cts_clocks -value {}

clock_opt -from build_clock -to route_clock

15、remove clock tree


build clock阶段工具会先remove clock tree,用户也可以手动下命令remove_clock_trees -
clock,把tree上的buffer、inverter删掉,如果是dont touch、size only、fixed属性的cell不
会被动到。

foreach sce [all_scenario] {

current_scenario $sce

remove_clock_trees

16、report_clock_qor

7/8
report_clock_qor

#默认报告clock tree summary,包括latency、skew、tran/cap violation数量。clock 级


数,sink数量,repeater数量及面积。

report_clock_qor -clocks xx_clk -corners xx_corner -type local_skew -show_verbose_paths

## 报告local skew最差的timing path

report_clock_qor -clocks xx_clk -type latency -largest 1 -smallest 1 -show_verbose_paths

## 报告latency 最长和最短的path

8/8

You might also like