fpga时序约束之set_max_delay & set_min_delay

set_max_delay,这个约束是定义两个点之间的最大延迟,这个约束我平时用的不多,但是在有些xilinx自己的IP内部的约束中还是能看到,我们先看下它的主要适用场景

  • 在跨时钟域时,两级同步器之间,看个图先:
    image-100

图里两个时钟C1和C2,F1是C1的时钟域,F2和F3是C2的时钟域。F1的输出给到了F2,因为跨了时钟域所以后面用了个两级打拍。以上这些操作我们都很熟悉了,所以set_max_delay用在哪?

  • set_max_delay -from F2 -to F3 1.0
    为啥?因为两级打拍本身就是要求F2和F3之间的延迟要非常小,所以我们用两级打拍时两个寄存器之间是没有任何组合逻辑的,光没有任何组合逻辑还不够,为了这俩寄存器之间延迟最短,还要求它俩之间的布局走线要最短。为了避免布局布线工具觉得这俩之间时序很宽裕而把它俩放置的很远,所以我们要使用set_max_delay将它俩强制放的很近。至于为啥要很近,因为本身两级打拍就是为了避免亚稳态的,为了给F2预留出足够的亚稳态恢复时间,所以从F2到F3之间的延迟就尽可能的短。

  • 在pin2pin之间的纯组合逻辑的延迟约束,就是纯组合逻辑输入输出,这种我个人几乎几乎用过,但是在《Constraining Designs for Synthesis and Timing Analysis》书里说,哪怕是这种情况,也建议使用set_input_delay/set_output_delay和虚拟时钟的组合,这里我不解释具体原因了,有兴趣的可以自己去看,在13.4章节

这里多说一句,set_max_delay约束的是指定的某段路径延迟,是没有时钟参考的,set_input_delay和set_output_delay有指定数据端口参考的时钟,所以通常说这俩适用于系统同步的情况下,如果是源同步的情况,比如fpga通过SPI接口控制flash,这种一般会用create_clock创建一个输出端口的衍生时钟,再配合set_input_delay/set_output_delay的约束

set_min_delay一般用的很少,因为一般都是因为延迟过大需要控制延时,当然如果因为hold time的因素需要set_min_delay也是可以的。

要注意这个约束和set_input_delay、set_output_delay的区别,

posted @ 2026-03-02 17:13  原声带1993  阅读(180)  评论(0)    收藏  举报