目录

一 Prerequisites for Clock Tree Synthesis

二 Defining the Clock Trees

1 Deriving the Clock Trees

1.1 Identifying the Clock Roots

1.2 Identifying the Clock Endpoints

2 Defining Clock Tree Exceptions

2.1 Defining Sink Pins

2.2 Defining Insertion Delay Requirements

2.3 Defining Ignore Pins

2.4 Ensuring Clock Tree Exceptions are Valid

3 Restricting Optimization on the Clock Network

3.1  Setting Don’t Touch Settings

3.2 Setting Size-Only Settings

4 Copying Clock Tree Exceptions Across Modes

5 Deriving Clock Tree Exceptions From Ideal Clock Latencies

6 Handling 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.1 Deriving Clock Tree References for Preexisting Gates

1.2 Restricting the Target Libraries Used

2 Setting Skew and Latency Targets

3 Enabling Local Skew Optimization

4 Specifying the Primary Corner for Clock Tree Synthesis

5 Preventing 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

11 Creating Skew Groups

12 Defining a Name Prefix for Clock Cells

13 Using the Global Router During Initial Clock 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。

Deriving the Clock Trees

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

1.1 Identifying the Clock Roots

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 Identifying the Clock Endpoints

生成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 Defining Sink Pins

定义一个或多个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 Defining Insertion Delay Requirements

认为定义一个或多个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 Defining Ignore Pins

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

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

2.4 Ensuring Clock Tree Exceptions are Valid

为了整明一个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  Setting Dont Touch Settings

给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 Setting Size-Only Settings

针对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 Deriving Clock Tree References for Preexisting Gates

使用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 Restricting the Target Libraries Used

可以使用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设置。

Preventing Specific Clocks From Being Synthesized

工具根据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 2set_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  Considering Voltage Drop Information During Clock Tree Synthesis

默认情况下,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  Using Nondefault Routing Rules for Critical Nets During Optimization

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

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

2.3 Enabling Layer Optimization

工具绕线时在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 Performing Concurrent Clock and Data Optimization

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

set_app_options -name clock_opt.flow.enable_ccd -value false

2.5 Performing Power or Area Recovery on the Clock Network

如果打开了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 Skipping Hold Fixing

默认情况下,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 Limiting the Latency Adjustment Values

限制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和200psicc2_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 Excluding Boundary Paths

默认情况下,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 Excluding Specific Path Groups

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 Excluding Specific Scenarios

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

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

3.5 Excluding Specific Sinks

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 Controlling Timing Optimization Effort

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

set_app_options -name ccd.timing_effort -value high

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

3.7 Controlling Hold Time Optimization Effort

默认情况下,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 Controlling the Adjustment of I/O Clock Latencies

默认情况下,当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 调节。

3.9 Enabling Buffer Removal at the Postroute Stage

当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  Optimizing Targeted Path Groups or Endpoints at the Postroute Stage

在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 Reporting Concurrent Clock and Data Timing

使用 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 Defining the Interclock Delay Balancing Constraints

创建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 Generating Interclock Delay Balancing Constraints Automatically

工具根据彼此间有timing check的clock产生balance group,使用如下命令:

icc2_shell> derive_clock_balance_constraints -slack_less_than -0.2

如上示例只产生slack小于-0.2 clock balance group。

在定义clock group之后使用balance_clock_groups命令指定clock group balance。

6 Routing Clock Trees

使用 synthesize_clock_trees单独长tree的命令是不包含route clock步骤的,需要对clock net进行detail route使用如下命令:

icc2_shell> route_group -all_clock_nets -reuse_existing_global_route true

-resue_existion_global_route使用线程的global route,保证绕线前后时序差异尽量小。

如果是使用clock_opt长tree,clock_opt是 包含clock net detail route的。

icc2_shell> clock_opt -from route_clock -to route_clock

7 Optimizing the Design After Clock Tree Synthesis and Clock Routing

CTS之后对时序、DRC、area、power做进一步优化使用 clock_opt -from final_opto 命令。

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

via ladder相当于梯子,把低层金属通过via array的形式一层一层连接到高层金属上,有助于减少via电阻,改善时序和EM问题。不过via ladder一般应用于相近工艺,via rule定义在physical tech file里。使用via ladder rule,用 set_via_ladder_rules和insert_via_ladders,如果设置如下命令,工具会在绕线时自动插入via ladder:

