[FPGA15]时钟组_虚拟时钟_时钟抖动_最大最小延迟

时钟组,虚拟时钟,时钟抖动,最大最小延迟

时钟组(set_clock_groups)

  • 通常而言,Vivado集成开发环境总是计算设计中所有时钟之间的路径,除非设计者通过时钟组指定或者存在假的路径约束。"set_clock_groups"指令用于禁止在所标识的时钟组之间,以及在一个时钟组内的时钟进行时序分析。
  • 需要注意的是,忽略两个时钟之间的时序分析,并不代表他们之间的路径可以在硬件中正常工作。为防止出现错误,设计者必须验证那些异步数据传输协议的路径。
  • 具体的时钟组约束又分为:异步时钟组,逻辑互斥时钟组,物理互斥时钟组。

异步时钟组(-asynchronous)

  • 当两个主时钟是异步关系时,使用"-asynchronous"参数来指定
set_clock_groups -name <groups_name> -asynchronous \
    -group <clock_name_1> -group <clock_name_2>
  • 具体举例如下。分别有两个基本时钟clk1和clk2,两个时钟属于异步关系。
create_clock -period 10 -name clk1 [get_ports clk1]
create_clock -period 8 -name clk2 [get_ports clk2]
set_clock_groups -name asynchronous_clk1_clk2 \
    -asynchronous -group clk1 -group clk2

逻辑互斥时钟组

  • 在一些设计中,有几种操作模式,这些操作要求不同的时钟。通过一个时钟多路复用器,如:BUFGMUXH,BUFGCTRL或者LUT,选择不同的时钟。
  • 由于这些单元是可组合的单元,所以Vivado将所有进入的时钟传播到输出。在Vivado中,一个时钟树上,同一时刻可以存在几种时序的时钟,这样便于一次报告所有的操作模式,但是这在硬件上却是不可能实现的。
  • 当两个主时钟在逻辑上是互斥的时候,可使用"-logically_exclusive"来对其进行约束。即告诉Vivado软件,这两个时钟在逻辑上是互斥的,不需要同时进行时序分析。
set_clock_groups -name <groups_name> -logically_exclusive \
    -group <clock_name_1> -group <clock_name_2>

物理互斥时钟组

  • 当我们需要验证同一个时钟端口在不同时钟频率下能否获得时序收敛时,可创建多个时钟,并通过"-add"指令添加到同一个端口上。这几个时钟在物理上是互斥的,不可能同时在一个端口上同时加载多个不同频率的时钟。
  • 当几个时钟在物理连接上是互斥的时候,可使用"-physically_exclusive"指令来对其进行约束。即告诉Vivado软件,这两个时钟在物理上是互斥的,不需要同时进行时序分析。
set_clock_groups -name <groups_name> -physically_exclusive \
    -group <clock_name_1> -group <clock_name_2>
  • 比如有两个异步主时钟clk1和clk2,需要验证在clk2频率为100MHz,clk1频率分别为50MHz、100MHz和200MHz下的时序收敛情况,可以这样来进行约束
create_clock -name clk1A -period 20.0 [get_ports clk1]
create_clock -name clk1B -period 10.0 [get_ports clk1] -add
create_clock -name clk1C -period 5.0  [get_ports clk1] -add 
create_clock -name clk2 -period 10.0 [get_ports clk2]
set_clock_groups -physically_exclusive -group clk1A -group clk1B -group clk1C
set_clock_groups -asynchronous -group "clk1A clk1B clk1C" -group clk2

虚拟时钟

  • 虚拟时钟,顾名思义,就是没有与之绑定的物理管脚的时钟。主要用于设定对输入和输出的延迟约束。

XDC约束代码

create_clock  -name <name>  -period <period>  
  • 创建虚拟时钟用的也是create_clock约束,但后面并没有加get_ports参数,因此被称为虚拟时钟。

