作者:张大侠,来源: 傅里叶的猫 微信公众号
在FPGA的时序约束中,主时钟约束是第一步就要做的,主时钟通常有两种情形:一种是时钟由外部时钟源提供,通过时钟引脚进入FPGA,该时钟引脚绑定的时钟为主时钟:另一种是高速收发器(GT)的时钟RXOUTCLK或TXOUTCLK。对于7系列FPGA,需要对GT的这两个时钟手工约束:对于UltraScale FPGA,只需对GT的输入时钟约束即可,Vivado会自动对这两个时钟约束。
对于进入到IP Core(比如MMCM)的主时钟,只有我们在IP Core中指定了时钟频率,那么Vivado会自动产生一个约束文件来约束该输入的主时钟。
我们以Vivado自带的wave_gen工程为例,该工程中输入一对差分的时钟信号,进入到MMCM中,我们无需再对这个主时钟添加约束。

可以看到,综合后这个时钟已经被约束了:

这是因为该ip生成的xdc文件中,已经包含了对这个主时钟的约束,如下图:

所以很多同学可能误以为只要是进了IP Core的主时钟,都不需要再手动添加约束了。
但如果收入的差分时钟先经过了IBUFDS,然后再以单独的形式进入了MMCM:

综合后,可以看到该时钟是没有被约束的:

此时由于输入时钟并非来自管脚,所以Source选择为Global Buffer

再看刚刚的clk_core.xdc文件,已经没有产生主时钟的约束了:

为什么会没有这个约束了呢?因为输入的时钟并非来自管脚,IP Core并不知道从哪个pin输入的,所以就无法添加主时钟的约束,此时就需要我们再手动添加约束。