set_app_options -name opt.common.enable_via_ladder_insertion -value true

9 Marking Clocks as Propagated After Clock Tree Synthesis

工具会在CTS之后针对active scenario把长过tree的clcok的ideal属性设置为propagated,当CTS之后打开其他mode或scenario的active开关后,为防止clock tree被动到,可以设置如下命令将所有clock tree都标记成propagated。

icc2_shell> set_scenario_status -active true [all_scenarios]
icc2_shell> synthesize_clock_trees -propagate_

10 Performing Postroute Clock Tree Optimization

使用detail route和global route对于分析clock tree的长度时有影响的,这种影响来源于耦合电容与crosstalk的作用。工具提供优化绕线的命令:

icc2_shell> synthesize_clock_trees -postroute \-routed_clock_stage detail
icc2_shell> synthesize_clock_trees -postroute \-routed_clock_stage detail_with_signal_routes

11 Marking Clock Trees as Synthesized

mark_clock_trees命令标记长过tree的clock,可以用来执行分段长tree。比如先func后scan。

set_scenario_status -active true [get_scenario {FUNC SCAN}]set_app_options -name cts.common.skip_cts_clocks -value scan_clkclock_opt -from build_clock -to route_clockmark_clock_trees -clock [get_object_name [remove_from_collection [all_clocks] scan_clk]] -dont_touch -freeze_routingset_app_options -name cts.common.skip_cts_clocks -value {}clock_opt -from build_clock -to route_clock

12 Removing Clock Trees

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

foreach mode [all_mode] {
current_mode $mode
remove_clock_trees
}

七 Implementing Multisource Clock Trees

Introduction to Multisource Clock Trees Structures

multisource clock tree相较于传统clock 而言 受ocv影响更小,性能也更好。

multisource clock tree组成部分如下:

1)global clock structure:包括clock root、global clock tree、clock mesh driver、clock mesh。

2)lock subtree:这部分有两种形式,第一种subtree通过tap driver连接到clock mesh,subtree就可以通过传统的CTS(synthesize_clock_trees 或 clock_opt)命令长tree,所以这种结构叫做regular multisource clock tree(如图10);第二种subtree是直接连接在clcok mesh上的,这种叫做structural multisource clock tree(如图11)。

图10 Regular Multisource Clock Tree

图11 Structural Multisource Clock Tree

2 Implementing a Regular Multisource Clock Tree

regular multisource clock tree流程如下:

1)读入clock tree约束和设置

2)针对multivoltage design执行如下命令:

set_app_options -name cts.multisource.enable_full_mv_support -calue true
set_app_options -name opt.common.allow_physical_feedthrough -value true
check_mv_design ;#检查并解决multivolatage 问题

3)create_clock_drivers插tap driver。

4)create_clock_straps创建clock mesh。

5)create_clock_drivers插mesh driver。

6)synthesize_multisource_global_clock_trees创建global clock tree。

7)route_clock_straps完成clock mesh与tap driver的连接。

8)analyze_subcircuit分析clock mesh。

9)完成tap driver assignment的设置。

10)synthesize_multisource_clock_taps完成tap driver assignment。

11)完成local subtree的CTS与route,这个阶段会修DRC。

icc2_shell> clock_opt -from build_clock -to route_clock

12)分析clock tree。

3 Implementing a Regular Multisource Clock Tree Using Integrated Tap Assignment

在place_opt之前插入tap driver,工机具会让clock gating cell和和sink与他们的tap driver place的更近一些。 此举也有益于reg2clkgate的时序。

在place阶段之前执行regular multisource clock tree的流程如下:

1)读入place约束与设置

2)读入clock tree约束和设置

3)针对multivoltage design执行如下命令:

set_app_options -name cts.multisource.enable_full_mv_support -calue true
set_app_options -name opt.common.allow_physical_feedthrough -value true
check_mv_design ;#检查并解决multivolatage 问题

4)create_clock_drivers插tap driver。

5)create_clock_straps创建clock mesh。

6)create_clock_drivers插mesh driver。

7)synthesize_multisource_global_clock_trees创建global clock tree。

8)route_clock_straps完成clock mesh与tap driver的连接。

9)analyze_subcircuit分析clock mesh。

10)完成tap driver assignment的设置。

11)打开palce阶段做tap driver assignment的开关。

icc2_shell> set_app_options \
-name place_opt.flow.enable_multisource_clock_trees -value true

