资讯详情

ICC2(三)Clock Tree Synthesis

一 Prerequisites for Clock Tree Synthesis

二 Defining the Clock Trees

1Deriving the Clock Trees

1.1 Identifying the Clock Roots

1.2Identifying the Clock Endpoints

2Defining Clock Tree Exceptions

2.1Defining Sink Pins

2.2Defining Insertion Delay Requirements

2.3Defining Ignore Pins

2.4 Ensuring Clock Tree Exceptions are Valid

3Restricting Optimization on the Clock Network

3.1Setting Don’t Touch Settings

3.2Setting Size-Only Settings

4Copying Clock Tree Exceptions Across Modes

5Deriving Clock Tree Exceptions From Ideal Clock Latencies

6Handling Endpoints With Balancing Conflicts

三 Verifying the Clock Trees

四Setting Clock Tree Design Rule Constraints

五 Specifying the Clock Tree Synthesis Settings

1 Specifying the Clock Tree References

1.1Deriving Clock Tree References for Preexisting Gates

1.2Restricting the Target Libraries Used

2Setting Skew and Latency Targets

3 Enabling Local Skew Optimization

4Specifying the Primary Corner for Clock Tree Synthesis

5Preventing Specific Clocks From Being Synthesized

6 Preserving Preexisting Clock Trees

7 Enabling Clock Tree Power Reduction Techniques

8 Reducing Electromigration

9 Handling Inaccurate Constraints During Clock Tree Synthesis

10 Defining Clock Cell Spacing Rules

11Creating Skew Groups

12Defining a Name Prefix for Clock Cells

13Using the Global Router During Initial Cock Tree Synthesis

14 Specifying Constraints for Clock Nets

15 Reducing Signal Integrity Effects on Clock Nets

16 Specifying Settings for Clock Latency Adjustments

17 Reporting the Clock Tree Settings

六 Implementing Clock Trees

1 Performing Standalone Clock Trees Synthesis

2 Synthesizing, Optimizing, and Routing Clock Trees With the clock_opt Command

2.1  Considering Voltage Drop Information During Clock Tree Synthesis

2.2  Using Nondefault Routing Rules for Critical Nets During Optimization

2.3 Enabling Layer Optimization 

2.4 Performing Concurrent Clock and Data Optimization

2.5 Performing Power or Area Recovery on the Clock Network 

2.6 Skipping Hold Fixing 

3 Controlling Concurrent Clock and Data Optimization

3.1 Limiting the Latency Adjustment Values 

3.2 Excluding Boundary Paths

3.3 Excluding Specific Path Groups

3.4 Excluding Specific Scenarios 

3.5 Excluding Specific Sinks 

3.6 Controlling Timing Optimization Effort 

3.7 Controlling Hold Time Optimization Effort 

3.8 Controlling the Adjustment of I/O Clock Latencies

3.9 Enabling Buffer Removal at the Postroute Stage 

3.10  Optimizing Targeted Path Groups or Endpoints at the Postroute Stage

3.11 Reporting Concurrent Clock and Data Timing            

4 Splitting Clock Cells

5 Balancing Skew Between Different Clock Trees

5.1 Defining the Interclock Delay Balancing Constraints

5.2 Generating Interclock Delay Balancing Constraints Automatically

6 Routing Clock Trees

7 Optimizing the Design After Clock Tree Synthesis and Clock Routing

8 Inserting Via Ladders During Clock Tree Synthesis, Optimization, and Clock Routing

 9 Marking Clocks as Propagated After Clock Tree Synthesis

10 Performing Postroute Clock Tree Optimization

11 Marking Clock Trees as Synthesized

12 Removing Clock Trees

七 Implementing Multisource Clock Trees

1 Introduction to Multisource Clock Trees Structures

2 Implementing a Regular Multisource Clock Tree

3 Implementing a Regular Multisource Clock Tree Using Integrated Tap Assignment

4 Implementing a Regular Multisource Clock Tree With an H-Tree-Only Global Clock Tree Structure

5 Implementing a Structural Multisource Clock Tree 

6 Inserting Clock Drivers

7 Synthesizing the Global Clock Trees

8 Creating Clock Straps

9 Routing to Clock Straps

10 Analyzing the Clock Mesh

11 Performing Automated Tap Insertion and Global Clock Tree (H-Tree) Synthesis

12 Specifying Tap Assignment Options and Settings

13 Building the Local Clock Subtree Structures

八 Analyzing the Clock Tree Results

1 Generating Clock Tree QoR Reports

2 Creating Collections of Clock Network Pins

3 Analyzing Clock Timing 


一 Prerequisites for Clock Tree Synthesis

在CTS之前,应该满足以下需求:

1)sdc中有create_clock 或 create_generated_clock约束。

