第五课 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:
另外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]
- clock tree exceptions
可以手动改变某几个pin的种类,在-float_pins选项当中的数值表示这个路径上的延迟,要求时钟总延迟+数值=时钟树的长度,因此如图中的-0.5就会使时钟树变长,正值则会使时钟树变短。
还有一些dont touch的选项如下:
- balance multiple clocks
用于平衡不同时钟之间的latency,软件会在多个时钟中寻找延迟最大的时钟,并使其它时钟的时钟树变长以适应该时钟。常见于多时钟域/异步时钟的设计。
balance_inter_clock CLK1 CLK2 ……
set_inter_clock_delay_options -balance_group {CLK1 CLK2}
第三步:优化
-
specify routing rules
为时钟树的布线设置规则
***在布局布线完毕之后有的部分触发器会挤在一起(从而节省面积),这时若时钟树的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:
当时钟和其它信号线之间的串扰比较严重,可以在中间放置接地的屏蔽线。
时钟的routing优化:
连接P/G(power/ground):
前端设计中没有P/G设定,后端中P/G则需要全部连接在power rail上,此时物理上连接了而逻辑上没有连接,因此derive_pg_connection可以在逻辑上连接P/G的pin
做完CTS以后移除ideal network:
时序报告
两条命令检查CTS结果,很重要
report_clock_tree
report_clock_timing
单独输出某一条:
report_delay_calculation -from ... -to ...
此命令可以显示某一条路径的延迟时怎么计算出来的:
其它:
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