时钟约束学习笔记

摘自 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.时钟周期

占空比与相位约束举例

image-20230824205135252

         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]

image-20230824205845377

例如上图中的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高速口来的 单端 系统时钟约束

image-20230824210750104

		create_clock -name rxclk -period 3.33 [get_pins gt0/RXOUTCLK]

差分输入系统时钟约束 (必须约束到P端口上)

image-20230824211311012

		create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]

4.用户生成时钟

即自定义时钟,由系统时钟分频而来。

image-20230824213155864

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 示例。 图为框图

image-20230829001218412

I0/1 : 时钟输入引脚

S0/1 : 时钟选择信号

CE0/1 :时钟使能

IGNORE 0/1 : 掩码(置位时,无视S0/S1,开关状态)

image-20230829001231463

剩余详见UG903。

6.假路径(False Paths)

错误路径(假路径)是在设计中拓扑上存在但以下任一种情况的路径:

(1)不起作用。

(2)不需要计时。

因此,在时序分析过程中应忽略错误路径

图中就是一个假路径,因为两个多路复用器由相同的选择信号驱动,所以从Q到D的路径不存在,所以该被定义为假路径。

image-20230824224813607


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.

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值