place阶段做tap assignment从initial_drc开始到final_place结束,工具给clock gating cell与sink就近分配tap driver时工具会做merge或split cell的操作。 在final_place 工具会调整clock gating cell与sink的位置,也允许重新分配tap driver。

12)完成local subtree的CTS与route,这个阶段会修DRC。

icc2_shell> clock_opt -from build_clock -to route_clock

13)分析clock tree。

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

由H-tree组成的global clock结构如下图所示,H-tree负责驱动tap driver。

图12 H-tree

使用H-ree做global clock tree结构的regular multisource clock tree structure流程如下:

1)读入约束和设置

2)针对multivoltage design执行如下命令:

set_app_options -name cts.multisource.enable_full_mv_support -calue true
set_app_options -name opt.common.allow_physical_feedthrough -value true
check_mv_design ;#检查并解决multivolatage 问题

3)完成regular multisource clock tree设置set_regular_multisource_clock_tree_options,插tap driver完成global clock tree(H-tree):synthesize_regular_multisource_clock_trees。

4)完成tap driver assignment的设置。

5)执行tap driver assignment,synthesize_multisource_clock_taps。

6)local subtree的CTS 与route clock net,这个阶段会修drc。

icc2_shell> clock_opt -from build_clock -to route_clock

7)分析clock tree。

5 Implementing a Structural Multisource Clock Tree 

structural multisource clock tree由clock mesh直接驱动subtree。 local subtree的优化仅限于clock cell的merge、split、size,移动位置,需要保持用户定义的clock tree结构的级数。

structural multisource clock tree,参考如下步骤:

1)读入clock tree约束和设置

2)针对multivoltage design执行如下命令:

set_app_options -name cts.multisource.enable_full_mv_support -calue true
set_app_options -name opt.common.allow_physical_feedthrough -value true
check_mv_design ;#检查并解决multivolatage 问题

3)create_clock_straps创建clock mesh。

4)create_clock_drivers插mesh driver。

5)synthesize_multisource_global_clock_trees创建global clock tree。

6)反标clock mesh的delay与transition,set_annotated_delay、set_annotated_transition,因为这个阶段工具还没有做subtree的CTS,所以clock mesh无法获得真实的delay、transition,这一步需要用户反标一个值给clock mesh。

7)synthesize_multisource_clock_subtrees完成local subtree。

8)route_clock_straps完成clock mesh与local subtree之间的连接。

9)analyze_subcircuit分析clock mesh。

10)完成从clock root为起点的整个clock tree的CTS
clock_opt -from build_clock -to route_clock

11)分析clock tree。

6 Inserting Clock Drivers

在插clock driver之前需要确保CTS的设置(包括NDR rule)都设置上了。

使用create_clock_drivers可以插mesh driver和tap driver,需要注意的是tap driver与mesh driver都是fixed属性,最后需要legalize_placement。

举例来说(如图13):

图13

在root与ICG之间(net clkA)插入tap driver。

icc2_shell> create_clock_drivers -loads [get_net clkA] \
-lib_cells [get_lib_cells my_lib/CKBUF8X] \
-boxes {5 5} -boundary [list {{200 200} {1000 1000}} ]

-loads指定插入tap driver的net,-boxes产生5X5的阵列,-boundary选定tap driver放置的范围。

在clock mesh完成后需要在root与mesh之间插入mesh driver。这之前clock mesh的net name就是clkA,但是在插入mesh driver之后root到mesh driver的名字变成clkA,而mesh的名字需要在插入mesh driver命令中指定。

icc2_shell> create_clock_drivers -loads [get_net clkA] \
-boxes {8 8} -lib_cells [get_lib_cells my_lib/CKBUF8X] \
-short_outputs -output_net_name clk_mesh \
-transfer_wires_from [get_nets clkA]

允许clock driver插入低hier层次:

set_editablity-blocks [get_deisgns -hierarchical] -value true
set_app_options -name top_level.optimize_subblocks -value all
set_app_options -name cts.multisource.enable_full_mv_support -value true
set_app_options -name cts.multisource.enable_mlph_flow -value true
set_app_options -name opt.common.allow_physical_feedthrough -value true

7 Synthesizing the Global Clock Trees

在clock driver(mesh、tap)插入之后,对global clock tree进行绕线(从root到mesh driver)。使用命令synthesize_multisource_global_clock_trees。

