FPGA 时钟约束
时钟约束
物理
XDC
约束驱动时钟树的实现并控制使用高扇出时钟资源。由于
UltraScale
器件时钟比采用以前架构的时钟更灵
活,并且包括额外的体系结构约束,因此了解如何正确约束时钟以实现是非常重要的。
使用
LOC
约束
IO/MMCM/PLL/GT
要约束时钟,您可以按如下所示分配布局约束:
•
在
I/O
端口的时钟输入
为
GCIO
上的时钟分配
PACKAGE_PIN
约束或为
IOB
分配
LOC
会影响时钟网络。直接连接到输入端口的
MMCM/PLL
和时钟缓存必须布局在相同的时钟区域中。
•
在
MMCM
或
PLL
上
直接连接到
MMCM
或
PLL
输出的时钟缓存,连接到
MMCM
或
PLL
输入的输入时钟端口自动布局在相同的时钟区
域中。如果输入时钟端口和
MMCM
或
PLL
直接连接并限制在不同的时钟区域,则必须手动插入时钟缓存并在连接
到
MMCM
或
PLL
的网络上设置
CLOCK_DEDICATED_ROUTE
约束。
•
在
GT*_CHANNEL
或
IBUFDS_GTE3
单元上
由单元驱动的
BUFG_GT
布局在相同的时钟区域中。
注意!
赛灵思不推荐在时钟缓存单元上使用
LOC
约束。此方法将时钟强制到特定轨道
ID
,这可能导致无法合法布线的
布局。当您明确设计的整个时钟树并且设计中的布局一致时,只能使用
LOC
约束在
UltraScale
器件中布局高扇出时钟
缓存。即使在采取这些预防措施后,由于设计或约束变化,在实现期间可能会发生冲突。
在时钟缓存上使用
CLOCK_REGION
属性
您可以使用
CLOCK_REGION
约束为时钟区域分配时钟缓存,而不指定
site
位置。这在优化所有时钟树以及确定适当的
缓存
site
位置以成功布线所有时钟时,将赋予布局器更大的灵活性。
您还可以使用
CLOCK_REGION
约束来提供关于级联时钟缓存或由非时钟原语 (例如,构造逻辑)驱动的时钟缓存的布
局的指导。
在以下示例中,
XDC
约束将
clkgen/clkout2_buf
时钟缓存分配给
CLOCK_REGION X2Y2
。
set_property CLOCK_REGION X2Y2 [get_cells clkgen/clkout2_buf]
注释:
在大多数情况下,时钟缓存由已经约束到时钟区域的输入时钟端口,
MMCM
,
PLL
或
GT*_CHANNEL
直接驱动。
在这种情况下,则时钟缓存将自动布局在同一时钟区域中,并且您不需要使用
CLOCK_REGION
约束。
使用
Pblock
限制时钟缓存布局
当不需要将时钟缓存布局在特时序钟区域中时,可以使用
Pblock
指时序钟区域的范围。例如,当需要
BUFGCTRL
来复
用位于不同区域的两个时钟时,使用
Pblock
。您可以将
BUFGTRL
分配给包含两个时钟驱动程序之间的时钟区域的
Pblock
,并让布局器识别有效的布局。
注释:
赛灵思不推荐在单个时钟区域使用
Pblock
。
在时钟网络上使用
USER_CLOCK_ROOT
属性
您可以使用
USER_CLOCK_ROOT
属性,来强制限时序钟缓存驱动的时钟根位置。指定
USER_CLOCK_ROOT
属性会影响
设计布局,因为它通过修改时钟布线来影响插入延迟和偏移。
USER_CLOCK_ROOT
值对应时钟区域,并且必须在由高
扇出时钟缓存直接驱动的网段上设置属性。下面给出一个实例:
set_property USER_CLOCK_ROOT X2Y3 [get_nets clkgen/wbClk_o]
如下例所示,布局后,您可以使用
LOCK_ROOT
性查询实际的时钟根。
CLOCK_ROOT
将报告分配根,无论是由用户分
配还是由
Vivado
工具自动分配。
get_property CLOCK_ROOT [get_nets clkgen/wbClk_o]
=> X2Y3
另一种查看已实现设计的时钟根分配的方法是使用
report_clock_utilization
Tcl
命令。例如:
report_clock_utilization [-clock_roots_only]
下图显示了此报告。
在多个时钟网络上使用
CLOCK_DELAY_GROUP
约束
您可以使用
CLOCK_DELAY_GROUP
约束来匹配由不同时钟缓存驱动的多个相关时钟网络的插入延迟。此约束通常用于
最小化源自同一
MMCM
,或
PLL
的时钟之间的同步
CDC
时序路径上的偏移。您必须在与时钟缓存直接联通网段上设
置
CLOCK_DELAY_GROUP
约束。下面的示例显示了
clk1_net
和
clk2_net
时钟网络,这些网络由时钟缓存直接驱
动:
set_property CLOCK_DELAY_GROUP grp12 [get_nets {clk1_net clk2_net}]