在 Xilinx CDC 设计中, 我们一般用到以下几种时序约束:
set_clock_groups -asynchronous
set_false_path
set_max_delay -datapath_only
set_bus_skew
set_clock_groups -asynchronous
这个命令指定clock之间是异步关系,时序分析时会完全ignore这些clock之间的path。
值得注意的是,set_clock_groups 相比于其他的 timing exceptions 有更高的优先级。如果你还是需要约束或者报告某些CDC path,是不能用 set_clock_groups 的。
set_false_path
这个命令指定相应的path在时序分析时可以被ignore。经过同步器同步的CDC path一般可以施加set_false_path约束。更general一些,我们认为不需要时序约束的path都可以用这个命令。
set_max_delay -datapath_only
set_max_delay可以约束一条path的最大delay。-datapath_only可以指定在分析该path的timing slack时不考虑clock skew。因为异步时钟是无法知道准确的clock skew的,所以我们用 set_max_delay 来约束cdc path时一般要加 -datapath_only。Setup time仍然是会被考虑的,所以 required time = max_delay + setup_time。
值得注意的是,当我们加了 -datapath_only,该path的hold time检查会被ignore。另外set_min_delay 是不支持 -datapath_only的。
set_bus_skew
这个命令用来约束多条cdc path之间最大的time difference,这里的bus指的是多条cdc path而不是我们常说的总线。
set_bus_skew应用的一个典型例子是异步FIFO中的格雷码。在异步FIFO的设计中用到格雷码,是为了使得跨时钟域时只有一个bit发生跳变。但是如果多位格雷码信号的cdc path之间的skew很大,则可能出现在跨时钟域时多位bit跳变的情况。比如我们使用格雷码00->01->11->10,假入bit 0的delay比bit 1的delay大过一个dest clock 时钟周期,那么在dest clock 端,可能会看到00直接跳变到11。因此我们希望通过set_bus_skew来约束多位格雷码信号,使其skew小于一个 dest clock period。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !