create_clock你用对了吗
问题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会单独使用。