innovus ccopt 的一些感想

最近钻研了一下ccopt balance 不balance的一些规则。在此分享下。

image

sdc和clock框图如上 如果当master clk my_clk 和 div_clk 之间我不想balance 该怎么办呢?

先搁置这个问题说些其它的。
我发现create_ccopt_spec 默认对generate clock create的skew_group 会设置constraint mode ccopt_property 。也就是只report不balance

如果div_clk 和 my_clk 相互拉扯我们可以用get_ccopt_property 来看某一个clock pin 属于哪一个skew group

从skew group 我们可以分析ccopt spec 来得知tree 的问题在哪里。

另外ccopt create spec 的skew group 是按照delay corner 来创建的。 delay corner 又和constraint mode 绑定
可以用这个命令来绑定ccopt create spec 的skew group 绑定的delay corner

image

好了前置的knowledge 介绍完了。开始来说
方法1: 默认create ccopt spec 然后分析。
在spec里面吧genclock skew group constraint mode注释掉

然后master clock skew group my_clk 和 generate clock div clk 都会对 div clk 的FF/CK pin 进行balance 导致两个skew group clock会相互拉扯。
在source ccopt spec 后通过

其中all_registers -clock 这个命令和ccopt不同它是从timing 信息来的。不是从时钟拓扑结构来的

来把div clk 驱动的clock sink pin 设置ignore 从master clock skew gourp balance 策略 中移除只修drc不balance
我这里写了两个命令都能达到效果。一个是抓到div clk驱动的所有sink pin 一个是只设置 div clk 分频ff的 input CK pin
然后我们看效果
ctd_win

明显看到clock tree balance 被分开了

方法二:
把 div clk skew group 设置 exclusive 它的sink pin 是这个clock group 独有的

同样观察ccopt spec 注释掉gen clk div clk 的 skew group property constrain mode none

通过下面的命令指定gen clk div clk skew group 的sinkpin 独有

当多个skew group exclusive重叠时候可以通过图中第二个命令设置exclusive_sinks_rank 来标注优先级

然后涨tree 看下结果

image

几乎和前面的结果是一样的。 良好的分开了master clk 和genclk 不要相互balance

然后方法3 :
在产生ccopt_property 之前 设置

另外sdc里要用set_false_path 或者clock_group 隔离开master clock 和div clk

然后产生spec 我们来看一下自动产生的spec

divclk 的ccopt_property constraint mode none 不见了
并且master clk my_clock 在div clk 的FF/CK pin上设置了 ignore。
(其实这跟方法一是一样的只不过是工具自动做的)

结果当然也一样

最后贴上ccopt 产生的CTS_instance 默认的名字 比如cdb 字样就是为了平衡别的tree 垫的delay clock cell

再聊一个有意思的问题如果需要多点长tree 该怎么办。
就是平衡从两个port进来的mclk和 scan clk 默认当做异步的不平衡。如果要平衡怎么办?

方法:在create_spec 后create新的skew group 加入balance group


结果可看到他在平衡 scan clk 和 mclk

好吧,我继续来补充关于ccopt的东西。

首先当你的某一个tree是从clock port 来的单独只balance 自己。

你可以用 set_ccopt_property target_insertion_delay test_clk/mission_func 1.1

来控制tree长。

用set_ccopt_property insertion_delay -0.7 -pin xxx/ff_reg/CK

来控制某一个flipflop的tree长。 -0.7是再拉长700ps

比如 1.1 + 0.7 = 1.8 ns 最后的tree长。

今天继续添加两种干涉ccopt balance 的方法。

第一种是

add_ignore_pin

例子如下图这样的clock tree

clock → tx1_clock →

     ->  tx2_clock ->

     ->

clock master clock 产生 tx1_clock

clock master clock 产生tx2_clock

clock , tx1_clock ,tx2_clock 相互不balance。

当然模式是会balance的

只需要修改ccopt spec

modify_ccopt_skew_group -skew_group clock/mission_func -add_ignore_pin {tx1_clock genclock 定义的source pin \

tx2_clcok genclock 定义的source pin}

这样ccopt就分开balance tx1_clock tx2_clock ,clock 三个clock

方法二

在ccopt时候重新写一套sdc。 把generated clock tx1_clock tx2_clock create成master clock

然后通过

update_constraint_mode -name mission_func -sdc_file {你修改的sdc}

然后做ccopt

ccopt做完后用update_constraint_mode -name mission_func -sdc_file {原始的sdc}

这样也能分开balance tx1_clock tx2_clock , clock, 三个clock.

####################

再补充一些。就是ccopt skew group trace 的trace 是和sdc不同的。

比如你有一个master clock A 然后 genclock B (ref A) → FF/CK

从sdc来讲 A clock是不会trace到FF/CK的

但是从ccopt skew group 来说A 和 B clock skew group 都会trace到FF/CK

那么如何判断 FF/CK 有几个skew group在拉扯呢?

如下用 skew_groups_sink 看有几个skew group

用skew_groups_active 看哪些skew group 被打开了真正在拉扯

然后注意ccopt 自己产生的spec里面有些skew group 是被关着的。

set_ccopt_property constraints -skew_group xxx/xxx none

根据需求注释掉。

并打开

set_ccopt_property include_source_latency -skew_group xxx/xxx true

反正根据需要修改。

1 个赞