FPGA时序约束之时钟约束

转自:https://cloud.tencent.com/developer/article/1533419

此外可以参考:https://blog.csdn.net/huan09900990/article/details/77163970
https://blog.csdn.net/u012176730/article/details/54412323

毋庸置疑,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会单独使用。

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值