set_max_delay 是STA check中的比较常见的约束,区别于其他的约束,这个命令主要是用于某一段path的长度的约束。
之所以把他单独拎出来进行介绍,是因为set_max_delay的命令对于工具来说比较特殊,它的存在可能会因为其他约束的存在而无效,它的存在也可能会导致其他约束失效。因为它主要是用在异步timing arc之间的check

1. set_max_delay命令使用

通过对两个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
复制
2. set_max_delay命令会遇到问题

因为对于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是否还存在

3. set_max_delay命令使用建议

由上面的部分介绍,当我们为异步时钟设置max delay时候,会遇到设置不上或者设置成功但是打断timing arc的情况,那如何提前考虑这些问题从而避免出现遇到这种问题呢?此处有一些使用max delay约束时候的建议:

3.1 对于clock和clock之间的约束

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

3.2 对于reg到reg之间的约束

因为reg到reg之间的设定,reg1/Q到reg2/D,必然会打断reg1的CP到Q的timing arc ,从而影响到了同步paths check,此时可以准备两套sdc,分别对timing 进行check

4. set_max_delay命令优先级
  1. set_clock_group之后,对于异步时钟组的时钟,设置从reg1的cp端口到reg2的D端口,这种合法的起始点,是不能生效的,但是从reg1/Q到reg2/D端这种非法起始点,是有效的。不过同时会导致path segmentation,部分同步path失效。
  2. set_false_path之后,max delay无论设置正常起始点还是不正常的都可以有效
  3. set_clock_group -allow_path,这种允许异步时钟组之间的timing 分析,且可以通过设定正常起始点对max delay进行设定,但是有个前提是需要补充all false path inter clocks。

综上所述,set max delay在很多design中是个不得不用的命令,但是一定要小心。