参考资料ICC2 User Guide Version M-2016.12-SP4• Prerequisites for Clock Tree Synthesis做时钟树的先决条件1.定义了create_clock或create_generated_clock2.已经placement且合法化且满足QoR满足QoR包括CongestionTimingMaximum capacitance;Maximum transition time.3.电源和地线已经被prerouted.4.高扇出的线已经被buffer.5.Active scenarios已经被定义。• Analyzing the Presynthesized Clock Tree一些概念性的东西暂时忽略。• Defining the Clock Trees• Deriving the Clock Trees一些概念性的东西可以指定一个组合电路的端口为固定值从而可以进行时序分析如下图确定根时钟create_clock create_generated_clock定义根时钟的时序特点set_driving_cell -lib_cell mylib/CLKBUF [get_ports CLK1] set_input_transition -rise 0.3 [get_ports CLK1] set_input_transition -fall 0.2 [get_ports CLK1]定义时钟endpoints工具确认两种类型为时钟分析结束点Sink pins和Ignore pins.Sink pins包括1.时序电路的Clock pin2.macro的clock pinIgnore pin包括1.另外一个时钟的source pin2.没有时钟输入pin的时序单元3.三态的使能pin4.输出端口5.不正确的时钟定义pin6.set_case_analysis定义的buffer和反向器的输入pin7.没有扇出的集成clock-gating或组合电路的输入pin且没有使能时序弧.• Defining Clock Tree Exceptions时钟树综合默认有一套自动规则自动识别所有时钟终点、自动做等长平衡、自动插缓冲器优化时序。 Clock Tree Exceptions 就是人工手动改写这套默认规则给部分时钟分支 / 引脚设置特殊处理方式解决特殊电路结构带来的 CTS 违规、时序问题。例外规则包括1.Defining Sink Pinsset_clock_balance_points -clock clock -consider_for_balancing true -balance_points pins [-corners corners] report_clock_balance_points remove_clock_balance_points2.Defining Insertion Delay Requirementsset_clock_balance_points [-clock clock]-delay delay [-rise] [-fall] [-early] [-late]-balance_points pins [-corners corners]3.Defining Ignore Pinsset_clock_balance_points -clock [get_clocks CLK[] \ -consider_for_balancing false -balance_points [get_pins U2/A]4.Setting Don’t Touch Exceptionsset_dont_touch_network -clock_only [get_pins pin_name]5.Setting Size-Only Exceptionsset_size_only [get_cells cell_name] true report_size_only -all• Copying Clock Tree Exceptions Across Modesset_clock_tree_options -copy_exceptions_across_modes -from_mode M1 -to_mode {M2 M3}• Deriving Clock Tree Exceptions From Ideal Clock Latencies• Handling Endpoints With Balancing Conflicts工具为了解决平衡冲突会自动将一些点作为ignore pin这个功能默认是开的可以设置成关cts.common.enable_auto_exceptionsmodule里面有sink pin且同时有组合电路因为在module里面不能插入buffer所以会将内部的check pin作为ignore pin来处理。sink pin不能被同时平衡的情况FF_gen/CLK 和 FF0_1-10/CLK是clkb的sinkFF1_1-10/CLK 和 FF0_1-10/CLK是clka的sinkFF_gen/CLK是FF1_1-10/CLK的源时钟工具在平衡clkb时会将FF_gen/CLK定义为忽略pin。• Verifying the Clock Treescheck_clock_trees -clocks [get_clocks CLK]• Setting Clock Tree Design Rule Constraints定义最大电容set_max_capacitance定义最大transitionset_max_transition• Specifying the Clock Tree Synthesis Settings• Specifying the Clock Tree References可以理解为给时钟树定义可用的cell这些cell必须包括buffer或inverter还包括已经存在的逻辑门电路比如原本在时钟树上的与门。如果是多电源设计还应包括常开的cell如果这个cell 定义了dont_touch的属性就不会包含在列表中。指定module使用哪个lib的cell.set_lib_cell_purpose -include cts {HVT_lib/buf1 HVT_lib/buf2 LVT_lib/buf1 LVT_lib/buf2} set_target_library_subset -clock {LVT_lib} -objects {TOP/TSK_BLK] set_app_options -name opt.common.enable_target_library_subset_opt -value 1• Setting Skew and Latency Targetsset_clock_tree_options -target_latency -target_skew -clock -corner report_clock_tree_options remove_clock_tree_options• Enabling Local Skew Optimization使能Skew优化工具默认忽略定义的skew目标可以关掉此功能让工具实现定义的目标值。set_app_options -list {cts.compile.enable_local_skew true} set_app_options -list {cts.optimize.enable_local_skew true} set_app_options -list {cts.common.enable_auto_skew_target_for_local_skew false}• Specifying the Primary Corner for Clock Tree Synthesis定义主要的corner进行时钟树综合set_app_options -name cts.compile.primary_corner -value fast_corner• Preserving Preexisting Clock Trees在执行时钟树综合时工具默认会把原来的buffer或者inverter全部删掉重新做如果不想原来的cell被删掉执行以下的命令set_app_options -name cts.compile.remove_existing_clock_trees -value true• Reducing Electromigration时钟树上的器件相对功耗会大如果聚集在一起电流密度会比较大容易造成电迁移为了避免这个问题可以设置时钟树上的cell之间的距离。同时可以用check_legality -verbose命令检查cell之间间隔的违规情况。set_clock_cell_spacing -x_spacing 1 -y_spacing 1• Handling Inaccurate Constraints During Clock Tree Synthesis在设计初始阶段不精确的约束或者太严格的约束会增加runtime和QoR所以在前期可以通过设置用短的runtime得到可用的结果就是try run的意思。set_app_options -list {cts.common.enable_dirty_design_mode true}• Defining Clock Cell Spacing Rulesreport_clock_cell_spacings remove_clock_cell_spacings• Creating Skew Groups简单理解就是可以分组进行时钟均衡create_clock_skew_group -name sg1 -objects {reg1/CP reg2/CP reg3/CP}• Defining a Name Prefix for Clock Cells在做时钟树综合时可以给工具添加的时钟树上的cell定义名字方便后面debug用。set_app_options -name cts.common.user_instance_name_prefix -value CTS_• Using the Global Router During Initial Clock Tree Synthesis工具可以使能全局的router在时钟树综合的初始阶段。set_app_options -name cts.compile.enable_global_route -value true• Setting Clock Tree Routing Options默认情况工具用默认的绕线规则和layer做时钟树可以自己定义规则和决定层数参考routing。• Reducing Signal Integrity Effects on Clock Nets芯片里金属线挨太近相邻走线信号跳变会互相干扰产生额外延迟、抖动clock skew 变大直接破坏时序收敛。时钟线频率高、扇出大串扰带来的时序恶化比普通信号线严重得多。相比默认走线NDR 会设置更大线间距、更宽线宽拉开时钟线和旁边信号线的距离大幅减少串扰。芯片局部区域走线密密麻麻拥塞区没法拉大间距空旷区域走线资源充足可以放心给时钟用宽松 NDR 规则。set_app_options -list {cts.optimize.enable_congestion_aware_ndr_promotion true}• Reporting the Clock Tree Settings报告是时钟树的设置情况report_clock_settings -type• Implementing Clock Trees执行时钟树综合前最好保存一下以便重新定义一些配置。• Performing Standalone Clock Trees Synthesissynthesize_clock_trees这条命令会执行时钟树综合和优化但是没有真正的绕线。• Synthesizing and Routing Clock Trees, and Optimizing the Design With the clock_opt Command这条命令包含了三步build_clock/route_clock/final_opto,可以指定从哪步到哪步。clock_opt -from XXX -to XXX1.Using of Nondefault Routing Rules Critical Nets During Optimization为了改善时序工具可以设置不使用默认的routing规格。set_app_options -name clock_opt.flow.optimize_ndr -value true2.Enabling Layer Optimization使能层优化同时可以指定优化范围。set_app_options -name clock_opt.flow.optimize_layers -value true clock_opt.flow.optimize_layers_critical_range3. Enabling Concurrent Clock and Data Optimizationset_app_options -name clock_opt.flow.enable_ccd -value true4. Performing Power or Area Recovery on the Clock Network如果使能了上一条命令工具会执行clock power recovery如果没有使能上一条命令可以单独使用命令来执行power recovery。执行这条命令的前提是定义了场景或者读取了.saif文件。代替power recovery可以使能area recovery。set_app_options -name clock_opt.flow.enable_clock_power_recovery -value power set_app_options -name clock_opt.flow.enable_clock_power_recovery -value area5.Performing Global-Route-Based Optimization为了执行全局绕线优化a.要确定所有scenarios是有效的并且至少一个scenario对leakage power是使能的.b.使能leakage-power优化是通过route_opt.flow.enable_pwoer命令。c.应用全部的routing相关的设置。d.使能全局绕线优化clock_opt.flow.enable_global_route_opt。e.执行clock_opt.• Performing Concurrent Clock and Data Optimization During the clock_opt and route_optCommands1.使能时钟和数据同时优化。set_app_options -name clock_opt.flow.enable_ccd -value true set_app_options -name route_opt.flow.enbale_ccd -value true2.控制边界寄存器的延迟调整Boundary registers是指输入port直接连接的寄存器或者是寄存器直接连接到输出端口。如果想要boundary register不被clock latencies调整则需要设置命令set_app_options -name ccd.optimize_boundary_timing -value false一些连接到输入port且高扇出的寄存器(比如连接scan_en或rst)会被认为是boundary寄存器这样在进行时钟和数据同时优化的过程时会将这些寄存器排除在外可以通过命令阻止排除。set_app_options -name ccd.ignore_ports_for_boundary_identification -value {SCN_EN RST}就算你不让调整边界寄存器本身的时钟到达延迟工具依然可以优化边界寄存器上游的时钟主干共享时钟路径通过调整公共时钟树改善其他内部寄存器的时序。设为false彻底锁死边界寄存器上游的时钟树上游时钟路径一丝一毫都不允许修改.缺点:会极大缩小 CCD 协同优化的可调范围时序更难修复非特殊需求不建议关闭。适用场景:顶层输入时钟路径是固定 IP 硬核、手动预布线不允许工具改动时钟主干ccd.optimize_boundary_timing_upstream这 3 个参数全部只在你开启了clock_opt/route_opt的时钟数据协同优化CCD 时才生效3.Ignoring Path Groups做 CCD 协同优化时跳过指定时钟对应的整组时序路径完全不优化这组路径。 分两种跳过规则全局跳过某时钟在所有场景 (scenario) 都不参与 CCD 优化场景限定跳过某时钟只在指定场景跳过优化其他场景正常优化。所有场景下忽略CLK1 path group只在scnA场景下忽略CLK2 path group。set_app_options -name ccd.skip_path_groups -value {CLK1 {CLK2 scnA}}4.Controlling the Latency Adjustment Values设置提前和滞后的最大值防止工具过于极端造成其他不良影响。set_app_options -list {ccd.max_prepone 0.2} set_app_options -list {ccd.max_postpone 0.1}5.Enabling Buffer Removal for the Postroute Stage在时钟和数据做均衡时可以移除buffer或者inverters来改善QoR.set_app_options -name route_opt.flow.enable_ccd -value true set_app_options -name ccd.post_route_buffer_removal -value true• Splitting Clock Cells可以手动拆分有DRC violation的高扇出的cell.有三种情况不拆分1.没有DRC violations 2.有dont-touch/size-only/fixed-placement属性的设置 3.跨电源域 / 冻结端口模块边界如果拆分需要新增端口。拆分后工具会重新命名original_cell_name_split_integer,同时完整继承原单元所有约束与属性。split_clock_cells -cells [get_cells U1/ICG*] set loads1 [get_pins I1/reg*/CK] set loads2 [get_pins I2/reg*/CK] splitclock_cells -loads [list $load1 $load2]• Balancing Skew Between Different Clock Trees1. 工具可以对两组clock进行平衡执行步骤1.产生内部时钟相互之间delay的约束定义clock balance groups和delay offsets。2.balance the interclock delays.Defining the Interclock Delay Balancing Constraints把需要互相对齐延迟的多个时钟打包成一组告诉工具这几个时钟要互相做 skew 平衡。比如假设有三个时钟clk1/clk2/clk3如果想要clk1和clk2延时一样并且clk3嵌入延时少于100则命令为create_clock_balance_group -name group3 -objects [get_clocks {clk1 clk2 clk3}] -offset_latencies {0 0 -100} report_clock_balance_groups remove_clock_balance_groups2. Generating Interclock Delay Balancing Constraints Automatically自动生成跨时钟延迟平衡约束默认情况是包括两个时钟的所有时序路径可以加条件指定满足条件的情况才自动生成约束。使用场景多时钟、跨时钟路径繁多不想一条条手动写前期摸底。derive_clock_balance_constraints -slack_less_than -0.23. Running Interclock Delay Balancing在执行时钟平衡前需要先定义时钟delay balance约束。balance_clock_groups• Optimizing the Design After Clock Tree Synthesis时钟综合后可以对其进行优化优化包含timinglogic DRC violationareapowerroutability.clock_opt -from final_opto• Routing Clock Trees时钟综合只是规划时钟路径插入buffer只生成虚拟的路径没有画实际的走线。此命令是画实际的走线-all_clock_nets选中设计里全部时钟网线只给时钟做详细布线不会动普通信号网。-reuse_existing_global_route true复用 CTS 阶段已经生成的全局虚拟布线轨道详细布线严格沿着之前规划好的路径走。route_group -all_clock_nets -reuse_existing_global_route true• Marking Clocks as Propagated After Clock Tree Synthesis标记时钟为真实的时钟propagated clock作用是从ideal clock切换成propagated clock进行后续的时序这条命令只对active scenario有效。set_scenario_status -active true [all_scenarios] synthesize_clock_trees -propagate_only• Performing Postroute Clock Tree Optimization执行布线后的时钟优化synthesize_clock_trees -postroute -routed_clock_stage detail• Marking Clock Trees as Synthesized用来给已经做好的时钟树打锁定标签防止后续 CTS、clock_opt、route_opt 等步骤随便改动时钟缓冲、走线、分支结构。mark_clock_trees• Removing Clock Treesremove_clock_trees• Implementing Multisource Clock TreesIntroduction to Multisource Clock TreesImplementing Regular Multisource Clock TreesImplementing Structural Multisource Clock TreesInserting Clock DriversSynthesizing the Global Clock TreesCreating Clock StrapsRouting to Clock StrapsAnalyzing Clock MeshPerforming Tap AssignmentBuilding the Local Clock Subtree Structures• Analyzing the Clock Tree Results1. Generating Clock Tree QoR Reports可以报告时钟树的各个参数SummaryLatencyDRCRobustnessclock-balance groups QoRLocal skewclock tree power还能生成他们的直方图。report_clock_qor2.Reporting Clock Tree Power可以指定clock mode cornerscenario每段或者每个subtree.report_clock_power3.Creating Collections of Clock Network Pinsget_clock_tree_pins (2020.09版本没有这条命令)4.Analyzing Clock Timingreport_clock_timing5.Analyzing Clock Trees in the GUI可以通过GUI来查看时钟树详细文档参考IC Compiler II Graphical User Interface User Guide