摘自 UG903 关于XDC中时钟的约束
一.XDC 指令优先级
1.xdc 约束存在优先级,在文件中,指令位置越往下优先级越高(即底部优先级大于顶部优先级)。
2.高优先级可以覆盖低优先级。
3.如果重叠,即多条约束约束同一对象,那么,优先级高的生效。
> create_clock -name clk1 -period 10 [get_ports clk_in1] > create_clock -name clk2 -period 11 [get_ports clk_in1]
第二条约束会覆盖第一条约束。因为两条约束都约束了同一个端口且第二条约束优先级更高。
4.在第三点的基础上,多种类型的约束约束到同一路径,那么优先级从上往下以此为:
1. Clock Groups (set_clock_groups) 2. False Path (set_false_path) 3. Maximum Delay Path (set_max_delay) and Minimum Delay Path (set_min_delay) 4. Multicycle Paths (set_multicycle_path)
5.约束越具体,优先级越高
6.Clocks 优先级低于 Ports, pins, and cells (时钟优先级低于端口,引脚和单元)。
7.同一个对象的同类型约束最好只有一个
8. 剩下的详见 UG903 Chapter_7
二.时钟约束
#### 1.时钟约束有影响
会对最终结果造成影响的约束有:
• create_clock • create_generated_clock • set_input_delay • set_output_delay • set_clock_groups • set_false_path • set_max_delay • set_multicycle_path
即指,在时钟约束里,只有这些约束才会真正影响到位流文件的生成。
2.时钟周期
占空比与相位约束举例
Clk0: period = 10, waveform = {0 5} Clk1: period = 8 , waveform = {2 8}
时钟Clk0的周期为10ns,占空比为50%,相位为0ns。
时钟Clk1具有8ns周期,75%占空比(高时间为8ns中的6ns)和2ns上升沿相移。
3.主时钟约束 (系统时钟约束)
主时钟(即系统时钟)是通过特定时钟引脚或千兆收发器输出引脚)进入设计的系统板载时钟。
主时钟只能通过create_clock命令定义。
系统时钟为100M,周期10纳秒,无相位偏移约束举例。
create_clock -period 10 [get_ports sysclk]
系统时钟100M,周期10ns,占空比25%,相移90度约束距离
create_clock -name devclk -period 10 -waveform {2.5 5} [get_ports ClkIn]
例如上图中的sys_clk,是一个周期10ns,50%占空比,没有相位移动的系统时钟。他的约束为:
create_clock -period 10 [get_ports sysclk]
同理,约束一个 时钟周期为10ns,25%占空比,90度相移的系统时钟
create_clock -name devclk -period 10 -waveform {2.5 5} [get_ports ClkIn]
通过GT0高速口来的 单端 系统时钟约束
create_clock -name rxclk -period 3.33 [get_pins gt0/RXOUTCLK]
差分输入系统时钟约束 (必须约束到P端口上)
create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]
4.用户生成时钟
即自定义时钟,由系统时钟分频而来。
clkin为系统时钟,二分频得到clkdiv2,约束为:
create_clock -name clkin -period 10 [get_ports clkin] #主时钟约束 #分频思想定义 create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 \ [get_pins REGA/Q] #衍生时钟约束1 create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 \ [get_pins REGA/Q] #衍生时钟约束2 #衍生时钟约束1和2等效 #创建一个时钟,叫 clkdiv2 来自 clkin ,是以寄存器A的Q为根源,除以 2 得到的 #通过边沿定义 create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5} \ [get_pins REGA/Q] #创建一个时钟,叫 clkdiv2 来自 clkin ,是以寄存器A的Q为根源,通过响应边沿 {1 3 5} 来生成的。
5.时钟组(Clock Groups)
时钟组约束主要用于禁用所约束的时钟组之间的时许分析,组内依然需要进行时序分析。
时钟关系类型
Synchronous Clocks 同步时钟,及同源或能确定其相位关系
Asynchronous Clocks 异步时钟,不同源或不能确定相位关系
Unexpandable Clocks 不可扩展时钟(个人理解就是周期刁钻,周期带小数)可归到异步时钟。
Asynchronous Clock Groups 异步时钟组
异步时钟之间用 set_clock_groups 指令规避异步时钟之间的时序检查。
主时钟 clk0 在输入端口上定义,并且通过第二个MMCM生成了衍生时钟 usrclk 和 itfclk ;
主时钟 clk1 是在 GTP 实例的输出上定义的恢复时钟,并且通过第二个MMCM生成了衍生时钟 gtclkrx 和 gtclktx ;
对上述两个时钟及其衍生时钟创建异步时钟组约束
#用 -asynchronous 指令直接创建异步时钟组(已知衍生时钟名称) set_clock_groups -name async_clk0_clk1 -asynchronous -group {clk0 usrclk itfclk} \ -group {clk1 gtclkrx gtclktx} # 如果不确定衍生时钟名字,就用 get_clocks - include_generated_clocks 动态搜索它,写成 set_clock_groups -name async_clk0_clk1 -asynchronous \ -group [get_clocks -include_generated_clocks clk0] \ -group [get_clocks -include_generated_clocks clk1] # - include_generated_clocks 意为包含该时钟的衍生时钟 #两种写法等效
Exclusive Clock Groups 独立时钟组
有些设计有几种工作模式,需要使用不同的时钟。时钟之间的选择通常通过 BUFGMUX 和BUFGCTRL 或LUT 之类的时钟多路复用器来完成。(时钟树中尽量不使用LUT资源)。
在需要不同时钟的工作模式下,虽然时钟树上可以同时存在多个时钟,但是这些组合单元在硬件上是不可能同时使用多个时钟的。
这样的时钟被称为独占时钟。使用 set_clock_groups 指令对它们进行约束。
• -logically_exclusive # 逻辑上独立 • -physically_exclusive # 物理上独立 #在 Xilinx FPGA 中这俩一样的,不区分物理还是逻辑独立
独占时钟组示例
MMCM实例生成连接到 BUFGMUX 实例 clkmux 的 clk0(I0) 和 clk1 (I1)。使用 clkmux 的输出驱动设计时钟树。默认情况下,Vivado IDE会分析 clk0 和 clk1 之间的路径,即使这两个时钟共享相同的时钟树并且不能同时存在。必须输入以下约束才能禁用两个时钟之间的分析
set_clock_groups -name exclusive_clk0_clk1 -physically_exclusive \ -group clk0 -group clk1 #建立时钟组 名字叫 exclusive_clk0_clk1 是独立时钟 \ clk0 组 clk1 组 #clk0,clk1也需要独立的约束,具体参考主时钟约束
补充:BUFGCTRL & BUFGMUX 通用时钟控制缓冲区 和 通用时钟多路复用器缓冲区 (皆为原语)
具体原语见手册或VIVADO 示例。 图为框图
I0/1 : 时钟输入引脚
S0/1 : 时钟选择信号
CE0/1 :时钟使能
IGNORE 0/1 : 掩码(置位时,无视S0/S1,开关状态)
剩余详见UG903。
6.假路径(False Paths)
错误路径(假路径)是在设计中拓扑上存在但以下任一种情况的路径:
(1)不起作用。
(2)不需要计时。
因此,在时序分析过程中应忽略错误路径
图中就是一个假路径,因为两个多路复用器由相同的选择信号驱动,所以从Q到D的路径不存在,所以该被定义为假路径。
TIP: 在只是需要放松对同步路径的计时要求,但该路径仍然必须进行计时、验证和优化的情况下,使用多周期约束而不是假路径约束。
删除假路径的好处:
1.减少时序优化相关操作的运行时间
2.提高结果质量(QOR)
3.避免错误路径带来的严重时序违例掩盖其他严重错误。
使用XDC命令SET_FALSE_PATH在工具内部定义假路径:
set_false_path [-setup] [-hold] [-from <node_list>] [-to <node_list>] \ [ -through <node_list>]
-from 节点应该是有效起点。
有效的起始点是时钟对象、顺序元件的时钟引脚或输入(或输入输出)主端口。可以有个元素。
-to 节点应该是有效端点。
有效端点是时钟对象、输出(或INOUT)主端口或顺序元件输入数据管脚。可以有多个元素。
-through 直通所有 (具有方向性)
有效目标是管脚、端口或网络。可以有多个元素
警告:在使用不带 -from,-to ,-through的 set_false_path 指令时,它会从时序分析中删除有关这个引脚或端口的所有路径。
当时间约束是为IP或子块设计的,但随后在不同的上下文或更大的项目中使用时,要特别注意。
如果单独使用 -through 时,可能会删除远多于预期的路径
对于 -through ,下列约束的第一条约束不等价于第二条约束,顺序很重要
set_false_path -through cell1/pin1 -through cell2/pin2 set_false_path -through cell2/pin2 -through cell1/pin1
以下示例表示: 删除端口到所有寄存器的时钟路径(即不检查用到了 reset 的所有路径)
set_false_path -from [get_port reset] -to [all_registers]
以下示例禁用两个异步时钟域之间的定时路径(例如,从时钟CLKA到时钟CLKB)
set_false_path -from [get_clocks CLKA] -to [get_clocks CLKB]
上一个例子只是禁用CLKA到CLKB的时钟路径,但是并没有禁用CLKB到CLKA。因此,禁用两个时钟域之间的任一方向上的所有路径需要两个SET_FALSE_PATH命令。
但是在实际使用时,如果需要禁用两个时钟域之间的时序路径,使用时钟组(Clock Groups)是最佳的选择。
set_clock_groups -group CLKA -group CLKB
x.其他时钟
参考 UG903 Using Constraints.