背景
为什么需要分段去做时钟树呢?因为在某些情况下,按照传统的方法让每一个clock group单独去balance,如果不做额外干预,时钟树天然是做不平的。
如上图所示,存在三种寄存器序列A、B(包括B1和B2)和C,这三种寄存器序列代表三种不同时钟树情景的寄存器。A是比较普遍的情况,就是时钟树信号通过时钟树单元从clock port送到寄存器的时钟pin;C是某个Macro(硬核IP或特定子模块)内部的寄存器,正常情况下工具无法识别到该寄存器,也无法将寄存器C的时钟和外部寄存器的时钟做平;寄存器B1和B2的时钟pin是图中Macro通过clock feedthrough(也可以叫时钟飞线)。
如果按默认设置去做时钟树综合,那么A和B的时钟将会做balance;但是C的时钟肯定做不平,因为从Macro的clock in pin到寄存器C的时钟pin之间的delay不可控且没被工具识别和考虑到。
所以为了将A、B和C的时钟树做平,必须采取分段长时钟树的方法。采用两步法,先做A和C的时钟树,A和C的时钟树做好后,就可以根据已经长好的时钟树上Macro的clock out pin之前的时钟树总延迟情况去对寄存器B的时钟树做针对性调整,最终就能将A、B和C的时钟树做平。
做寄存器A和C的时钟树
案例中时钟树使用innovus实现。
先将Macro的clock out pin到寄存器B1和B2之间的时钟树net设置为don’t touch,让做A和C的时钟的时候不要动到B1和B2,使用的命令是set_dont_touch_network。具体命令是:
set_dont_touch_network [get_pins B1/CK]
set_dont_touch_network [get_pins B2/CK]
再将Macro的clock in pin设为时钟stop pin,并将clock in pin到寄存器C的时钟pin之间的延迟(假设该值为delay1)标定到Macro的clock in pin上,这样工具就能将寄存器A和C的时钟做平。使用的命令是set_ccopt_property。具体命令是:
set_ccopt_property sink_type stop -pin macro/clk_in
set_ccopt_property insertion_delay -pin macro/clk_in $ delay1
然后开始做寄存器A和寄存器C的时钟树。
做寄存器B的时钟树
首先给寄存器B1和B2创建单独的skew group,因为这个时钟不是全局时钟树都要去做,而是单独去做寄存器B1和B2;也就是Macro的clock out pin到寄存器B1和B2的时钟pin之间的这一部分,这部分的时钟起点是Macro的clock out pin,所以就定义一个Macro的clock out pin为clock port的skew group,假设主时钟域的skew group叫做main_clock,使用的命令是create_ccopt_clock_tree、create_ccopt_clock_tree_spec和create_ccopt_skew_group。具体命令是:
create_ccopt_clock_tree_spec
create_ccopt_clock_tree -name from_macro_to_c -source macro/clk_out
create_ccopt_skew_group -name from_macro_to_c -balance_skew_groups main_clock
再将main_clock的时钟port到Macro的clock out pin之间的delay(假设为delay2)以clock source latency的形式标记到新创建的from_macro_to_c skew group的时钟起点(即Macro的clock out pin)上,具体命令如下:
set_ccopt_property source_latency $delay2 -clock_tree from_macro_to_c
再告诉工具长时钟树时将clock source latency考虑进去,具体命令如下:
set_ccopt_property include_source_latency -skew_group from_macro_to_c
然后开始长寄存器B1和B2的时钟树。
结果
最终三种寄存器之间的时钟树都做平了。
全部0条评论
快来发表一下你的评论吧 !