## -roots / -leaves 产生Htree结构
synthesize_multisource_global_clock_trees \
-roots [get_port clk1] -leaves [get_pins mesh_buf*/A] \
-use_zroute_for_pin_connections

8 Creating Clock Straps

在create tap driver之后使用create_clock_straps命令创建clock mesh。

icc2_shell> create_clock_straps -nets [get_net clk1_mesh] \
-layers {M7 M8} -widths {2.4 2.4} -types {stripe stripe} \
-grids {{20 1200 100} {60 980 150}} -boundary {{0 0} {1200 980}} -margin {1 1}

创建网状clock mesh(如图14),-width控制宽度,-grids控制stripe间距,第一个值20和60控制起点,第二个值1200和980控制终点,第三个值100和150控制间距,-boundary控制clock mesh范围。-margin控制stripe微调的范围以便stripe能放在track上。

图14

icc2_shell> create_clock_straps -nets [get_net clk1_mesh] \
-layers {M7 M8} -widths {2.4 3.6} -types {stripe user_route} \
-grids {{20 1200 100} {60 980 150}} -length 120 -backoff 5

使用backoff把网状的clock mesh断开,每条spine与垂直的stripe为一组,-backoff控制间距(如图15)。

图15

9 Routing to Clock Straps

对连接clock mesh的mesh driver输出与tap driver输入进行绕线,连接到clock mesh上。这里需要clock mesh的shape use属性为stripe,这个在create_clock_strap -types中控制,需要注意的是这里clock mesh的名字因为插了mesh driver之后发生了变化,变成了用户指定的net name。

route_clock_straps支持comb和fishbine两种绕线方式(如图16),默认是finshbone,相邻的clock loads连接到一条支路上再连接到clock mesh上,comb则是clock load直接连接clock mesh。使用-topology comb切换。

图16

route_clock_straps -net clk_mesh

使用-fishone_fanout、-fishbine_span、-fishbone_sub_span、-fishbone_layer控制fishbone。(如图17)。

图17

10 Analyzing the Clock Mesh

使用analyze_subcircuit命令调用仿真工具分析clock mesh,使用-simulator选择仿真工具(NanoSim, FineSim, or HSPICE),默认是NanoSim,使用-driver_subckt_files和-spice_header_files指定spice网表与晶体管级模型文件。

icc2_shell> analyze_subcircuit -net clk_mesh \
-driver_subckt_files max_spice_model \
-spice_header_files header_file \
-configuration { \
{-scenario_name scenario1 \
-max_driver_subckt_files max_file1 \
-max_spice_header_files header_max1 \
-min_driver_subckt_files min_file1 \
-min_spice_header_files header_min1} \
{-scenario_name scenario2 \
-max_driver_subckt_files max_file2 \
-max_spice_header_files header_max2 \
-min_driver_subckt_files min_file2 \
-min_spice_header_files header_min2}}
-simulator hspice \
-name clk_mesh_analysis

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

在插入tap driver和synthesize global clock tree(H-tree)之前使用set_regular_multisource_clock_tree_options命令做如下设置。

1)-clock指定clock name。

2)-topology htree_only指定拓扑方式。

3)-tap_lib_cells指定tap driver的lib cell list,前提是在set_lib_cell_purpose -include cts列表里。

4)-htree_lib_cells指定synthesizing the global clock tree (H-tree)的lib cell。同样要在set_lib_cell_purpose -include cts列表里。

在完成设置之后,使用synthesize_regular_multisource_clock_trees插入tap driver建立H-tree,这个命令包含两个阶段。也可以用-from/-to选择指定阶段去run。

1)tap_synthesis:插tap driver。

2)htree_synthesis:建立htree驱动tap driver。

## Include only tap driver and H-tree library cell for CTS
set cts_references [get_lib_cells -filter valid_purposes=~*cts*]
set_lib_cell_purpose -exclude cts [get_lib_cells $cts_references]
set_lib_cell_purpose -include cts { LIB1/BUF1 LIB1/BUF2}
## Set up and insert tap drivers and build H-tree
set_regular_multisource_clock_tree_options \
-clock clk -topology htree_only -tap_boxes {4 2} \
-tap_lib_cells [get_lib_cells */CKBUF*] \
-htree_lib_cells [get_lib_cells */CKINV*] \
-htree_layers "m9 m10" -htree_routing_rule "htree_ndr"
synthesize_regular_multisource_clock_trees
## Reapply CTS library cell list as required for the subsequent steps
set_lib_cell_purpose -include cts [get_lib_cells $cts_references]

