ICC布局布线 第五课 实践课(2)

第五课 Clock tree synthesis

做CTS的前提:
1.cell都放在了正确的位置上,可以用以下命令进行检查:

check_legality -verbose

2.power和ground都已经经过了预布线

3.高扇出的信号,例如使能信号已经用相应的buffer综合完毕。

***milkway本质上是一个数据库,database很容易崩溃(数据量过大),因此要及时保存自己的设计。
除了milkway以外,也可以用write_verilog或write_def来输出布局布线好的设计,但是可能会丢失一些信息。

create_clock			#第一步:创建时钟
set_clock_option		#第二歩:设置选项
clock_opt					#第三步:优化
#时钟树优化也分成两部分:
compile_clock_tree
optimize_clock_tree  #这两个命令合起来等价于clock_opt

mark_clock

第一步:创建CTS

create_clock和create_generated_clock的区别
用create_clock定义的pin会被ICC识别为except pin,别的CLK信号无法穿过,而generated clock则可以被穿过。

  • pins
    pin的几个类型:
    stop pins:常规的寄存器时钟pin
    nonstop pins:generated clock和integrated clock_gating(ICG)的pin等,都是可以穿过的pin。
    implicit exclude pins:
    ICC布局布线 第五课 实践课(2)
    另外clock tree和data path所用到的buffer是不一样的, CTS的buffer会尽量保证上升/下降时间相同。

第二歩:设置选项

  • define attributes
    可以设置一些时钟树的属性:
set_driving cell -lib_cell mylib/CLKBUF [get_ports CLK1]
set_input_transition -rise 0.3 [get_ports CLK1]

ICC布局布线 第五课 实践课(2)

  • clock tree exceptions
    ICC布局布线 第五课 实践课(2)
    可以手动改变某几个pin的种类,在-float_pins选项当中的数值表示这个路径上的延迟,要求时钟总延迟+数值=时钟树的长度,因此如图中的-0.5就会使时钟树变长,正值则会使时钟树变短。
    还有一些dont touch的选项如下:
    ICC布局布线 第五课 实践课(2)
  • balance multiple clocks
    用于平衡不同时钟之间的latency,软件会在多个时钟中寻找延迟最大的时钟,并使其它时钟的时钟树变长以适应该时钟。常见于多时钟域/异步时钟的设计。
balance_inter_clock CLK1 CLK2 ……
set_inter_clock_delay_options -balance_group {CLK1 CLK2}

第三步:优化

  • specify routing rules
    ICC布局布线 第五课 实践课(2)
    为时钟树的布线设置规则
    ***在布局布线完毕之后有的部分触发器会挤在一起(从而节省面积),这时若时钟树的routing rule太过悲观可能会找不到地方给寄存器布线,因此需要调整设置为较乐观的选项。

  • 其它
    OCV:共享路径上不会用OCV分析,只会在分叉的时钟树上分析,因此要尽量增加共享路径。
    Logic-level:set_clock_tree_options -logic_level_balance true
    可以在逻辑层面上优化时钟树。
    绕线:route_zrt_group -all_clocks
    移除:remove_clock_tree

  • I/O timing
    做CTS之前sdc文件中的latency是0,因此在做完CTS之后需要重新调整I/O的输入输出延迟。

实践课(2)

用ICC作pretiming
做place之前首先做check_timing,可以检查.sdc文件或者设计是否有问题

设置脚本

脚本名称:clock_opt_cts_icc.tcl

首先可以给CTS的buffer设置独有的前缀/后缀:

set_app_var cts_instance_name_prefix CTS

然后规定具体的布线规则:

define_routing_rule $ICC_CTS_RULE_NAME -default_reference_rule -multiplier_spacing 2
set_clock_tree_options -routing_rule $ICC_CTS_RULE_NAME -use_default_routing_for_sinks 1
#第二条命令的意思是紧接在DFF时钟端口的buffer可以用默认的布线规则(而不需要遵守时钟布线规则)
#数字越大,允许的级数就越大

时钟屏蔽线的NDR:
ICC布局布线 第五课 实践课(2)
当时钟和其它信号线之间的串扰比较严重,可以在中间放置接地的屏蔽线。
时钟的routing优化:
ICC布局布线 第五课 实践课(2)
连接P/G(power/ground):
ICC布局布线 第五课 实践课(2)
前端设计中没有P/G设定,后端中P/G则需要全部连接在power rail上,此时物理上连接了而逻辑上没有连接,因此derive_pg_connection可以在逻辑上连接P/G的pin

做完CTS以后移除ideal network:
ICC布局布线 第五课 实践课(2)

时序报告

两条命令检查CTS结果,很重要

report_clock_tree
report_clock_timing		

单独输出某一条:

report_delay_calculation -from ... -to ...

此命令可以显示某一条路径的延迟时怎么计算出来的:
ICC布局布线 第五课 实践课(2)
其它:

set_clock_tree_reference  #设置时钟树所用的buffer
mark_clock_tree   #标出特殊的时钟树

其它操作

cell density最好不要超过85%,否则布线可能会出现麻烦

create_placement_blockage -type {hard partial soft}
											-coordinate {}
											-percentage
											#对某个区域的cell布局做不同程度的限制
											#soft的情况下只对high-pin cell做限制
set_keepout_margin
上一篇:2020-11-30


下一篇:漫话Redis源码之四十四