数字后端设计实现之时钟树综合实践篇
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字后端设计实现之时钟树综合实践篇
时钟树综合定义
时钟树综合就是指从某个clock的root点长到各个sink点的clock buffer/inverter tree。
工具试图将某个clock所属的所有sinks做到相同长度。
从概念上,我们可以得到几个要点。
图1 时钟树
CTS之前你应该先搞清楚以下几点(非常重要)
•clock的root点需要定义清楚。
这个可以通过create_clock来定义。
如果是create_generated_clock,它的master clock需要定义清楚。
同时要求generate clock与master clock是可以trace通的•clock 的sinks
•哪些clock是同步,哪些是异步的
•分析时钟结构,大致画出其结构图。
如果时钟结构比较复杂,建议编写CTS constraint,来引导工具build tree
•定义好stop pin ignore pin exclude pin floating pin等
•哪些clock是需要做inter-balance的
衡量时钟树的几大指标
合理的时钟结构能够加速Timing收敛(时钟树综合中级篇)
时钟树综合(clock tree synthesis)基础篇
设置DRC参数
设置max_transition max_capacitance max_fanout等参数。
对于clock的max transition的设置,应该根据clock的频率来设置。
高频率的clock,需要额外设置严格点。
指定clock inverter list
set_clock_tree_references -references $cts_clock_inv_list
set_clock_tree_references -references $cts_clock_inv_list -sizing_only
set_clock_tree_references -references $cts_clock_inv_list -delay_insertion_only
clock inverter cell list的选择往往比较有讲究。
一般情况下fab 都会给出建议。
往往是驱动中等的几类cell。
以TSMC28为例,官方建议clock inverter 应该选用三款cell,分别是CKND8,CKD12,CKD16的cell。
大驱动的clock inverter(比如CKND20,CKD24)容易出现EM 问题。
而小驱动的clock inverter(比如CKND2),受PVT影响比较大,容易出现较大的工艺偏差。
用来build clock tree的clock inverter 必须使用LVT或者SVT,而且必须保证clock tree上只有一种VT。
HVT cell禁止使用在clock tree上,因为工艺偏差较大,导致signoff的timing和实测严重不match,甚至导致功能错误。
设置don’t_use cell list
设置floating pin和inter-clock balance
很多时候我们为了将某些reg做短(可能是timing考虑,可能是clock latency的要求),此时需要设置floating pin。
有的hierarchical design,我们需要告诉工具子模块中的clock latency长度,也要设置floating pin。
当两个时钟并不是同步的,但是他们的某些register会进行talk。
默认情况下,CTS build CLOCK1和CLOCK2时,会各自build clock tree,不会做inter-clock balance,如图2所示。
图2 未做inter-clock balance
因此,我们需要设置inter-clock balance选项。
设置命令如下:
set_inter_clock_delay_options -balance_group 'Clk1 Clk2' -balance_group_name group2
图3 inter-clock balance后
设置NDR rule
为了防止clock上的SI和EM,我们需要对时钟信号线进行non-default rule的设置。
通常设置两倍宽度,两倍间距(当然也有更大,根据实际情况进行更改)。
define_routing_rule CTS_NDR_RULE
-widths { M2 0.15 M3 0.15 M4 0.15 M5 0.15 M6 0.15 }
-spacings { M2 0.15 M3 0.15 M4 0.15 M5 0.15 M6 0.15 }
由于标准单元出pin大部分是M1/M2,如果设置ndr rule,会导致很多DRC。
因此,可以将最leaf端采用默认的线宽和线间距来走线。
set_clock_tree_options -routing_rule_ rule -use_default_routing_for_sinks 1
为了使得clock tree质量更好,我们往往将高层用来作为时钟信号的走线。
set_clock_tree_options -layer_list {M7 M8}
图4 NDR setting
除了对clock net 设置NDR外,还需要对某些对时钟质量要求比较高的clock,进行shielding。
route_zrt_group -all_clock_nets
图5 shielding 示意图
define_routing_rule ${rule_prefix}_shielding_rule -default_reference_rule
-widths { M2 0.10 M3 0.10 M4 0.10 M5 0.10 M6 0.20 } -spacings { M2 0.05 M3 0.05 M4 0.05 M5 0.05 M6
0.10 }
-shield_widths { M2 0.05 M3 0.05 M4 0.05 M5 0.05 M6 0.10 }
-shield_spacings { M2 0.05 M3 0.05 M4 0.05 M5 0.05 M6 0.10 }
create_zrt_shield -mode reshield -with_ground VSS -nets $shielding_nets -align_to_shape_end true
Apply IO Latency
set_latency_adjustment_options -from_clock clk -to_clock virtual_clk(如果IO port是用virtual clock 来constraint的,通过此命令来进行IO Latency的apply)
update_clock_latency
图6 IO Latency adjustment
时钟树综合后需要将clock tree上的cell进行mark,防止工具后续进行timing优化而对clock tree进行改动。
mark_clock_tree -clock_trees [all_clocks] -clock_synthesized build clock tree的两种方法
•comile_clock_tree和optimize_clock_tree
•clock_opt -only_cts
大家可以分别用这两种方法去实践下,结果差不多。
查看时钟树结果
可以从log中看到每个clock 长tree的情况,比如clock latency,clock skew, 某个clock domain中最长的clock path和最短的clock path。
图7 时钟树综合log
同时,还可以通过以下命令来查看更多关于clock tree的信息。
report_clock_tree -clock_trees CLK -structure -drc_violators –summary
时钟树结果主要focus on clock skew, clock latency。
查看工具做出来的skew和latency是否符合设计要求,是否是最优的。
如果不是,请根据实际情况进行调整和优化。
限于篇幅,本文还未介绍CTS中一个比较牛逼的功能——CCD (Concurrent Clock And Data)。
这个功能用好了,往往可以使得设计的性能和功耗有个明显的提升(这个feature如果没用好,你可能会觉得它就是一个坑)。
关于flow中CCD(Concurrent Clock And Data),后续会结合ARM CortexA系列CPU的后端实现来做一个分享。