找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 659|回复: 1

[转帖] Innovus流程(3)-CTS

[复制链接]

20

主题

1

回帖

148

积分

技术员

积分
148
发表于 2023-6-8 11:18:04 | 显示全部楼层 |阅读模式
place完成后,如果timing没有太大的violation就可以进行CTS了。CTS主要作用是将clock root连接到所有的sinks端(时序器件的CK pin、macro的CK pin),满足DRC要求并尽量保证clock insertion delay一样长。一个好的时钟树会使得后面的timing优化很容易,不好的时钟树可能会引起大量的hold violation问题。下面就说说跑CTS之前需要准备的一些工作。

1.DRC约束
max_transition、max_cap、max_fanout、max_length、skew、latency这些指标
  1. set_ccopt_property target_skew $skew_value
  2. set_ccopt_property target_insertion_delay $delay_value
  3. set_ccopt_property max_fanout $max_fanout
  4. set_ccopt_property target_max_capacitance $max_cap
  5. set_ccopt_property target_max_trans $max_tran
复制代码
2.开启useful skew
  1. setOptMode -usefulSkew true
  2. setOptMode -usefulSkewCCOpt standard
  3. setUsefulSkewMode -maxAllowedDelay 0.05
复制代码
3.设置clock cell
设置时钟树用哪些cell(inv、buf、ICG等),以及是否只用INV不用BUF长时钟树
  1. set_ccopt_property buffer_cells [list CKBD8BWP6T16P96CPDULVT CKBD10BWP6T16P96CPDULVT CKBD12BWP6T16P96CPDULVT   ]
  2. set_ccopt_property inverter_cells [list CKND8BWP6T16P96CPDULVT CKND10BWP6T16P96CPDULVT CKND12BWP6T16P96CPDULVT ]
  3. set_ccopt_property clock_gating_cells [list CLKNQD2BWP6T16P96CPDULVT CLKNQD4BWP6T16P96CPDULVT CLKNQD6BWP6T16P96CPDULVT]
  4. set_ccopt_property logic_cells [list */CK*]
  5. set_ccopt_property use_inverters true
  6. set_ccopt_property clustering_mix_inverters_and_buffers false
复制代码
4.设置root点
规定当fanout的数量超出设定值时,工具把该点当做clock root点,命令如下:
  1. set_ccopt_property routing_top_min_fanout 2000
复制代码
5.创建ndr
clock net一般翻转率比较快,为了减小crosstalk对时钟树的影响,一般都会设置ndr。innovus将clock net分成了3种类型:top、trunk和leaf。top指的是clock root,leaf指的是和sinks点的前一级clock cell,trunk指的是介于top和leaf之间的clock cell。
  1. add_ndr –name $ndr_name –width_multiplier {3:6 2} –spacing_multiplier {3:6 2} –generate_via
  2. create_route_type –name TOP –top_preferred_layer M6 –bottom_preferred_layer M5 \
  3. –preferred_routing_layer_effort medium –non_default_rule $ndr_name –shield_net VSS
  4. create_route_type –name TRUNK –top_preferred_layer M6 –bottom_preferred_layer M5 \
  5. –preferred_routing_layer_effort medium –non_default_rule $ndr_name
  6. create_route_type –name LEAF –top_preferred_layer M6 –bottom_preferred_layer M3 \
  7. –preferred_routing_layer_effort medium
  8. set_ccopt_property route_type TOP –net_type top
  9. set_ccopt_property route_type TRUNK –net_type trunk
  10. set_ccopt_property route_type LEAF –net_type leaf
复制代码
上面是创建ndr的脚本:clock tree采用M3-M6绕线,2倍宽度,2倍间距。为了避免DRC问题,leaf cell不使用ndr规则。