2)block做过placement和optimization:

  • check_legality -verbose检查,所有cell都放置在合理的位置。
  • 解决congestion问题。
  • place ideal network时序接近收敛。
  • DRC(max_transition/max_capacitiance)问题也需要注意。

3)做好powerplan。

4)high-fanout net已经插buffer修过了(默认在place_opt initial_drc阶段工具会修)。

5)set_scenario_status -active,设置CTS的scenario。

二 Defining the Clock Trees

在运行CTS之前,分析每个clock tree并注意:

1)clock root的位置。

2)clock sink与clock tree exception。

3)clock tree上存在的cell,比如clock-gating cell。

4)clock tree之间是否有overlap。

5)clock tree与其他clock tree是或否有timing check,是否需要设置skew group。

ICC2通过trace clock root到clock endpoint建立clock tree,通常情况下,clock 的endpoint是时序cell与hard macro的Clock pin,ICG cell与generate clock的fanout除外。如果一个clock gating逻辑使用的non-unate cell(工作状态下输入与输出无法保持单调的相关性,与门的工作状态输出与输入正相关,或门的工作状态有两种,恒1或者负相关,所以或门是non-unate cell,与门不是),例如XOR、XNOR,工具trace clock path时使用positive-unate timing arc与negative-unate timing arc,如果trace一个non-unate cell影响功能实现, 对非clock的input使用set_case_analysis给输入设置恒定的值,示例如图1。

 图1

## 示例
icc2_shell> set_case_analysis 0 U0/B

ICC2使用create_clock命令定义clock source,即clock root,generate clock使用create_generate_clock定义,把master clock source作为generate clock的root,generate clock的endpoint也是它master clock的endpoint。

如果generate clock的master clock没有正确定义,会导致skew和时序变差或出错,特别是:

1)generate clock无法trace到master clock,generate clock的sink无法与master clock的sink balance。

2)如果generate clock的master clock不是create clock或create generate clock命令定义的,工具就没法长tree。

如果要获得正确时时钟树,必须对clock root做出正确的定义:

1)如果clock root在input port,必须准确的指定driving cell,如果给了一个驱动弱的driving cell,工具就会插额外的buffer去满足clock tree上的transition/capacitance 约束。如果不指定driving cell,工具就认为clock root有无限的驱动能力,

icc2_shell> set_driving_cell -lib_cell mylib/CLKBUF [get_ports CLK1]

2)如果clock root是一个IO PAD的input port,用户必须指定input port的input transition。

icc2_shell> set_input_transition -rise 0.3 [get_ports CLK1]
icc2_shell> set_input_transition -fall 0.2 [get_ports CLK1]

1.2  

生成clock tree,工具会定义两种clock endpoint:

1)sink pin

sink pin时需要balance的clock endpoint,工具定义从root到sink pin的延迟为insertion delay,并用这个值去做balance,在CTS过程中,工具优化sink pin的skew、insertion delay、DRC约束。sink pin也被叫做balance pin。

2)ignore pin

ignore pin也是clock endpoint,工具不会优化skew和insertion delay,但是会优化DRC,在CTS过程中工具会把ignore pin通过特殊命名的buffer与clcok tree分隔开,在ignore pin之后的clock pin,工具都不会优化skew与insertion delay,但是会修drc。

工具会把flip flop、latch、hard macro的clockpin作为sink pin,前提这个cell没有驱动generate clock。

工具把以下情况视为ignore pin:

  • 一个clock source是另一个clcok的fanout,那这个clock source相对于另一个来说就是ignore pin。如图2,clock2是clk1的ignore pin。(两个都是create clock定义的)

 图2

  •  时序单元的非clock pin。
  • 三态门的enable pin
  • output ports
  • 定义错误的clcok pin(例如:clock pin没有触发沿的信息,或者到output pin没有timing arc)
  • 使用set_case_analysis定义的buf/inv的输入pin,需要注意的是如果clock root被set_case_analysis定义了,那这个clock就无法长tree。
  • 没有fanout或没有enable信号timing arc的组合逻辑或ICG cell的输入。 

2 Defining Clock Tree Exceptions

clock tree exception是用户改变默认endpoint。 ICC2支持以下方式的clock tree exceptions:

1)自定义sink pin。

2)自定义insertion delay的需求。

3)自定义ignore pin。

定义clock tree exceptions使用set_balnace_points命令,报告set_balnace_points使用report_clock_balance_points。

2.1 

定义一个或多个sink pin,使用如下命令:

set_clock_balance_points
-clock clock
-consider_for_balancing true
-balance_points pins
[-corners corners]

set_clock_balances -clock与-corner不是必须选项,只不过工具会默认设置在所有clock和corner上,有针对的设置更能实现预期目标。

报告用户定义的sink pin,使用report_clock_balance_points命令,工具会报告用户定义的sink pin与ignore pin。移除set_clock_balance_point定义的sink pin使用remove_clock_balance_points命令。