12 Specifying Tap Assignment Options and Settings

在synthesize_multisource_clock_taps运行tap assignment之前,需要执行以下步骤:

1)检查clock tree上dont_touch, size_only, fixed,  locked属性,以免clock cell无法split和merge。

2)使用set_multisource_clock_tap_options对tap assignment进行设置。指定clock(-clock)、重新分配tap driver驱动的sink(-driver_objects),重新分配sink的tap driver的数量(-num_taps),这数量要和-driver_objects对应上。为了避免工具merge指定clock tree cell可以使用-dont_merge_cells设置。

report_multisource_clock_tap_options
remove_multisource_clock_tap_options

3)(optional)create_multisource_clock_sink_group为tap assignment创建sink group。

• remove_multisource_clock_sink_groups
• report_multisource_clock_sink_groups
• get_multisource_clock_sink_groups
• add_to_multisource_clock_sink_group
• remove_from_multisource_clock_sink_group

4)(optional)指定merge和split之后cell的前缀与后缀名。

set_app_options -name cts.multisource.subtree_merge_cell_name_prefix -value XX
set_app_options -name cts.multisource.subtree_merge_cell_name_suffix -value XX
set_app_options -name cts.multisource.subtree_split_cell_name_prefix -value XX
set_app_options -name cts.multisource.subtree_split_cell_name_suffix -value XX
set_app_options -name cts.multisource.subtree_split_net_name_prefix  -value XX
set_app_options -name cts.multisource.subtree_split_net_name_suffix -value XX

13 Building the Local Clock Subtree Structures

在structural multisource clock tree中,local subtree之间接在clock mesh上,用户可以对local subtree做CTS,使用synthesize_multisource_clock_subtrees命令。

在对local subtree做CTS之气那,必须:

1)建立global clock tree。

2)对clock mesh的延迟与transition进行反标analyze_subcircuit之后产生的set_annotated_delay 和set_annotated_transition命令。

3)移除clock cell上不必要的dont_touch, size_only, fixed, locked属性。

4)set_multisource_clock_subtree_options对subtree CTS做设置。

synthesize_multisource_clock_subtrees工具会执行以下步骤:
1)merge clock cell,移除cluster sink之间人工设置的boundary。
2)split、size、调整clock cell位置,让第一级clock cell靠近clock strap。
3)route clock nets。默认global route,用户可以指定fishbone的绕线方式,通过以下设置可以创建一个detail route的fishbone结构,如图18。
cts.multisource.subtree_routing_mode
cts.routing.fishbone_max_tie_distance
cts.routing.fishbone_max_sub_tie_distance
cts.routing.fishbone_bias_threshold
cts.routing.fishbone_bias_window
cts.routing.fishbone_horizontal_bias_spacing
cts.routing.fishbone_vertical_bias_spacing

图18

4)再次优化clock cell,使用size cell和调整位置。

以上四个阶段可以使用synthesize_multisource_clock_subtrees -from/-to来控制(

merge, optimize, route_clock, refine.)

八 Analyzing the Clock Tree Results

Generating Clock Tree QoR Reports

report_clock_qor 报告clock tree qor报告,常用的type(-type)有summary、latency、drc_violators、local_skew。需要注意的是report_clock_qor的报告是不包含derate信息的。

默认情况下,直接使用report_clock_qor报告的就是summary,包含每个clock的sink数量,级数、clock repteater数量及面积、global skew、latency、drc数量。

Creating Collections of Clock Network Pins

get_clock_tree_pins可以对clock cell的pin分类进行统计,例如计算clock cell数量(clock repeater、ICG、sink等)。

## 获取所有的sink pin
get_clock_tree_pins -uique_cells -filter "is_sink == 1"
## 获取cts阶段插的buffer和inverter
get_flat_cells -of [get_clock_tree_pins -uique_cells -filter "is_on_repeater == 1 && is_cts_added == 1"]
## 获取 ICG pin
set clk1_icg_pin [get_clock_tree_pins -filter is_on_ICG -clocks clk1]

Analyzing Clock Timing

report_clock_timing报告clock tree是包含derate信息的,用来分析实际timing path中的local skew比reprot_clock_qor更好用,local skew对应的type(-type)是skew,global skew对应的type是interclock_skew,report_clock_timing也支持latency和transition的报告。

