数字后端设计实现之时钟树综合实践篇
文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点。点击进去后出现任何损失与社区无关。
时钟树综合定义
时钟树综合就是指从某个 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 的后端实现来做一个分享。会以文档的形式推送到吾爱 IC 社区的知识星球上。应部分粉丝要求,近期知识星球上还会发布 ICC 和 ICC2 lab 对应的实践演练(由小编亲自实操 lab,进行知识点延伸,并以文档形式分布,绝对比官方的详细!)
这几天,粉丝越来越多了,提问的人也越来越多了。有的是重复的问题,有的则是新问题。对于之前我回答过的问题,想通过找历史回答记录,似乎很困难(要么去翻群历史消息,要么去翻个人历史消息)。
所以个人觉得这个不是长久之计,知识和解答不容易随着时间的积累而慢慢沉淀下来。所以小编注册了知识星球(原小密圈),建立了一个数字后端技术交流圈(需要付费,志愿加入原则)。
在这里,各位可以提问,小编会在 24 小时内给予解答(也可以发表你对某个知识点的看法,项目中遇到的难点,困惑或者职业发展规划等)。
反正它是一个缩减版的论坛,增强了大家的互动性。更为重要的是,微信有知识星球的小程序入口。星球二维码如下,可以扫描或者长按识别二维码进入。目前已经有六位星球成员,感谢六位童鞋的支持!
相关文章推荐(不看保证后悔)
【惊呆了!】你居然还在用 flatten 方式进行 timing signoff
合理的时钟结构能够加速 Timing 收敛(时钟树综合中级篇)
【机密】从此没有难做的 floorplan(数字后端设计实现 floorplan 篇)
听说 Latch 可以高效修 hold 违例(Timing borrowing 及其应用)
秒杀数字后端实现中 clock gating 使能端 setup violation 问题
教你轻松调 DCT 和 ICC 之间 Timing 与 Congestion 的一致性
Scan chain reordering 怎么用你知道吗?
数字后端实现时 congestion 比较严重,你 hold 得住吗?
Final netlist release 前,你应该做好哪些工作?
深入浅出讲透 set_multicycle_path,从此彻底掌握它
数字后端实现时 congestion 比较严重,你 hold 得住吗?
时钟树综合(clock tree synthesis)基础篇
好了,今天的内容分享就到这里。另外,因为公众号更改推送规则,小编分享的每篇干货不一定能及时推送给各位。为了避免错过精彩内容,请关注星标公众号,点击 “在看”,点赞并分享到朋友圈,让推送算法知道你是社区的老铁,这样就不会错过任何精彩内容了。
如果你想和小编有更进一步的沟通交流的机会,欢迎加入小编知识星球,让我们一起学习成长,共同进步。相信在这里能让你成就一个更完美的自己。
小编知识星球简介(如果你渴望进步,期望高薪,喜欢交流,欢迎加入 ****):
在这里,目前已经规划并正着手做的事情:
-
ICC/ICC2 lab 的编写
-
基于 ARM CPU 的后端实现流程
-
利用 ICC 中 CCD(Concurrent Clock Data)实现高性能模块的设计实现
-
基于 ARM 四核 CPU 数字后端 Hierarchical Flow 实现教程
-
时钟树结构分析
-
低功耗设计实现
-
定期将项目中碰到的问题以案例的形式做技术分享
-
基于 90nm 项目案例实现教程(ICC 和 Innovus 配套教程)
-
数字 IC 行业百科全书
吾爱 IC 社区知识星球星主为公众号” 吾爱 IC 社区” 号主,从事数字 ic 后端设计实现工作近八年,拥有55nm,40nm,28nm,22nm,14nm等先进工艺节点成功流片经验,成功tapeout 过三十多颗芯片。
这里是一个数字 IC 设计实现高度垂直细分领域的知识社群,是数字 IC 设计实现领域中最大,最高端的知识交流和分享的社区,这里聚集了无数数字 ic 前端设计,后端实现,模拟 layout 工程师们。
在这里大家可以多建立连接,多交流,多拓展人脉圈,甚至可以组织线下活动。在这里你可以就数字 ic 后端设计实现领域的相关问题进行提问,也可以就职业发展规划问题进行咨询,也可以把困扰你的问题拿出来一起讨论交流。对于提问的问题尽量做到有问必答,如遇到不懂的,也会通过查阅资料或者请教专家来解答问题。在这里鼓励大家积极发表主题,提问,从而促进整个知识社群的良性循环。每个月小编会针对活跃用户进行打赏。
最重要的是在这里,能够借助这个知识社群,短期内实现年薪百万的梦想!不管你信不信,反正已经进来的朋友肯定是相信的!相遇是一种缘分,相识更是一种难能可贵的情分!如若有缘你我一定会相遇相识!知识星球二维码如下,可以扫描或者长按识别二维码进入。目前已经有 858 位星球成员,感谢这858 位童鞋的支持!欢迎各位渴望进步,期望高薪的铁杆粉丝加入!终极目标是打造实现本知识星球全员年薪百万的宏伟目标。
欢迎关注 “吾爱 IC 社区”
微信号:ic-backend2018