不枉初心,砥砺前行

皮皮祥的博客

欢迎留言,评论

导航

create_clock你用对了吗

毋庸置疑,create_clock是最基本、最简单的时序约束命令,而且在FPGA设计中必然会用到。但看似简单的命令,却也常常被用错。这里我们就来回答一些常见的问题。

问题1:什么样的时钟需要用create_clock约束?

有三类时钟时钟需要用create_clock进行约束,分别是:

从全局时钟管脚进来的主时钟(Primary Clock)

7系列FPGA高速收发器输出时钟(RXOUTCLK/TXOUTCLK)

用于接口约束的虚拟时钟(Virtual Clock)

问题2:什么是虚拟时钟(VirtualClock)?

虚拟时钟,顾名思义,在实际设计中并不存在的时钟,主要用于输入、输出接口的约束。这里给出一个虚拟时钟案例,如下图所示。

;

问题3:如何约束高速收发器的输出时钟?

这里要分两种情况进行讨论。对于7系列FPGA,需要约束GT的RXOUTCLK和TXOUTCLK,具体约束如下图所示。事实上,只有在这种情形下create_clock命令才会和get_pins命令结合使用(通常是和get_ports一起使用)。

;

对于UltraScale系列FPGA,只用约束参考时钟即可。Vivado会自动推断GT的生成时钟约束。

问题4:如何约束差分时钟?

对于差分时钟,一定会用到IBUFGDS,只用约束P端。工具会据此自动将此约束传播到IBUFGDS的输出端口。如果既约束P端又约束N端,工具会认为这是两个独立的时钟,进而分析相应的内部路径,最终导致错误的时序需求(Requirement)。

问题5:create_clock的时钟定义在BUFG的输出端会有什么影响?

;
;

在Vivado中,这两条约束是不同的,因为它们定义了不同的零时刻起点。这个零时刻起点是用来计算Clock Latency和Uncertainty的,而这两个值又是用来计算Slack的。换言之,零时刻起点直接影响了Slack的计算。通常,Vivado会忽略零时刻起点上游所有时钟树的延迟。如果在BUFG的输出端定义主时钟,那就意味着只有部分Latency会被使用。如果该时钟与其他时钟有交互,那么它们之间的Clock Skew将不再准确,最终影响Slack的准确度。

结论:

对于从全局时钟管脚进来的时钟,create_clock会和get_ports结合使用;

对于7系列高速收发器的输出时钟,create_clock会和get_pins结合使用;

对于虚拟时钟,create_clock会单独使用。

posted on 2022-11-03 10:46  皮皮祥  阅读(3571)  评论(0编辑  收藏  举报