zl程序教程

您现在的位置是:首页 >  其它

当前栏目

记录修复SDC中的坑

修复 记录 SDC
2023-06-13 09:11:31 时间

#笔记

SDC中的坑补全

上次的文章中提到sdc约束有问题的情况

写不好的SDC约束

终于把问题解决了,撒花还愿,特别感谢各位的帮忙及后台留言。

本意是对每级逻辑之间的延迟进行约束,使其固定在一个合理的范围内。

01

本质原因是point之间存在交叠:

我在设置sdc约束的时候,是对每级逻辑均设置了max delay的,举个栗子。

我设置了get_ports input到In0的max delay。然后又设置了get_pins logic1/o到In1的max delay,那么就存在一个问题,即logic1/o处在input到In0之间,这个在STA中是不允许的。

STA的工作原理应该是计算从-from到-to的路径上的path timing。并且EDA工具会自动将-from开始的位置作为timing path的起点,将-to的作为timing path的终点,并就此将timing path打断。而在我的这个设置中,在start point和end point之间又设置了一个新的start point。那么在report timing时自然是找不到想要的timing path的。

02

解决方案

在理解了上述问题之后,那么我们解决方案就比较明确了。

如下图所示,如果我们想要约束从logic0的输入端口到logic2以及logic3的输出端口之间的delay,那么存在两种约束方式。

方式1:

全部将logic0的输入作为start point,即

set_max_delay 1.5 -from [get_pins logic0/in] -to [get_pins logic2/out]

set_max_delay 1.5 -from [get_pins logic0/in] -to [get_pins logic3/out]

方式2:

将这段逻辑看成是3个timing path,即

set_max_delay 1.0 -from [get_pins logic0/in] -to [get_pins logic1/out]

set_max_delay 0.5 -from [get_pins logic1/out] -to [get_pins logic2/out]

set_max_delay 0.5 -from [get_pins logic1/out] -to [get_pins logic3/out]

上面两种方式得到的效果是一样的。

03

拓展

现实中,更常见的可能是如下图。

很有可能已经设置了从DFF0到DFF1以及从DFF0到DFF2的约束,这是正常的从DFF到DFF之间的约束。

这个时候如果横插一脚,再次设置一个从logic0到logic1的max_delay/min_delay,那么会导致原来设置的相关sdc作废,因为从DFF0到DFF1以及从DFF0到DFF2的timing path均已经被打断。

小白犯的错,记录下~