6.inter-clock做balance
innovus根据sdc中的时钟定义来生成对应的skew group。每个skew group各自长时钟树。同一个skew group中所有的sink点做balance,不同skew group中的sink点不做balance。所以不同skew group的tree不一样长,为了实现不同skew group的tree一样长,命令如下:
  1. create_ccopt_skew_group –name clk1 –source clk1 –auto_sinks
  2. create_ccopt_skew_group –name clk2 –source clk2 –auto_sinks
  3. create_ccopt_skew_group –name clk3 –balance_skew_groups {clk1 clk2} –target_skew 10
复制代码
7.clock tree中sink type的设置
可以将某些sink点设置成exclude pin,时钟树balance时不考虑该pin。也可以将某些sink点设置成floating pin,使其时钟树变长或者变短,来满足timing要求。
  1. set_ccopt_property sink_type exclude–pin $pin_name
  2. set_ccopt_property sink_type ignore–pin $pin_name
  3. set_ccopt_property sink_type through–pin $pin_name
  4. set_ccopt_property sink_type stop–pin $pin_name
  5. #设置floating pin
  6. set_ccopt_property insertion_delay –pin $pin2_name 0.03(时钟树变短)
  7. set_ccopt_property insertion_delay –pin $pin3_name -0.03(时钟树变长)
复制代码

类型 是否需要balance 是否需要修复DRV
stop pin
through(non-stop) pin
ignore pin
exclude pin
floating pin

使用下面的命令报出exclude pin、stop pin和ignore pin:
  1. report_ccopt_clock_trees -list_special_pin
复制代码
8.将clock tree上小尺寸的cell换成正常尺寸
将时钟树上已存在的clock cell抓出来,如果尺寸小于X6则替换成X6的cell。如果lib中没有X6尺寸的cell,则替换成X4的,没有X4则替换成X3的,没有X3则替换成X2的。
  1. set clocks [get_clocks clk]
  2. set sources [get_attribute $clock sources]
  3. set pins [add_to_collection "" ""]
  4. set pins [add_to_collection -uniq $pins $sources]
  5. foreach_in_collection pin $pins {
  6. set cell [get_cells -q -of_object $pin]
  7. set cell_name [get_attribtue $cell full_name]
  8. set ref_name [get_attribtue $cell ref_name]
  9. regsub -all "BWP6T.*" $ref_name "" ref_dnum
  10. set tmp_ref_dnum $ref_dnum
  11. regsub -all .*D $tmp_ref_dnum  "" ref_dnum
  12. set dnum 6
  13. #如尺寸小于6则替换成6
  14. if {$dnum > $ref_dnum} {
  15.   regsub -all "D.*BWP6T" $ref_name "D${dnum}BWP6T" new_ref_name
  16. }
  17. #如果lib中没有X6尺寸的cell,则替换成X4尺寸的cell
  18. set lib_cell [get_lib_cells -q */${new_ref_name}]
  19. if {![sizeof_collection $lib_cell]} {
  20.    set dnum 4
  21.   regsub -all "D.*BWP6T" $ref_name "D${dnum}BWP6T" new_ref_name
  22. }
  23. #如果lib中没有X4尺寸的cell,则替换成X3尺寸的cell
  24. set lib_cell [get_lib_cells -q */${new_ref_name}]
  25. if {![sizeof_collection $lib_cell]} {
  26.    set dnum 3
  27.   regsub -all "D.*BWP6T" $ref_name "D${dnum}BWP6T" new_ref_name
  28. }
  29. #如果lib中没有X3尺寸的cell,则替换成X2尺寸的cell
  30. set lib_cell [get_lib_cells -q */${new_ref_name}]
  31. if {![sizeof_collection $lib_cell]} {
  32.    set dnum 2
  33.   regsub -all "D.*BWP6T" $ref_name "D${dnum}BWP6T" new_ref_name
  34. }
  35. setEcoMode -refinePlace flase
  36. setEcoMode -honorDontUse false
  37. setEcoMode -honorDontTouch false
  38. setEcoMode  -honorFixedStatus false
  39. ecoChangeCell -cell $new_ref_name -inst $cell_name
  40. }
  41. setEcoMode -reset