ICC2 user guide(三)Clock Tree Synthesis相关推荐

  1. 数字IC后端流程——(四)时钟树综合Clock Tree Synthesis

    参考原博地址:https://blog.csdn.net/weixin_46752319/article/details/107387584 ICC时钟树综合 时钟树综合就是指从某个clock的roo ...

  2. ICC2 user guide(二)Placement and Optimization

    目录 一 Specifying Coarse Placement Constraints and Settings 1 Defining Keepout Margins 2 Defining Area ...

  3. ICC2 user guide(四)Routing and Postroute Optimization

    这部分主要介绍ICC2 Zroute绕线工具和postroute优化内容,Zroute能有效处理45nm及以下工艺的设计与DFM(design for manufacturing). 一 Introd ...

  4. sqoop 中文文档 User guide 三 export

    9.sqoop-export 9.1. Purpose9.2. Syntax9.3. Inserts vs. Updates9.4. Exports and Transactions9.5. Fail ...

  5. clock synthesis

    史上最全的数字IC后端设计实现培训教程(整理版) 数字IC时钟树综合(clock tree synthesis)专家必备 - 后端资料区 - EETOP 创芯网论坛 (原名:电子顶级开发网) - 一 ...

  6. ICC使用----ICC 1 Lab Guide学习笔记

    文章目录 Preface ICC 1 Lab Guide Note: 1.Data Setup & Basic Flow(P27) Learning Objectives Create a M ...

  7. 数字后端面试问答No.10-12(每日三问)

    数字后端面试问答No.10-12(每日三问) 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 周末了,今天继续为大家分享三道数字后端面试题目.这三道题,其中 ...

  8. 秒杀数字后端实现中clock gating使能端setup violation问题

    秒杀数字后端实现中clock gating使能端setup violation问题 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 点击标题下「蓝色微信名」 ...

  9. IC后端物理实现自动化工具 OpenROAD系列(三)ibex-32位2级流水线 RISC-V CPU 的物理实现

    我是***雪天鱼***,一名FPGA爱好者,研究方向是FPGA架构探索. 关注公众号,拉你进"IC设计交流群". 文章目录 一.配置文件查看 1.1 PDK 配置 1.2 设计配置 ...

最新文章

  1. Apache htpasswd命令
  2. android收费知乎,知乎 Android 端的一次重设计练习
  3. 联想小新电脑dns服务器未响应,Lenovo Quick Fix 联想智能解决工具
  4. 小用lambda函数
  5. HTML5 音频视频
  6. 【AI自学】 完备的 AI 学习路线,最详细的资源整理!
  7. mysql支持数据安全的引擎_2、MySQL常见数据库引擎及比较?
  8. java case用法_Go语言 | goroutine不只有基础的用法,还有这些你不知道的操作
  9. 各类编程开发软件及资源全版本下载地址合集
  10. python连数据库课程设计报告_sql数据库课程设计报告书
  11. 伴风网易博客linux,网易博客链接
  12. Global Tracking Transformers 详细解读
  13. networks.demo_dev.ipam.config value Additional properties are not allowed (‘gateway‘ was unexpected)
  14. 虚拟机镜像的创建方法
  15. “软件工程”学习笔记、复习资料
  16. 油管大神教波士顿机器狗学撒尿-给自己倒啤酒,网友:太恶趣味了
  17. java读取.html文件并获取数据
  18. HDU 6608 Fansblog——————大素数检测
  19. 大二学科不挂科 速冲方法推荐(数据结构+计组+操作系统+算法+数据库+计网)
  20. Linux中的if-then语句

热门文章

  1. 我的苦逼app盈利之路!
  2. 计算机通信原理基础知识总结
  3. PHP初级学习(一)
  4. 没有功德的人就在眼前--我看到了“裸男”
  5. ipa解包打包工具_【原】ios打包ipa的四种实用方法(.app转.ipa)
  6. 世界上第一台电子计算机adc,2004山东公务员考试计算机专业理论题
  7. 一起来探索从双击程序到开始运行期间计算机经历了哪些过程
  8. 当你使用笔记本电脑插入公司的局域网后你的wifi功能无法上网了,而且公司局域网没有外网,怎么既可以进公司局域网又可以上外网
  9. php导出excel无边框线,phpexcel设置边框不全或者只有竖线问题解决方法
  10. Cell(华表)组件的方法