icc2_shell> remove_clock_balance_points -clock [get_clocks CLK] \
-balance_points [get_pins U2/A]

2.2 

认为定义一个或多个sink pin的inseartion delay使用如下命令:

set_clock_balance_points
[-clock clock]
-delay delay
[-rise] [-fall] [-early] [-late]
-balance_points pins
[-corners corners]

-rise、-fall、-early、-late可以不设,默认都使用同样的值,-clock和-corner也是一样。不过这两个最好正确指定以免CTS结果在不同clcok下或不同corener下与预期相差甚远。

-delay设置默认-consider_for_balance true,正值会让其更短(单指这一路),负值会让其更长。

2.3 

定义ignore pin,使用如下命令:

set_clock_balance_points
[-clock clock]
-consider_for_balancing false
-balance_points pins

 

为了整明一个pin在clock network上,工具在CTS过程中使用is_clock_is_used_as_clock属性为true来检查,如果用户使用set_clock_balance_points给一个is_clock_is_used_as_clock属性为false的pin直射clcok tree exception,那么CTS就会忽视这条设置。示例如图3.

图3

默认情况下,U2/A、U2/Y、FF3/D pin的is_clock_is_used_as_clock属性都是false,且U2后面的逻辑都算是data path。U2/A算ignore pin。在CTS过程中,工具会在U2/A前面插一个特殊命名的buffer用作隔离,buffer后面的DRC问题作为data path优化。

如果要让FF3/D pin使用clock tree的约束去修DRC violation,可以使用如下方法:

1)给FF/D设置ignore pin。

icc2_shell> set_clock_balance_points -clock [get_clocks CLK] \
-consider_for_balancing false -balance_points [get_pins FF3/D]

2)使用set_sense -clock_leaf给FF3/D,让工具将其视为clock leaf(时钟树的endpoint,但未必是sink pin)。

icc2_shell> set_sense -clock_leaf [get_pins FF3/D]

clock leaf pin所在clock分支接的所有pin is_clock_used_as_clock属性都是true,leaf cell的output pin接的所有pin is_clock_used_as_clock属性都是false,检查is_clock_used_as_clock使用get_attribute。示例如下:

icc2_shell> get_attribute [get_pins FF3/D] is_clock_used_as_clock

3 Restricting Optimization on the Clock Network

用户可以使用如下方式限制clock network优化:

1)dont touch设置。

2)size only设置。

3.1  

给clcok tree设dont touch使用set_dont_touch_network命令。

icc2_shell> set_dont_touch_network -clock_only [get_pins pin_name]

如果不设置-clcok_only,dont touch设置就会同时设置在到指定pin的data和clcok path。移除clock tree上的dont touch属性使用-clear选项。

icc2_shell> set_dont_touch_network -clock_only [get_pins pin_name] -clear

用户也可以使用set_dont_touch针对具体某个cell或net设dont touch。

icc2_shell> set_dont_touch [get_cells cell_name] true
icc2_shell> set_dont_touch [get_nets -segments net_name] true

报告所有的dont touch设置使用report_dont_touch命令。

3.2 

针对cell的size only的设置使用set_size_only命令。

 set_size_only [get_cells cell_name] true

报告size only设置使用report_size_only命令。

icc2_shell> report_size_only -all

4 Copying Clock Tree Exceptions Across Modes

 使用set_clock_tree_options命令把clock tree exceptions从一个mode复制到其他mode。

## 示例
icc2_shell> set_clock_tree_options -copy_exceptions_across_modes \
-from_mode M1 -to_mode {M2 M3}

5 Deriving Clock Tree Exceptions From Ideal Clock Latencies

如果设计中存在ideal clock latency,用户可以使用derive_clock_balance_points命令将ideal clock latency转换成clock tree exception(set_clock_latency->set_clock_balance_points)。

1)针对用于时序分析的active scenario把ideal clock转成clcok balance point,generate clcok 不会,指定clcok使用-clcoks选项,指定corner使用-corner选项。

2)参考的latency值来自set_clcok_latency命令,指定不同的值使用-reference_latency。

3)默认会把产生的set_balance_points直接应用,如果要产生脚本,不直接应用,使用-output选项。

工具产生的set_clcok_banlance_points是指定clcok与corner的,但是set_clock_latency是针对所有clcok和所有mode设置的,所以就要求CTS要在最worst的corner下运行。

(Clock balance point delay value at the sink)=(Reference latency of the clock))- (Total ideal clock latency at the sink)

(Reference latency of the clock) =(ideal source latency) + (ideal network latency)

(Total ideal clock latency at the sink) = (ideal source latency)+ (ideal network latency for the sink)

所以(Clock balance point delay value at the sink) =(ideal network latency)-(ideal network latency for the sink)

示例:

