ICC图⽂流程——(四)时钟树综合ClockTreeSynthesis ICC时钟树综合
时钟树综合就是指从某个clock的root点长到各个sink点的clock buffer/inverter tree。⼯具试图将某个clock所属的所有sinks做到相同长度,即尽可能的使⼀个时钟信号到达各个终端节点的时间相同。
在没有进⾏时钟树综合之前,时钟树暂未⽣成,时钟逻辑结构如左图所⽰,⼀个时钟源端(root)最终扇出到很多寄存器的时钟端。但是我们知道,时钟源到达不同寄存器所经历路径的驱动和负载的不同,使得时钟信号到达各个寄存器时钟端的时间也不⼀样,将到达不同寄存器的时间偏差称为偏差(skew),传统CTS就是为了减⼩skew。
经过了时钟树综合,通过加⼊如右图中三种颜⾊三⾓形的三级buffer等⽅式形成⼀个时钟树,时钟信号会先到达各级buffer使得最终到达各个寄存器时钟端的时间⼏乎相同。
所以,时钟树综合的⽬的有两个:
1、clock skew尽量⼩,特别是对时钟质量要求⽐较⾼或者⾼频时钟;
2、clock latency尽量短。
⾸先对于⼀个设计,要进⾏时钟树综合,开始最重要的⼀步就是定义好时钟端,root和sink都需要知晓,软件根据定义计算延迟。
⾸先定义时钟的root点,使⽤create_clock定义时钟的root点
如果是generated clock(⽣成时钟)需要使⽤create_generated_clock定义,它的master clock需要定义清楚。同时要求generate clock与master clock是可以trace通的。
如上图所⽰的Master clock,CLKP以及Generated clock 命名为CLKPDIV2,使⽤命令定义:
Icc_shell>create_clock -name CLKP  [get_pins UPLL0/CLKOUT]
Icc_shell>create_generated_clock  -name CLKPDIV2  -source UPLL0/CLKOUT  -add    -master_clock CLKP  -divide_by 2 [get_pins UFF0/Q]
master clock就是通过create_clock定义的主时钟,图中即为CLKP;通过命令将分频时钟定义为⽣成时钟。
在genereated clock的时候⼀定要明确generated clock与master clock的相位关系(rise->rise or rise->fall or fall->rise or fall-
>fall), 这些关系由桥梁source clock嫁接,所以有了generated clock和source clock,以及source clock和master clock的关系。
(个⼈理解:source)
上图中source clock即为master clock,但是如果根据声明到的generated clock和master clock的关系和实际的关系不⼀致,否则会造成⼀些分析错误。
如图所⽰,master clock为CLK ,⽣成时钟为uDIV。
如果定义:create_clock -period 10 clk
create_generated_clock  -name CLKdiv2    -divide_by 2  -source clk  [get_pins Udiv/Q]
那么根据定义,master clock 和gerenated clock的相位关系如图所⽰:
根据上⾯定义,generated_clock是定义在⼆分频的输出端Q上,其source为CLK。但是我们看到Udiv这个寄存器的时钟端CK与CLK是反相的(即相位差180度)。
实际上master clock 和gerenated clock的相位关系应为:
修正的⽅法⼀是改变generated clock的source,即让generated clock和source clock的路径唯⼀且单⼀(单⼀是指,声明的相位边沿关系和实际的相位边沿关系⼀致)。⼀般做法就是将source clock设置在触发器的clock端。
对应的命令应为create_generated_clock -name CLKdiv2 -divide_by 2  -source [get_pins Udiv/Clk] [get_pins Udiv/Q]
⼆是直接声明generated clock和master clock的相位边沿关系。如下:
create_generated_clock  -name CLKdiv2  -edges {2 4 6}  -source CLK  [get_pins Udiv/Q]
考虑到后期review constraint的便利性,强烈建议使⽤第⼆种⽅式来实现(实际项⽬中都是采⽤这种⽅法)。
(个⼈想法。在ICC man page中,对于create_generated_clock的 -source master_pin选项
Specifies  the  master clock pin, which is either a master clock source pin or a pin in the fanout of the master clock and driving  the  generated clock definition pin.  The clock waveform at the master pin is used for deriving the  generated  clock waveform.
也就是说 -source 选项后⾯接的可以是驱动⽣成时钟的触发器的clock引脚?对于source clock的概念不是很理解。
像这样的多级分频时钟,对于FFdiv3的定义为
Create_generated_clock -name CLK_mux_div3            -divide_by 3  -source FFdiv3/CK -master CLK_mux -add
Create_generated_clock -name CLKdiv2_mux_div3  -divide_by 3  -source FFdiv3/CK -master CLKdiv2_mux -add
Create_generated_clock -name CLKdiv4_mux_div3  -divide_by 3  -source FFdiv3/CK -master CLKdiv4_mux -add)
定义好了时钟源端之后,需要对时序路径的端点。
Pin类型别名解释⼯具的处理
Stop pin Sink pin/sync pin
需要平衡的节点
CTS会优化时序DRC以及时钟树的skew和insertion delay
Exclude pin Ignore pin不⽤平衡的节点CTS会忽略insertion delay和skew的优化但仍会修复时钟树上的时序DRC
Non_stop pin信号穿过这个节点
穿过这个节点到最终的sink计算并优化insertion delay和skew Float pin最终节点“藏”在后⾯
与stop pin的处理相同,不过clock pin上认为具有⼀些延迟
设置时钟树例外的优先级(set_clock_tree_exceptions)
1、不间断引脚(-non_stop_pins)
2、排除引脚(-exclude_pins)
3、 停⽌引脚(-stop_pins)
4、浮动引脚(-float_pins)Others:
5、勿触碰⼦树(-dont_touch_subtrees)
1、Nonstop pins
不间断引脚:ICC会穿过不间断引脚以跟踪查真正的时钟树端点。驱动⽣成时钟的时序单元的时钟引脚是隐式不间断引脚。generated
Icc_shell>set_clock_tree_exceptions -non_stop_pins { list of pins }
·ICC认为集成时钟门控ICG(integrated clock-gating)单元的时钟输⼊引脚是隐式不间断引脚,不⽤⼿动对其设置,如图中①所⽰。(clock gating cell是降低动态功耗(dynamic power)不可缺少的⼀个单元。⽽ICG还可以消除⽑刺。)
·若时序单元的扇出驱动的是⽣成时钟(generated clock),即该时序单元⽤于分频⽤,⽤于产⽣⽣成时钟,如图中②。ICC将该时序单元的时钟引脚时为隐式不间断引脚(implicit nonstop pins),并穿过该时序单元追踪定位真正的时钟树端点。
2、Exclude pins(Ignore pins)
排除引脚:时钟树时序计算和优化中排除的时钟树端点,即不进⾏时钟树的balance。ICC仅在计算和优化设计规则约束(逻辑DRC,即max_cap / max_tran / max_fanout / max_length)中使⽤Exclude pins。
Icc_shell>set_clock_tree_exceptions -exclude_pins { list of pins }
·Implicit exclude pins(隐式排除引脚)
ICC会从clock source向后trace,⾃动确定implicit stop pins和implicit exclude pins(⾃动确定的,所以称为implicit)。
ICC将以下时钟端点定义为隐式排除引脚:
·另⼀个时钟扇出时钟树的源引脚(Source pins)
·时序单元的⾮时钟输⼊引脚
·多路选择器选择引脚
·三态使能引脚
·输出端⼝
·定义不正确的时钟引脚(例如,时钟引脚没有触发边沿信息或没有到输出引脚的时序弧)
·保持恒定的缓冲器或反相器的输⼊引脚(通过使⽤set_case_analysis)
·没有任何扇出或没有任何启⽤的时序弧的组合逻辑单元或集成时钟门控单元的输⼊引脚
所有⾮时钟引脚(如FF的D引脚或组合逻辑的输⼊)都称为排除(忽略)引脚。在时钟树传播期间不需要考虑这些管脚,不需要balance。
除了ICC推断的排除引脚(隐式排除引脚)外,ICC还⽀持⽤户定义(或显式)排除引脚。例如,您可以定义⼀个排除引脚来排除从某些组合逻辑引出的时钟树的所有分⽀(如下图所⽰),或者排除隐式停⽌引脚。
3、Stop pins(Sink pins)
停⽌引脚:⽤于平衡延迟的时钟树的端点。在时钟树综合期间,ICC将使⽤Stop pins来计算和优化设计规则约束和时钟树时序(Skew和插⼊延迟)。Stop pins也称为Sink pins,也就是我们所说时钟树进⾏balance的sink端。
Icc_shell>set_clock_tree_exceptions -stop_pins { list of pins }
##FF的所有时钟引脚称为停⽌(同步)引脚。到达SYC/STOP引脚后,时钟信号不应传播。
默认时钟汇点是隐式停⽌引脚。此外,ICC⽀持⽤户定义(或显式)停⽌引脚。例如,可以定义⼀个停⽌引脚来结束在组合单元输⼊上的分⽀,或者使⽤隐式排除引脚作为时钟汇点。
ICC为所有停⽌引脚(隐式和显式)分配零相位延迟,并在延迟平衡期间使⽤此延迟。
所以⼯具只对stop pins的delays(minimize skew)进⾏balance,如果需要对其他pins需要进⾏优化,需要对pins进⾏设置告诉ICC。
4、Float pins
浮动引脚:具有特殊插⼊延迟要求的时钟引脚。与停⽌引脚(stop pins)类似,但在构建时钟树时会考虑该引脚的内部时钟延迟。⼯具在计算到该Float Pins的插⼊延时(Insertion delay)时,将把Float Pin延迟(正或负)添加到计算Insertion delay中去。
如上图所⽰,它是硬宏(hard macro)的时钟输⼊管脚,在构建时钟树时需要考虑它。但在将其视为同步管脚之前,需要平衡宏的内部树。最终节点藏在后⾯。
Icc_shell>set_clock_tree_exceptions    -float_pins [get_pins pin_list]
· -float_pin_max_delay_fall max_delay_fall_value
· -float_pin_max_delay_rise max_delay_rise_value
· -float_pin_min_delay_fall min_delay_fall_value