赞
踩
set_max_delay 是STA check中的比较常见的约束,区别于其他的约束,这个命令主要是用于某一段path的长度的约束。
之所以把他单独拎出来进行介绍,是因为set_max_delay的命令对于工具来说比较特殊,它的存在可能会因为其他约束的存在而无效,它的存在也可能会导致其他约束失效。因为它主要是用在异步timing arc之间的check
通过对两个clock之间所有的path点或者直接两个path点之间设置max_delay值
set_max_delay 1 -from [get_clocks clk1] -to [get_clocks clk2]
set_max_delay 1 -from [get_clocks clk1] -to reg2/D
set_max_delay 1 -from reg1/CP -to [get_clocks clk2]
set_max_delay 1 -from reg1/CP -to reg2/D
因为对于max delay的设定,通常用于异步时钟之间的检查,因此在进行设置时候可能会遇到问题,举例如下:
set_clock_group -asynchronous -group {clk1 clk3}
-group {clk2}
如上所示,clk1和clk3为同步时钟组,clk2和clk1/clk3为异步时钟组
如果只是有上述的约束,那么在STA check时候会有reg1到reg3的timing check,不会有reg1到reg2的timing check ,如下图(a)所示。
但是如果增加了如下的几条约束,会有什么变化呢?
1. set_max_delay 1 -from [get_clocks clk1] -to [reg2/D]
2. set_max_delay 1 -from reg1/CP -to reg2/D
3. set_max_delay 1 -from reg1/Q -to reg2/D
● 对于1和2来说,都是两个异步时钟相关pin进行的设定,因为前面已经设置过了异步时钟组,而时钟组的优先级要更高,因此,此时 max_delay的设定无效
● 对于3来说,通过设置非法的起始点,此时max delay生效,会存在reg1/Q到reg2/D的timing check ,但是同时,会打断reg1的cp到Q端口的timig arc,导致reg1到reg3的timing check为unconstrained。如下图(b)所示
因此在design时候一定要注意:
如果有max_delay约束,一定要看此约束是否生效,另外在约束生效的时候,原来存在的同步path是否还存在
由上面的部分介绍,当我们为异步时钟设置max delay时候,会遇到设置不上或者设置成功但是打断timing arc的情况,那如何提前考虑这些问题从而避免出现遇到这种问题呢?此处有一些使用max delay约束时候的建议:
1.1 如果这样的path比较少,且很好捋清楚,那么可以通过把相应的clock之间设置false path,而不是设置时钟异步clock group,然后再对其 进行max delay的设定,因为max delay要高于false path优先级,低于async clock group优先级。
1.2 如果这样的path比较多,又不好捋清楚,可以通过复制时钟组。即原本的clk1/clk2/clk3依然保存,且设置时钟分组方式保持不变,此时只是单纯的创建clk1_cdc,clk3_cdc,然后把这两个clk设置同步时钟,然后进行check,就可以cover到cdc check
因为reg到reg之间的设定,reg1/Q到reg2/D,必然会打断reg1的CP到Q的timing arc ,从而影响到了同步paths check,此时可以准备两套sdc,分别对timing 进行check
综上所述,set max delay在很多design中是个不得不用的命令,但是一定要小心。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。