## source latency的值被抵消掉了
icc2_shell> set_clock_latency -source 0.5 [get_clocks clk] 
icc2_shell> set_clock_latency 1.0 [get_clocks clk]
icc2_shell> set_clock_latency 1.5 [get_pin reg1/CK]
icc2_shell> set_clock_latency 0.5 [get_pin reg2/CK]

运行 derive_clock_balance_points命令,产生的clock balance points值为:

icc2_shell> set_clock_balance_points -delay -0.5 \
-balance_points [get_pin reg1/CK] -clock clk -corners worst
icc2_shell> set_clock_balance_points -delay 0.5 \
-balance_points [get_pin reg2/CK] -clock clk -corners worst

6 Handling Endpoints With Balancing Conflicts

有一些在结构上就无法balance的clock endpoint,工具CTS时会自动把它设成ignore pin来解决balance的冲突。关闭这个功能需要把“cts.common.enable_auto_exceptions”设置成false。

balance 冲突的类型如下:

1)一个block内部包含sink pin和穿过block的clock path,在top level无法在block内插buffer长tree,如果在block外长tree,那在top level经过block的clock path的tree只会更长,所以top level长tree时会把block内的sink设置为ignore pin。如图4 。

 图4

2)一个clock endpoint在另一个clock里是through pin,为了避免冲突会将它设置为ignore pin。如图5。clka的sink有FF1_1-10/CLK和FF0_1-10/CLK,clkb的sink有FF_gen/CLK和FF0_1-10/CLK,在clkb长tree时会把FF_gen/CLK设为ignore pin。

图5

三 Verifying the Clock Trees

在CTS之前使用check_clock_trees命令检查clock tree是否被正确定义,先解决报告中的问题在去长tree。

icc2_shell> check_clock_trees -clocks [get_clocks CLK]

如果不指定-clock,工具会检查所有的clock,check_clock_trees会检查时序约束,clock约束,绕线约束或者一些影响长tree的工具设置。如图6 。

      

图6 

四 Setting Clock Tree Design Rule Constraints

ICC2支持针对CTS的design rule约束:

1)max capacitance,使用 set_max_capacitance -clock_path。

## 给同一个mode下的所有corner设置一样的clockpath的max cap约束
icc2_shell> set_max_capacitance 0.6 \ 
 -clock_path [get_clocks -mode mode2] -corners [get_corner \
[get_attribute [get_mode mode2] associated_corners]]

2)max transition,使用set_max_transition -clcok_path。

## 给mode1的corner1设clock tran 0.15,corner2设0.1
icc2_shell> set_max_transition 0.15 -corners corner1 \
-clock_path [get_clocks -mode mode1]
icc2_shell> set_max_transition 0.10 -corners corner2 \
-clock_path [get_clocks -mode mode1]

五 Specifying the Clock Tree Synthesis Settings

1 Specifying the Clock Tree References

使用set_lib_cell_purpose -include cts指定长tree使用的clock buffer/inverter作为clock tree reference,clock tree reference列表需要满足以下要点:

1)至少要包含一个buffer或一个inverter。

2)要包含clock tree已经存在的cell类型(功能相同)。如果不包含这些,CTS不会resize这些cell。

3)multivoltage design要考虑添加alway on buffer的需要。

4)clock tree reference中熊包含dont_touch属性的library cell。,不然即便指定用它长tree,工具也不会用。

设置方式参考如下命令:

icc2_shell> set cts_cells list_of_cells
icc2_shell> set_lib_cell_purpose -exclude cts [get_lib_cells]
icc2_shell> set_lib_cell_purpose -include none [get_lib_cells $cts_cells]
icc2_shell> set_lib_cell_purpose -include cts [get_lib_cells $cts_cells]

1.1 

使用derive_clock_cell_references -output工具可以自动生成clock tree reference,前提是手动选择好CTS用的buffer/inverter和VT。示例如下:

icc2_shell> derive_clock_cell_references -output cts_leq_cells.tcl
icc2_shell> set_lib_cell_purpose -exclude cts [get_lib_cells */*]
icc2_shell> set_lib_cell_purpose -include cts {tech_lib/clk_buf* tech_lib/clk_inv*}
icc2_shell> source cts_leq_cells.tcl
## derive_clock_cell_references产生的文件可能有#注释,需要手动筛选去掉注释

1.2 

可以使用set_target_library_subset -clock在已有clock tree reference(set_lib_cell_purpose -include cts)基础上进一步限制top level/hierarchy cell长tree使用clock tree reference。此时需要设置set_app_options  -name opt.common.enable_target_library_subset_opt -value 1。

## 示例,先设置clock tree reference,然后限制hierarchy cell TOP/TSK_BLK只能用LVT
icc2_shell> set_lib_cell_purpose -include cts \ 
{HVT_lib/buf1 HVT_lib/buf2 LVT_lib/buf1 LVT_lib/buf2}
icc2_shell> set_target_library_subset -clock {LVT_lib} \
-objects [TOP/TSK_BLK]
icc2_shell> set_app_options \
 -name opt.common.enable_target_library_subset_opt -value 1

2 Setting Skew and Latency Targets

默认情况下,工具会尽力优化每个时钟的skew和latency,但因为花费太多的时间在低频时钟的面积功耗的优化上,导致工具放松了skew和latency的要求。

1)指定skew target使用set_clock_tree_options -target_skew。

2)指定latency target使用set_clock_tree_options -target_latency。

target_latency约束的是最小latency,作用不大,target_skew约束的是最大skew,软约束。

报告用户定义的skew target和latency target使用report_clock_tree_options命令。移除使用remove_clock_tree_options -all。

3 Enabling Local Skew Optimization

CTS阶段,工具默认会缩小global skew(最长最短clock path的差值),如果最差与最短的clock path之间没有timing check,优化global skew不会改善时序,但是优化local skew(timing path的launch与capture),用户可以借此改善时序,在local skew优化过程中,工具会改善setup、hold violation的local skew。

icc2_shell> set_app_options -list {cts.compile.enable_local_skew true}
icc2_shell> set_app_options -list {cts.optimize.enable_local_skew true}

设置如上命令,工具会产生skew target来帮助改善时序,忽略用户使用命令

set_clock_tree_options -target_skew设置的target skew,为了保证用户设置的target skew的有效性,使用如下设置。
icc2_shell> set_app_options \ 
 -name cts.common.enable_auto_skew_target_for_local_skew -value false

4 Specifying the Primary Corner for Clock Tree Synthesis

CTS开始时,工具会找出clock delay最差的一个corner作为首要的corner去插buffer长tree,用户可以自行指定最差的corner,使用cts.compile.primary_corner设置。

工具根据create clock和create generate clock的定义去长tree,工具提供设置指定某个clock跳过长tree。

icc2_shell> set_app_options \
 -name cts.common.skip_cts_clocks -value CK_B

6 Preserving Preexisting Clock Trees

CTS阶段会移除存在的clock buffer与inverter,避免这种行为使用如下设置。

icc2_shell> set_app_options \
 -name cts.compile.remove_existing_clock_trees -value false

7 Enabling Clock Tree Power Reduction Techniques

指定clock tree功耗优化的方案。使用 cts.compile.power_opt_mode设置。如图7.

图7 

两种方式,一种是拉近clcok gatng cell与driver的距离,一种是让clock cell尽量聚集在一起。

8 Reducing Electromigration

clock cell比data path上cell的功耗更大,clock cell聚集(cluster)在一起,增大了电流密度,也使EM(电迁移,大电流让金属层电子随流经金属的电子移动,导致金属断裂)的问题发生的概率增加了,ICC2使用增大clock cell之间间距的方法来减少EM问题。

## 示例
set_clock_cell_spacing_rule -x_spacing 5.6 -y_spacing 0.65 -lib_cells */CKBUFXX

9 Handling Inaccurate Constraints During Clock Tree Synthesis

在设计初期,sdc约束可能不准确或是卡的太严苛,运行CTS会因为低质量的clock tree浪费太多事runtime。用户可以设置如下命令,放松过分或错误需求的clock tree约束,减少runtime。

icc2_shell> set_app_options \
 -name cts.common.enable_dirty_design_mode -value true

1)忽略clock net上dont touch和dont touch network。

2)移除过紧的max transition和max capacitance约束。

3)移除过低的max length约束。

4)忽略过大的cell spacing rule。

5)忽略过大的spcing和width要求的NDR rule

6)报告足以导致latency增大的set_clock_balance_points -delay的值。

10 Defining Clock Cell Spacing Rules

使用set_clock_cell_spacing设置clock cell之间spacing rule。 -x_spacing,-y_spacing分别指定水平、竖直方向的spacing rule,过大的spacing会导致skew变差,原因是工具有意将sink放在一起(cluster)。默认情况下,该命令针对所有clcok cell,使用-lib_cells指定cell list,-clocks指定clock。

如果两个挨着的clcok cell都有设spacing rule,默认情况下,工具会把他们的间距设置成大于等于spacing rule间距之和,这就会让spacing过大,使用如下命令调整相邻cell spacing为二者spacing rule的最大值。

set_app_options -name cts.placement.cell_spacing_rule_style -value maxium
set_clock_cell_spacing_rule -x_spacing 5.6 -y_spacing 0.65 -lib_cells */CKBUFXX

报告clock cell spacing rule使用 report_clock_cell_spacings,移除使用remove_clock_cell_spacings (-lib_cells)

11 Creating Skew Groups

