说到时钟树综合,需要大家紧紧围绕3W和1H来思考,即What,Why,When和How。这些词是小编自己总结的,可能你们都没听说过。那么它们分别是指什么呢?
What----什么是CTS?
Why-----为什么要做CTS?
When-----什么时候做CTS?
How------怎么做CTS?怎么QA CTS结果?
上面这几个问题,看似很简单,但能真正回答得比较好的工程师不多。CTS这块是数字IC后端岗位招聘时面试官比较喜欢问的一块,因为从应聘者回答问题的广度和深度,就能看出大体上知道对方的水准了。
PS:正值一年一度的跳槽高峰期,有技术问题或者工作选择问题,可以私信小编(ic-backend2018),纯免费,能够帮忙的会尽量帮忙(知识星球会员特权)。
So,上面这些问题希望各位多思考,特别是最后一问,如何做好CTS这个问题?(千万不要跟面试官你设置了哪些参数,然后执行哪个命令)
Clock Insertion Delay (Clock Tree Latency)最短
Clock tree越长,意味着clock tree级数越长,级数长了,tree上的power就越大。同时,受OCV效应影响,timing就越难meet。
以上图为例,如果PLL摆放在右下角,有一个Flop放置在左上角,那么从physical上讲该Flop的clock tree latency将会是最长的一个。由于它要与别的Flop做balance,那么别的寄存器也会被拖长。
【思考题】:假设在core中间区域有一堆Flop的tree被拖长后,请问会造成什么影响?
如果将PLL摆放中间位置,并且把左上角的一部分区域打上soft blockage,如下图所示,那么整条clock tree latency将会减少不少。
最近知识星球上有星友提问,memory之间的窄channel能否放置寄存器的问题。理论上各种channel都是能摆放寄存器的,但是对于那种memory堆的比较深的情况,从CTS角度考虑,最好不要摆放寄存器,因为channel中的寄存器可能会拖累整条clock tree。
所以有一个对CTS友好的Floorplan和Placement是非常重要的,它直接决定CTS的Quality。
Clock skew最小
Clock Skew的概念请看这篇文章。为什么要关注Clock Skew? 如何做小CLock Skew? Clock Skew对setup和hold有何影响?
大部分情况下,我们是希望Clock Skew越小越好,因为它对setup和hold是有很大的好处。
但是有的时候我们倒希望认为引入一定的clock skew,比如S家工具的CCD,它可以充分利用前后级的timing margin来改善时序。又比如从IR Drop的角度看,并不希望寄存器同时翻转。
Design Rule Violation (DRV)
DRV主要是指max_transition, max_cap和max_fanout。前两个是硬性条件,signoff阶段必须满足要求。
Common Clock Path尽量长
在clock tree latency长度一定的情况下,common clock path要尽量长,这样CRPR补偿回来的就越多,对timing就更好。
Un-common clock path尽量短
Multi-level Clock Gating
从功耗的角度讲,我们希望Clock Gating cell尽量靠近root,而且大部分的寄存器都要有Clock Gating cell来控制。但是当ICG靠root端摆放时,容易出现ICG enable端的setup出问题。
Clock Gating Clone/Clock Gating Splitting
PR工具在做CTS时,除了做Clock gating的merge操作外,它还可以做Clone和split操作。上面我们讲到CTS阶段要把un-common clock path做到最短,那么很多时候可以通过Clone clock gating来实现。
Clock Duty Cycle
导致duty cycle出问题的主要原因是cell的rise delay和fall delay不平衡。因此,在做CTS综合时,我们往往都是用clock inverter 来做时钟树的。
Clock Signal Integrity
为了确保时钟信号的质量,在Signal Route前会先对clock net进行绕线,并且为其设置上NDR。必要时,还会对clock net进行shielding。
Custom时钟树综合
对于简单的设计,可能clock_opt -cts或者ccopt_design -cts就可以把tree做的很好。但是对于复杂时钟结构的SOC设计,我们能否直接执行命令做Tree呢?
显然是不能的。
一般情况下,中等规模及以上的SOC芯片的时钟树综合,都是需要编写时钟树约束文件。因为时钟太多了之后,工具处理起来比较费劲,特别是当一堆时钟进行mux操作后,工具经常还会把tree做的很长。工具之所以做起来费劲,之所以做不好tree,主要原因还是时钟结构相对复杂,其复杂程度已经超出它的能力范围了。
CTS Constraint编写方法
如果我们能够对时钟结构进行拆分,把时钟结构很清晰地告诉工具,那么它还是能够做的非常漂亮的。当然这个前提是你要理清楚整个芯片的时钟结构。
画时钟结构图和写时钟约束文件都是数字IC后端工程师必备的一项工作技能,当然也是一项非常核心技能。如果这项技能能够很好的掌握,那么整个数字IC后端设计实现,还有比这更难的吗?
这里结合上图所示的案例,解析下如何写时钟约束文件。
首先,可以把整个芯片的时钟路径分为三部分。第一部分是晶振—-> PLL ,第二部分是 PLL—-> CLOCK GEN ,第三部分是分频器输出——-> 各个功能模块。
其次,搞清楚 CLOCK Gen 模块是用来产生各种分频时钟信号的,它本身并不会直接与其他逻辑进行一个交互。因此,该模块内的寄存器都和别人是异步的。
最后,再整理下各个时钟路径的终点和 clock exception ,比如 floating pin ,exclude pin , non-stop pin ,断开一些不需要穿过mux的时钟等等。