应用场景

  • 虚拟时钟主要用于以下三个场景:
    1. 外部IO的参考时钟并不是设计中的时钟
    2. FPGA I/O路径参考时钟来源于内部衍生时钟,但与主时钟的频率关系并不是整数倍
    3. 针对I/O指定不同的jitter和latency
  • 简而言之,之所以需要创建虚拟时钟,对于输入来说,是因为输入到FPGA数据的捕获时钟是FPGA内部产生的,与主时钟频率不同;或者PCB上有Clock Buffer导致时钟延迟不同。对于输出来说,下游器件只接收到FPGA发送过去的数据,并没有随路时钟,需要下游器件使用自己内部的时钟去捕获数据。

虚拟时钟举例

  • 以输入端口为例,如下图所示,在FPGA的A和B端口分别有两个输入,其中捕获A端口的时钟是主时钟,而捕获B端口的时钟是MMCM输出的衍生时钟,而且该衍生时钟与主时钟的频率不是整数倍关系。
  • 需要给定的XDC约束如下:
create_clock -name sysclk -period 10 [get_ports clkin]
create_clock -name virclk -period 6.4
set_input_delay 2 -clock sysclk [get_ports A]
set_input_delay 2 -clock virclk [get_ports B]
  • 再举个输出的例子,我们常用的UART和SPI,当FPGA通过串口向下游器件发送数据时,仅仅发过去了uart_tx这个数据,下游器件通过自己内部的时钟去捕获uart_tx上的数据,这就需要通过虚拟时钟来约束;而当FPGA通过SPI向下游器件发送数据时,会发送sclk/sda/csn三个信号,其中sclk就是sda的随路时钟,下游器件通过sclk去捕获sda的数据,而不是用自己内部的时钟,这是就不需要虚拟时钟,直接使用set_output_delay即可。

时钟抖动

  • 除了定义时钟波形外,设计者还应明确标明与操作条件和环境相关的可预测的且随机的变化。
  • 当时钟在板上和FPGA器件内部传输时,经过某个延迟后到达时钟目的地。具体的延时分为如下两类:
    1. 源延时,即在 时钟点前的延时,通常在元器件外
    2. 网络延迟,由网络延迟引入的延迟
  • Vivado会自动的将所有时钟认为是传播时钟,并且计算时钟的传播延迟。所以,一般而言,我们只需要对于时钟的源延迟进行约束即可。

XDC约束代码

  • 具体的约束方式分别如下:
set_clock_latency -source -early 0.2 [get_clocks sysCLK]#最小延迟
set_clock_latency -source -late 0.5 [get_clocks sysCLK]#最大延迟

最大最小延迟约束

-最大最小延迟约束,顾名思义,就是设置路径的max/min delay,最小延迟用于保持时间的分析,最大延迟用于建立时间的分析。使用"set_max/min_delay"语句进行约束,主要应用场景有两个:

  1. 输入管脚的信号经过组合逻辑后直接输出到管脚,即只为数据通路
  2. 异步电路之间的最大最小延迟,即存在异步时钟
  • max/min delay的约束平时用的相对少一些,因为在跨异步时钟域时,我们往往会设置asynchronous或者false_path。对于异步时钟,我们一般都会通过设计来保证时序能够收敛,而不是通过时序约束来保证。

XDC约束代码

  • 具体的约束方式分别如下:
set_max_delay <delay> [-datapath_only] [-from <node_list>][-to <node_list>][-through <node_list>]
set_min_delay <delay> [-from <node_list>] [-to <node_list>][-through <node_list>]
参数 含义
-from 有效的起始节点包含:时钟,input(input)端口,或时序单元(寄存器,RAM)的时钟引脚
-to 有效的终止节点包含:时钟,output(inout)端口或时序单元的数据端口
-through 有效的节点包含:引脚,端口,线网

参考:

  1. FPGA时序约束理论篇之时钟周期约束-Author:猫叔
  2. 《Xilinx FPGA权威设计指南--基于Vivado2018集成开发环境》,何宾,电子工业出版社