create_clock_skew_group指定一组sink只跟彼此balance。报告skew group使用report_clock_skew_groups,删除使用remove_clock_skew_groups。
icc2_shell> create_clock_skew_group -name sg1 \
-objects {reg1/CP reg2/CP reg3/CP}

12 Defining a Name Prefix for Clock Cells

使用如下设置定义clock cell的前缀名字。

icc2_shell> set_app_options \
-name cts.common.user_instance_name_prefix -value "CTS_"

指定优化阶段在data path上插的cell前缀名,使用如下命令:

icc2_shell> set_app_options \
-name opt.common.user_instance_name_prefix -value "PO_"
icc2_shell> place_opt

13 Using the Global Router During Initial Clock Tree Synthesis

默认情况下,synthesize_clock_trees长tree的初期阶段使用虚拟绕线,设置如下命令让synthesize_clock_trees改用global route。clock_opt默认用global route。

set_app_options -name cts.compile.enable_global_route -value true

14 Specifying Constraints for Clock Nets

 指定clock routing的NDR rule。减少clock routing的线上延迟,提高抗干扰能力。

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

15 Reducing Signal Integrity Effects on Clock Nets

提高clock net spacing可以减少SI(signal integrity)问题,工具可以在没有congestion的区域根据更大的spacing 需求产生NDR rule。 

icc2_shell> set_app_options \
-name cts.optimize.enable_congestion_aware_ndr_promotion -value true

工具产生的spcing rule的spacing至少是default spacing的两倍。

16 Specifying Settings for Clock Latency Adjustments

IO port通常用真实或虚拟时钟约束,在CTS之后clock约束的IO port的latency需要更新,确保boundary 约束是准确的,当使用clock_opt运行CTS,工具自动更新IO ports的clcok latency约束,可以使用set_latency_adjustment_options命令控制latency是否更新。

icc2_shell> set_latency_adjustment_options \
-reference_clock PC_CLK -clocks_to_update {VCLK1 VCLK2} \
-exclude_clocks VCLK3

如果使用 synthesize_clock_trees长tree,工具就不会自动更新clock latency,要完成更新操作,需要在CTS之后使用compute_clock_latency,这个命令也有set_latency_adjustment_options约束。

17 Reporting the Clock Tree Settings

报告时钟树的设置使用report_clcok_setting命令,默认情况下,该命令报告clock tree的设置,包括max tran/max cap的design rule约束,target skew、target latency,clock tree reference,clock cell的spacing rule,以及NDR rule。用户可以指定clock(-clock)和类型(-type)。

icc2_shell> report_clock_settting -type references
icc2_shell> report_clock_settting -type configurations ## drc、target skew/latency
icc2_shell> report_clock_settting -type spacing_rules
icc2_shell> report_clock_settting -type routing_rules

六 Implementing Clock Trees

1 Performing Standalone Clock Trees Synthesis

单独执行CTS使用 synthesize_clock_trees命令,

icc2_shell> synthesize_clock_trees

默认情况下synthesize_clock_trees之前采用虚拟绕线计算clock net时序,在CTS及优化阶段使用global route,需要注意的是synthesize_clock_trees并不会使用detail route。

2 Synthesizing, Optimizing, and Routing Clock Trees With the clock_opt Command

clock_opt分为以下三个阶段:

1)build_clock:时钟树综合(CTS)及优化,CTS之后工具将clcok tree设为propagated。

2)route_clock:对clock tree执行detail route。

3)final_opto:优化时序,DRC、面积、功耗,以及route clock。

用户可以使用-from和-to来限制build_clock到final_opto三个阶段。

2.1  

默认情况下,clock opt是不修IR drop问题的,因此clock buffer可能放到一个PG 电阻比较大的地方导致增加了IR drop。为了避免这个问题,工具提供以下流程让clock_opt使用redhawk分析电源网络的结果。(需要有RedHawk Analysis Fusion对应的license)

analyze_rail -min_path_resistance
open_rail_result
set_app_options -name clock_opt.flow.enable_voltage_drop_aware -value true
clock_opt

2.2  

为了改善时序,工具允许使用DNR rule对violation path进行优化,这是软约束。

icc2_shell> set_app_options -name clock_opt.flow.optimize_ndr \
-value true

2.3  

工具绕线时在min layer到max layer约束范围nei,针对violation path使用layer 优化,以此来改善时序。

set_app_options -name clock_opt.flow.optimize_layers -value true

 使用如下命令限制layer优化的使用范围(针对violation值)。

set_app_options -name clock_opt.flow.optimize_layers_critical_range -value 0.75

2.4 

在data path优化的过程中使用useful skew技术来改善时序, clock_opt默认使用ccd,关闭需要使用如下命令:

set_app_options -name clock_opt.flow.enable_ccd -value false

2.5  

如果打开了CCD的开关,工具会在final_opto执行clock power的优化,如果没有开CCD仍要优化clock power。需要使用如下命令。

