时钟周期约束

同步时序路径是最为重要的路径。时钟周期约束可覆盖同一时钟驱动的所有同步逻辑单元并约束相应的路径,如图6.3所示。

在Vivado中,通过creat_clock可轻松创建时钟周期约束。该命令有几个重要参数,如表6.2所示。其中,-waveform不仅确定了时钟的占空比,还确定了时钟的相位关系。

用作图6.3所示的时钟周期约束时,creat_clock的对象必须为主时钟(Primary Clock)。主时钟通常有两种情形:一种是时钟由外部时钟源提供,通过时钟引脚输入FPGA,该时钟引脚绑定的时钟为主时钟,如图6.4所示;另一种是高速收发器(GT)的时钟RXOUTCLK或TXOUTCLK。对于7系列FPGA,需要对GT的这两个时钟手工约束;对于UltraScale FPGA,只需对GT的输入时钟约束即可,Vivado会自动对这两个时钟约束。

如何确定主时钟是时钟周期约束的关键,除了根据主时钟的两种情形判断之外,还可以借助Tcl脚本判断。在Vivado中,通过Tcl脚本6.1(这两行脚本任选其一即可)可以快速确定主时钟。其中,第1行脚本输出结果如图6.5所示,第2行脚本输出结果如图6.6所示。两者都可显示出未约束的主时钟。

一旦确定了主时钟,即可对其创建时钟约束。这里分几种情形讨论。

情形1:主时钟之间有明确的相位关系

如表6.2所示,-waveform不仅确定了时钟的占空比,也确定了时钟之间的相位关系。下面以图6.7所示情形为例。3个时钟的特性和关系可描述为

(1)clka频率为200Mhz,等占空比。

(2)clkb频率为100Mhz,占空比为40:60.

(3)clkc频率为200Mhz,等占空比,时钟抖动为120ps。

(4)clka的下降沿与clkb、clkc的上升沿对齐。

根据时钟特征,结合图6.7可确定入tcl脚本6.2所示的时钟周期约束。这里需要说明的是,该脚本中的数字默认以ns为单位。当时钟为等占空比且第一个上升沿出现在0时刻时,-waveform可省略,如该脚本第3行所示。需要明确的是,不同于ucf,xdc在默认情况下认为时钟之间是同步关系而非异步。

对于已创建的时钟周期约束,可通过report_clocks命令查看约束是否生效、是否正确。也可借助Tcl脚本6.3查看时钟属性。其中,第1行返回时钟的所有属性,以Vivado自带的例子工程cpu(Synthesized)为例,其返回值如图6.8所示;第2行脚本返回指定的时钟属性的值,此处为10.000。

情形2:主时钟之间为异步关系

主时钟之间如果是一步关系,则需要通过set_clock_groups命令明确指定。如图6.9所示的两个主时钟,各自通过IBUF+BUFG驱动逻辑,则可通过Tcl脚本6.4所示方式指定两者为异步。

如图6.9所示为Vivado自带例子工程BFT中的情形。对于异步时钟,可通过report_clock_interaciton查看约束是否生效,其返回结果如图6.10所示,可以看到bftClk和wbClk被标记为Asynchronous Groups。

如果两个主时钟还通过MMCM或PLL生成了其他时钟,若这两个主时钟为异步关系,则它们的生成时钟也为异步关系,如图6.11所示。此时需要通过Tcl脚本6.5所示的方式指定时钟关系。

情形3:差分时钟的约束

对于差分时钟,只用约束P端口即可。如图6.12所示情形,对应的约束如Tcl脚本6.6所示。

如果既对P端口约束又对N端口约束,如Tcl脚本6.7所示。此时,通过report_clocks命令,则会生成如图6.13所示的结果,显示在同一端口同时生成两个时钟,如图中的clk_clk_gen和clk_clk_gen_2均来自于MMCU的CLKOUT0端口。通过report_clock_interaction命令,则会生成如图6.14所示报告,显示clk_clk_gen和clk_clk_gen_2之间的路径不安全(unsafe)。这些结果与实际情形并不相符,一方面会增加内存的开销,另一方面也会延长编译时间。

情形4:在同一端口创建多个时钟

在同一端口创建多个时钟的目的在于验证同一设计能否在不同时钟周期约束下获得时序收敛。例如,同一设计需要在不同的PCB上以不同的时钟频率运行,为了便于版本管理,并不需要针对不同的PCB分别创建Vivado工程;或者为了验证设计能否在更高的时钟频率下运行,此时也不需要重新创建Vivado工程。这两种情形都只需在同一端口创建多个时钟即可。以Vivado自带的例子工程BFT为例,该设计中有两个时钟wbClk和bftClk,如果需要验证下述3个条件时序能投收敛,只需要通过Tcl脚本6.8所示方式即可实现。

(1)wbClk位100Mhz,bftClk为200Mhz。

(2)wbClk位150Mhz,bftClk为200Mhz。

(3)wbClk位200Mhz,bftClk为200Mhz。

在Tcl脚本6.8中,需要注意第2行和第3行,相比于第1行多了一个-add,如果没有该参数,则会显示如图6.15所示的警告信息,该信息表明前述约束被覆盖。如果用report_clocks命令,则只会显示wbClk_B。在第5行,set_clock_groups命令旨在明确wbClk_A、wbClk_B和wbClk_C三者物理上不是同时存在的。如果没有该行脚本,Vivado也会对这三者之间的路径进行分析,这与实际情形并不相符。

分别采用Tcl脚本6.4和Tcl脚本6.8之后,相应的时序报告如图6.16所示,可以看到与该图左边相比,右边分别显示了wbClk_A、wbClk_B和wbClk_C的时序路径分析结果。

此外,针对Tcl脚本6.8,通过report_clock_interaction命令,可以查看时钟之间的关系,如图6.17所示,可以看到wbClk_A、wbClk_B和wbClk_C两两之间均构成Exclusive Groups,而与bftClk均构成Asynchronous Groups。

情形5:对高速收发器的时钟约束

对于高速收发器的时钟,若芯片为7系列FPGA,则主时钟为收发器的TXOUTCLK和RXOUTCLK,如图6.18所示。

以Vivado自带的例子工程CPU(Synthesized)为例,其中的高速收发器时钟约束如Tcl脚本6.9所示,可以看到其主时钟是通过get_pins获得的。

Tcl脚本6.9略显烦琐,尤其是当收发器个数较多时,事实上可以通过foreach语句进行优化,结果如Tcl脚本6.10所示。

情形6:创建虚拟时钟

只有在创建输入或输出延迟约束时才会使用虚拟时钟。顾名思义,虚拟时钟并没有与之绑定的物理引脚。之所以创建虚拟时钟,是因为传输给FPGA的数据所用到的捕获时钟是由FPGA内部生成的,与主时钟频率不同;或者PCB上有Clock Buffer导致时钟延迟不同。

如图6.19所示,din的发送时钟为200Mhz,而FPGA的主时钟clkin为100Mhz,捕获时钟由该主时钟通过MMCM生成。此时,应采用Tcl脚本6.11所示的方式创建虚拟时钟作为输入延迟约束的参考时钟。

如图6.20所示为Clock Buffer导致时钟延迟不同,此时应采用Tcl脚本6.12所示的方式创建虚拟时钟,并声明其时钟延迟。

猜你喜欢

转载自blog.csdn.net/yundanfengqing_nuc/article/details/105769855