吾爱IC社区第二十一期IC训练营正式开始招募啦(5月21号开营)!不知不觉小编的IC后端训练营课程已经举办21期了。每一期的报名时间也就1-3天,而且几乎每期都是爆满的情况。这背后的逻辑很简单。大家都信任吾爱IC社区这个品牌,更信任小编的技术实力。
这一期开始将在原来训练营模式的基础上,每周新增1次线上直播答疑课。同时为了大家能够更高效学习做项目,计划将往期直播课回放权限开放给大家。
因此,目前的训练营有以下几大特点:
1)开营直播+结营直播授课
2)由一线11年+后端技术专家负责每日问题解答和远程协助服务
3)每周一次线上直播授课+答疑(本周学习任务总结,解决大家实际项目中的具体问题)
4)公司实际项目,SoC芯片中的ARM CPU项目,而非开源或Lab项目
5)简历修改+面试指导
在有些设计中会通过DLL Macro来调整时钟的相位,比如90度,180度。下图中的Mux的I0端接原始时钟CLK,I1端接经过DLL调整相位后的时钟。而且DLL内部其实就是一段clock tree,它内部的delay值为2ns。
遇到这样的设计,如果你仅仅是个跑PR Flow的工程师,那么这个时钟树综合出来的结果一定惨不忍睹,而且通常是跑不出来的。如果你不希望未来被工具所替代,一定不能仅仅会跑后端流程。
因为Mux后带的sink。都是挂在CLK这个时钟下,默认情况工具会把Mux的I0和I1两路做clock balance。因此,工具做时钟树综合的clock balance阶段会在I0端垫个约2ns的clock inverter chain。
解决方案:
我们可以在做时钟树综合时在Mux的输出端定义一个create_clock,并且把Mux的I0和I1 pin设置成ignore pin。这个方法其本质也是用了“分段做tree”的思想。工作做tree会分别作出下面三段tree出来,而且第一段和第三段是完全没有关系的。
还有一种解决方法是通过设置set_clock_sense -stop_propgation $mux_I1_pin。原理是类似的。这个方法就是让CLK时钟属性不要穿过Mux。
如果大家平时没有经常看小编的技术干货,第一次遇到这样的案例一定无从下手。因为工具的时钟树综合完全跑不出来。
但如果你经常看小编分享的时钟树综合topic,你一定知道我们可以让工具只做clustering这个步骤,这样我们就可以快速找到逻辑最长的clock path并及时修正我们的clock spec,比如clock skew group的冲突问题等等。
所以,我们只需要按照下面的设置来做clock tree即可快速定位到本案例中的问题点,然后做适当修改就可以做出一个完美的时钟树出来。
set_ccopt_property balance_mode cluster
create_ccopt_clock_tree_spec -file spec.tcl
source spec.tcl
ccopt_design -cts [or ccopt_design ]