icc2_shell> set_app_options \
-name clock_opt.flow.enable_clock_power_recovery \
-value power

执行clock power优化需要把set_scenario_status的-dynamic_power和-leakage_power开关打开。

如果能提供switching activity文件(read_saif)更准确。

如果要在final_opto阶段执行clock tree的面积优化(缩小clock cell、寄存器面积) 使用如下命令:

icc2_shell> set_app_options \
–name clock_opt.flow.enable_clock_power_recovery \
-value area

2.6  

默认情况下,clock_opt会在优化datapath时修hold violation,跳过修hold vilation使用如下命令:

set_app_options -name clock_opt.flow.skip_hold -value true

3 Controlling Concurrent Clock and Data Optimization

ccd在place_opt和clock_opt阶段都是默认开启的,route_opt阶段需要手动开启。

set_app_options -name route_opt.flow.enable_ccd -value true

3.1  

限制latency的调节效果使用如下命令:

icc2_shell> set_app_options \
-name place_opt.flow.enable_ccd_useful_skew_max_prepone -value 150ps
icc2_shell> set_app_options \
-name place_opt.flow.enable_ccd_useful_skew_max_postpone -value 50ps
## place opt阶段默认值为300ps和200ps

icc2_shell> set_app_options -list {ccd.max_prepone 0.2}
icc2_shell> set_app_options -list {ccd.max_postpone 0.1}

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

使用方法,不用CCD的情况下violation为 X,用CCD重新跑final_opto,preone和postpone都设置为X/2,对global skew影响比较小,时序也有改善。

3.2 

默认情况下,CCD会修所有violation path,如果不想修fanin或fanout接boundary port的boundary 寄存器使用如下命令。

set_app_options -name ccd.optimize_boundary_timing -value false

一些scan enable和reset的ports fanout接的需要寄存器,如果被当成boundary寄存器被上述命令在CCD优化时排除在外,使用如下命令在识别boundary寄存器时忽略这部分寄存器。

icc2_shell> set_app_options -name ccd.optimize_boundary_timing \
-value false
icc2_shell> set_app_options \
-name ccd.ignore_scan_reset_for_boundary_identification \
-value true

用户可以选择忽略的指定port的boundary path。

icc2_shell> set_app_options -name ccd.optimize_boundary_timing \
-value false
icc2_shell> set_app_options \
-name ccd.ignore_ports_for_boundary_identification \
-value {IN_A OUT_A}

3.3 

ccd优化跳过指定path group使用如下命令,该命令对place_opt、clock_opt、route_opt的ccd优化都又作用。

icc2_shell> set_app_options -name ccd.skip_path_groups \
-value {CLK1 {CLK2 scnA}}

3.4  

place_opt、clock_opt、route_opt的ccd优化跳过指定scenario。

icc2_shell> set_app_options -name ccd.ignore_scenarios \
-value {scnB}}

3.5  

ccd阶段跳过指定sink pin的优化使用如下命令:

icc2_shell> set_attribute -objects reg21/CK \
-name cts_fixed_balance_pin -value true

工具会给指定的pin加一个cts_fixed_balance_pin为true的属性,但是cts_fixed_balance_pin -value true仍然不保险,因为如果到指定sink pin路径上的clock cell同样出现在到其他sink pin的path上,当优化其他sink pin时,这些clock cell仍然会被动到,如果要保证到指定sink pin的clock cell不被动到,需要使用如下命令:

icc2_shell> set_attribute -objects reg21/CK \
-name cts_fixed_balance_pin -value upstream

3.6  

默认情况下,ccd优化阶段会致力于优化时序和功耗,用户可以改变优化时序的等级(level),命令如下:

set_app_options -name ccd.timing_effort -value high

默认值是medium,这个设置影响clock_opt和route_opt的final_opto阶段的ccd优化。 

3.7  

默认情况下,ccd会致力于修setup violation,但是,用户又hold violation比较难收敛的话,可以提高修hold的优先级。

set_app_options -name ccd.hold_control_effort -value medium/high/ultra

默认值是low, 提高修hold violation的优先级,会减少修setup violation的优先级,因此ccd提高修hold优先级的命令最好放在hold violation无法解决的情况下。这个设置影响clock_opt和route_opt的final_opto阶段的ccd优化。

3.8 

默认情况下,当clock_opt的build _clock阶段执行ccd时 ,工具会调整clock约束的boundary port的latency,后续使用compute_clock_latency命令也可以调用ccd技术调整IO latency。

以下情况工具不会更新IO latency。

1)ccd.adjust_io_clock_latency 设为 false或者ccd.optimize_boundary_timing设为false

2)ccd.skip_path_groups跳过IO path所在path group的优化。

3)set_latency_adjustment_options -exclude_clocks禁止指定clock的IO latency 调节。

 

