目录
1 场景
后端完成项目部定的leakage power指标,但是在PTPX仿真动态功耗时,发现clcok tree动态功耗在block内部甚至整芯片中占比很大。公司项目部给出指标,希望大大降低clock tree动态功耗在整芯片功耗的占比。
首先我们先明白正常意义上的clock tree功耗包括从root点到寄存器CP端所有经过的cell的翻转功耗,包括clock 反相器/clock gate/其余clock逻辑cell/寄存器CP端的翻转功耗。
寄存器和clock逻辑cell是设计写好的,后端优化不了,所以只能从clock 反相器来优化,具体就是优化clock 反相器的个数和强度。
问题来了,为什么clock tree功耗会这么高呢?因为clock tree上的cell的翻转率远高于数据路径,并且clock 反相器DCCKND8/D12/D16等以及寄存器,本身的电流就大,功耗就高。
SDC create_clock创建 master clock点, create_generated_clock创建slave clock点。在CTS阶段,SDC转换为spec(时钟树规范文件)之后,create_clock创建的skew_group会包含create_generated_clock创建的skew_group,于是出现如下图所示的现象,所有slave clock点下面的寄存器都会被master clock所balance delay。
如图所示的时钟树完全可以满足timing要求,但是clock tree水分太多,包含了太多没有必要的clock 反相器cell。我们的目标是满足timing要求的情况下,去除水分,构建一个最少数量的clock cell的低功耗时钟树。
2 从芯片后端部门角度去构建低功耗clock tree
2.1 优化个数
方法核心:去除balance cell,又名去除兜圈子cell
方法特色:不用从物理版图下手,直接从clock debug窗口下手,通过修改spec完成
2.1.1 评估标准
1.balance cell数量和分布 **cdb** **cwb**(只要是包含*cwb* *cdb*的INV,一定是兜圈子cell,非传输cell)
2. clock cell数量
3. INV级数
4. latency
宗旨:latency尽量短
翻译:sinks该balance的balance,不该balance的INV级数/latancy尽量短,并且在应该balance的skew_groups中看能否继续优化关键路径长度
2.1.2 方法
1. 观察:在clock tree debug窗口观察balance cell的分布(允许clock tree尾端也就是sinks前几级有分布,其余的都需观察分析)
2. 进一步观察:寻找关键路径(lantency最长但是无balance cell)
3. 优化:修改spec
1. 将关键路径的sinks点从skew_groups去除
2. 有些不需要和任何sinks进行balance的,可以从所有skew_groups中去除
4. 进一步优化:在应该balance的skew_groups中看能否继续优化关键路径长度,通过调整距离或改变驱动强度等方法优化
5. 分析timing:跑完PR,进STA分析,看看对timing的影响程度,重点观察大的TNS/WNS hold问题
6. 迭代:CTS和STA反复迭代
1. 优化目标:1.**评估标准** 2.timing情况合理
7. 补充:
1. 该不该balance的依据:
1. 提前预估:和前端或综合人员交流,需不需要这两簇之间有没有timing check
2. 事后反馈:根据pt timing结果,观察大的WNS hold问题,说明tree之间需要balance
2. 特殊情况:skew groups不只存在于sinks,也存在于trunk中的分频器
2.1.3 实验前后对比
实验前
试验后
2.2 优化强度
在CTS阶段设置clock invter选型/max_fanout/clock net线长,通过实验结果反馈来选择合适的配置。
2.3 clock tree常用实现命令和debug命令
innovus UG Design Implementation Capabilities/Clock Tree Synthesis
1. 常用实现命令
#可以为每个skew group设置一个target skew和insertion delay
set_ccopt_property -skew_group name target_skew value
set_ccopt_property -skew_group name target_insertion_delay value
# 修改skew_groups的sinks
modify_ccopt_skew_group ignore pin/stop pin/exclude pin
# 指定sinks的rank
rank
# 为sink点设置insertion delay
set_ccopt_property -pin mem1/CK insertion_delay 1.2ns
2. debug命令
innovus UG P489
3 从跨部门合作角度去构建低功耗clock tree
3.1 核心思路
在芯片设计中,部门流程上越往前走,对设计越了解,做改动会产生更大的优势。这种方法的核心思路就是IP设计者提供哪些模块之间的寄存器可以balance,哪些模块之间的寄存器不需要balance,让后端获得更多信息,尽可能的从源头上优化clock cell数量。那么IP设计者如何判断呢?简单来说就是这两个模块之间的寄存器是不是有大量的timing check,如果有大量的timing check,则这两个模块需要balance,如果只有少量的timing check,则这两个模块之间不需要timing check。
3.2 流程
跨部门设计流程图
- IP部门提供模块寄存器的时钟公共点,一般来说是clock gate输出pin。
- STA写SDC时,在这些clock gate输出点create_generated_clock
- 后端在flow里设置这些模块的寄存器单独长clock tree,不与其余模块的寄存器balance delay。实现命令如下
参考书籍《Configure Debug Complex Clock Network CCOpt》如何让slave clock下的slave skew group从master clock下的master skew group中剥离出来。
3.3 结果分析
实验结果数据
clock tree调试工具
IP部门仿真PTPX后,跑不同case,对比三版动态功耗,发现优化明显,具体结果数据我这里没有。
跑了三版数据:
- 用默认SDC长得tree跑完postroutehold
- IP提供的时钟公共点list,后端将list下的寄存器从master clock下剥离出来,使之满足仅模块内部的寄存器之间balance delay,但是保留master clock创建的top skew group,这样不在list下的寄存器会继续在top ske group内部参与balance delay.
- 与第二版的区别是不保留master clock创建的top skew group,不在list下的寄存器不参与任何balance,按最短长tree。
结果分析:
- 反相器DCCK*个数优化明显,在13.7~16.5%
- 时钟树调整会影响少部分path的timing,导致修复hold插入buffer。
- leakage power无影响(减少的clock 反相器与增加的修复hold的buffer,使得Leakage总体保持不变,而动态功耗来说,减少的反相器带来的动态功耗的收益远大于数据路径上插的buffer)
- density无影响
- PTPX动态功耗评估提升明显
结论:
- list覆盖的寄存器越多,覆盖率越高,则优化个数更明显提升,并且对timing影响也会减少。
- 对于低频设计,推荐采用第二种方案处理。对于高频设计,且模块间独立性很差,则推荐采用第三种方案处理。
4 总结
构建低功耗clock tree的方法原理很简单,就是将该balance delay的寄存器balance,不该balance delay的寄存器不balance,最后时序符合要求就行。跨部门合作,从设计源头了解设计联系,优化力度大;仅后端部门设计,优化力度小,但也很明显。目标和方法知道了,难点是探索能实现方法的命令,需要多结合书籍和实验,最终达到目的。各位读者有更好的办法或者意见,多多交流,也可私信我继续宁更深入的交流。
5 参考书籍
《Configure Debug Complex Clock Network CCOpt》
《基于40nm数字芯片的复杂时钟树结构分析和优化》
《innovus user guide CTS章节》
《更多的是来自于不断的实验和结果分析》