复制代码
9.运行ccopt_design
执行ccopt_design后,innovus会长好时钟树并进行timing的优化。如果想做一个快速的CTS,即只做clustering这一步,不做balancing、clock nets routing和post-conditioning。命令如下:
  1. set_ccopt_property –balance_mode cluster
  2. ccopt_design -cts
复制代码
10.报出所有skew group中最长和最短的clock path
  1. report_ccopt_skew_groups -summary
复制代码


从上图可以看出时钟树的skew,以及最长的path和最短的path。

11.启动clock tree debugger
执行下面的命令会自动打开CTD界面,查看clock tree的结果是否有异常。
  1. ctd_win
复制代码

也可以在layout中高亮出最长的路径:
  1. ctd_trace –from [lindex [get_ccopt_skew_group_path –skew_group <skew_group_name> -longest] 0] –to [lindex [get_ccopt_skew_group_path –skew_group <skew_group_name> -longest] end] –color red
复制代码


12.查看log是否有异常
Innovus在执行CTS时会产生Clock DAG关键词,搜索这个关键词可以看到各个步骤完成后的结果。首先是cluster,发现昨晚cluster时,时钟树的insertion delay为278ps,skew为97ps。


之后会做power和DRV(transition、insertion delay、skew)的优化,做完后发现insertion delay为284ps,skew为51ps。可以发现,insertion delay没有太大变化,skew变小了,说明这个步骤没有异常。


最后会做clock tree routing,做完发现insertion delay变成了293ps,skew变成了44ps,说明clock tree的routing没有问题。


实际上CTS的步骤有很多,上面只是列举了一些常见步骤。可以查看每一步完成后的insertion delay和skew,判断该步骤是否有问题。比如,做完cluster之后insertion delay比较合理,但是在做完balance后insertion delay突然变得很大。这可能是有一些很长的sink端,为了满足skew,导致clock tree被拉长。又比如,clock tree在做完routing后变得很差,可能是绕线资源不足,也可能是ndr设置的不合理等等。

2.CTO
CTS跑完之后执行CTO来优化timing,包括setup和hold。核心命令如下所示。不过在此之前,还需要一些设置
  1. optDesign -postCTS -setup -hold
复制代码
1.允许恶化setup的TNS来修复hold
  1. setOptMode -fixHoldAllowedSetupTnsDegrade true
复制代码
2.更新clock latency
  1. set_interactive_constraint_mode [all_constraint_modes -active]
  2. reset_clock_latency *
  3. reset_propagated_clock *
  4. update_io_latency
  5. set_propagated_clock [all_clocks]
  6. set_interactive_constraint_mode [list]
复制代码
3.修复hold前的common setup设置
  1. setOptMode -fixHoldAllowOverlap auto -fixHoldAllowResizing true \
  2.            -fixHoldOnExcludedClockNets false -holdFixingCells [BUFFD2BWP6T16P96CPDLUVT BUFFD1BWP6T16P96CPDLUVT] \
  3.            -holdTargetSlack 0 -ignorePathGroupsForHold [list in2reg reg2out feedthr] \
  4.            -reclaimArea default -setupTargetSlack 0.04 \
  5.            -postRouteAreaReclaim holdAndSetupAware
复制代码

上面的一些设置主要包括:用哪些类型的stdcell修复hold、哪些path group不参与hold的修复、允许size cell、不修复exclude pin、hold的目标是0ns、只对setup大于0.04ns的path修复hold等。

4.设置完成后,执行下面的命令修复timing
  1. optDesign -postCTS -setup -hold -prefix POSTCTS_HOLD
复制代码

至此,CTS的主要步骤已完成,下面就是Route了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
EDA1024论坛免责声明
请勿上传侵权资料及软件! 如果发现资料侵权请及时联系,联系邮件: fenxin@fenchip.com QQ: 2322712906. 我们将在最短时间内删除。

36

主题

463

回帖

523

积分

工程师助理

积分
523
发表于 2023-12-30 20:58:37 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|EDA1024技术论坛

GMT+8, 2024-5-18 14:38 , Processed in 0.045842 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表