当route_opt阶段使用ccd优化时设置如下命令,工具可以通过remove buffer和成对的inverter去改善时序。

icc2_shell> set_app_options -name route_opt.flow.enable_ccd \
-value true
icc2_shell> set_app_options -name ccd.post_route_buffer_removal \
-value true
icc2_shell> route_opt

3.10  

在route_opt执行ccd时,用户可以指定path group或者endpoint去优化,需要执行如下步骤:

1)route_opt.flow.enable_targeted_ccd_wns_optimization设置为true。

2)ccd.targeted_ccd_path_groups指定path group(前提不能使用ccd.skip_path_groups跳过)。

     ccd.targeted_ccd_end_points_file指定endpoint。

3)(Optional)指定优化方式ccd.targeted_ccd_select_optimization_moves。

❍ auto, 默认设置, 使用全部方式,包括插buffer。

❍ size_only,

❍ equal_or_smaller_sizing, swap cell或size down

❍ footprint_sizing, footprint相同才能size。

4)(Optional)指定优化的effort:ccd.targeted_ccd_wns_optimization_effort,默认是high,effort越高对指定path优化力度越大,但是其他path优化力度就会降低。
5)(Optional)指定修target path的阈值。ccd.targeted_ccd_threshold_for_nontargeted_path_groups,默认情况下只要指定的path有violation工具都会修。

route阶段,ccd有两种运行方式,一种是route_opt.flow.enable_ccd控制的regular CCD,一种是指定path group和endpoint的target CCD,后者应用在postroute阶段,也就是绕过线修过时序之后,针对剩下的violation endpoint或path group使用CCD去修。

open_lib design1
open_block blk.post_route
#Disable regular CCD optimization, which was previously performed
set_app_options \
 -name route_opt.flow.enable_ccd -value false
#Enable targeted CCD optimization
set_app_options \
 -name route_opt.flow.enable_targeted_ccd_wns_optimization \
 -value true
#Specify the path group and endpoints to target
set_app_options -name ccd.targeted_ccd_path_groups -value clkA
set_app_options -name ccd.targeted_ccd_end_points_file \
 -value clkA_ep.txt
#Specify the optimization type and effort
set_app_options \
-name ccd.targeted_ccd_select_optimization_moves -value size_only
set_app_options -name ccd.targeted_ccd_wns_optimization_effort \
-value medium
# Perform the targeted CCD optimization
route_opt

3.11             

使用 report_ccd_timing命令分析CCD的效果,默认情况下报告最差5条path的capture和launch 。如图8。

图8 

控制报告类型使用-type选项:

1)报告endpoint的fanin、fanout使用-type fanin/fanout。

2)报告前一级、当前级、后一级(previous, current, and next)的path使用-type stage或-type chain(前面每一级与后面每一级),Previous, Current, and Next Path Stages定义见图9

图9 

默认报setup最差的path,报hold的使用-hold。指定pin使用-pins。

使用 -prepone 或 -postpone分析ccd调整时序会产生的影响。 

icc2_shell> report_ccd_timing -pins Reg11/clk -postpone 0.02

使用 -annotate_net_delay或-annotate_cell_delay分析ccd调整指定cell或net delay会造成的影响。

icc2_shell> report_ccd_timing -annotate_cell_delay {
    
      {U1/a U1/y 0.2}} \
 -pin I2/d -type stage

4 Splitting Clock Cells

通过split clock cell解决DRC violation:

icc2_shell> split_clock_cells -cells [get_cells U1/ICG*]

如果cell没有drc问题,或者是dont touch、sizeonly fixed属性、set_freeze_ports影响的boundary port无法split clock cells。

split clock cell成功后,复制的cell命名为 “<original_cell_name>_split_<integer>”,设置和约束都跟原来的cell一样。

除了可以指定复制的cell外还可以指定loads。使用命令复制driver拆分loads。

icc2_shell> set loads1 [get_pins I1/reg*/CK]
icc2_shell> set loads2 [get_pins I2/reg*/CK]
icc2_shell> split_clock_cells -loads [list $load1 $load2]

5 Balancing Skew Between Different Clock Trees

工具能自动balance一个clock group的clock tree(generate clock 除外)彼此间的skew, 每组clock作为一个clock balance group。

5.1 

创建clock balance group使用create_clock_balance_group命令,至少指定group名字和clock group。

icc2_shell> create_clock_balance_group -name group1 \
-objects [get_clocks {clk1 clk2}]

 默认情况下两个clock之间的offset是0,如果需要让彼此间长度有所区别使用-offset_latency设置。

icc2_shell> create_clock_balance_group -name group3 \
-objects [get_clocks {clk1 clk2 clk3}] \
-offset_latencies {0 0 -100}

报告clock balance group使用report_clock_balance_groups命令移除使用remove_clock_balance_groups。

5.2 

锐单商城 - 一站式电子元器件采购平台