AN 433:源同步接口的约束与分析

文章目录

  • 简介
    • 时钟和数据的关系
    • SDR(单数据速率)和 DDR(双数据速率)
    • 接口约束
      • 默认时序分析行为
  • 源同步输出
    • 输出时钟
    • 输出时钟约束
      • 时钟电路和约束示例
    • 以系统为中心的输出延迟约束
      • 输出最大延时
      • 输出最小延时
    • 以系统为中心的输出时序例外
      • 相同边沿捕获边沿对齐输出
        • 目标建立多周期例外
        • 为输出最大延迟增加一个时钟周期
      • 相反边沿捕获边沿对齐输出
      • 相同边沿捕获中心对齐输出
      • 相反边沿捕获中心对齐输出
    • 以 FPGA 为中心的输出延迟约束
      • 最小数据有效约束
        • 从建立和保持关系推导出的约束
        • 来自早期和晚期边界的约束
      • 最大数据无效约束
    • 以 FPGA 为中心的输出时序例外
      • 相同边沿捕获边沿对齐输出
        • 目标多周期例外方法
        • 增加一个时钟周期
      • 相反边沿捕获边沿对齐输出
      • 相同边沿捕获中心对齐输出
        • 最大和最小延迟例外
        • 添加部分时钟周期
      • 相反边沿捕获中心对齐输出
    • 时序分析和时序收敛
      • 时序收敛
      • 示例
  • 源同步输入
    • 输入时钟
    • 输入时钟约束
      • 虚拟时钟(Virtual Clocks)
      • 生成时钟(Generated Clocks)
      • 时钟不确定性(Clock Uncertainty)
      • 输入时钟电路和约束示例
    • 以系统为中心的输入延迟约束
      • tco 和 tco min 方法
      • 建立和保持方法
    • 以 FPGA 为中心的输入延迟约束
      • 建立和保持
      • 最大数据倾斜
    • 输入时序例外
      • 相同边沿捕获边沿对齐输入
      • 相同边沿捕获中心对齐输入
      • 相反边沿捕获边沿对齐输入
      • 相反边沿捕获中心对齐输入
    • 时序分析
      • 时序报告

本应用笔记描述了约束和分析源同步接口的技术。在源同步接口中,时钟的源与数据的源是同一设备,而不是其他源,例如普通时钟网络。

图1显示了一个基本源同步接口的框图。
在这里插入图片描述

简介

源同步接口用于高速数据传输。DDR 内存、HyperTransport 总线和 SPI-4.2 标准都使用源同步接口。

约束源同步接口可能很复杂。Synopsys 设计约束(SDC)格式为正确的分析提供了必要的细节和精度。在阅读本应用程序说明之前,请先熟悉 SDC 格式和 TimeQuest (现在叫 Timing Analyzer)时序分析工具。

您可以使用 Quartus 软件安装附带的脚本来指导您完成为源同步接口创建约束的过程。要使用该脚本,请在项目目录中输入以下命令:

quartus_sta --ssc <project name>

时钟和数据的关系

一些源同步接口使用与数据边沿对齐的时钟,如图 2 所示。当时钟与数据边沿对齐时,接收设备根据需要移动时钟去捕获数据。有些接口在时钟沿上升或下降后才捕获数据。因此,除了在第一个上升或下降锁存器边缘之后的时钟移位之外,还需要进一步的逻辑。
在这里插入图片描述

其他源同步接口使用相对于数据移位的时钟(通常与数据中心对齐),如图 3 所示。接收设备直接使用移位的时钟捕获数据,特别是在低速接口中。
在这里插入图片描述

当源同步输入时钟直接锁存数据时,接收设备不执行任何额外的时钟校准。然而,在一些接口中,锁相环(PLL)将输入时钟移位,然后用于锁存数据。如果锁相环使输入时钟发生移位,可以通过调整锁相环的相位偏移来调整时钟和数据的时序关系。

SDR(单数据速率)和 DDR(双数据速率)

在源同步 SDR 接口中,时钟的一条边沿(通常是上升沿)传输数据,如图 4 所示。传输一个比特所需的时间,称为单位间隔(UI),等于时钟的周期。
在这里插入图片描述

在源同步 DDR 接口中,数据在时钟的两端传输,如图 5 所示。UI 等于时钟周期的一半,假设占空比为 50/50。
在这里插入图片描述

每个有效时钟边沿都需要数据约束。SDR 接口只需要约束一个有效时钟边沿,通常是上升沿。DDR 接口需要约束时钟的上升沿和下降沿。

例 1 显示了与上升时钟沿相关的约束。对于 SDR 接口,不需要其他数据约束。

1:SDR 接口的输出约束示例

set_output_delay -clock [get_clocks output_clk] -max 2 [get_ports data_out]
set_output_delay -clock [get_clocks output_clk] -min -1 [get_ports data_out] -add_delay

DDR 接口需要与时钟的下降沿和上升沿相关的数据约束。

当您为 DDR 接口创建数据约束时,请复制相对于上升时钟沿的约束,并添加 -clock_fall 和 -add_delay 选项,以便约束相对于下降时钟沿。例 2 显示了与上升和下降时钟边相关的数据约束。-clock_fall 选项使约束相对于下降时钟边沿,-add_delay 选项允许多个最大或最小延迟约束应用于同一端口。

2:DDR 接口的输出约束示例

set_output_delay -clock [get_clocks output_clk] -max 2 [get_ports data_out]
set_output_delay -clock [get_clocks output_clk] -min -1 [get_ports data_out] -add_delay
set_output_delay -clock [get_clocks output_clk] -max 2 -clock_fall [get_ports data_out] -add_delay
set_output_delay -clock [get_clocks output_clk] -min -1 -clock_fall [get_ports data_out] -add_delay

接口约束

源同步接口需要以下三种类型的 SDC 约束或例外:

  1. 时钟约束:定义接口中使用的时钟。时钟约束定义周期,并包括任何其他时钟特性,如偏移和不确定性。
  2. 输入或输出延迟约束:描述数据在接口有效所需的时间。输入和输出延迟约束来自时钟参数,如 skew、tsu 或 tco,它们指定接口操作。有两种方法可以根据可用的或指定的 I/O 时序来获得源同步接口的输入和输出延迟:
  • 以系统为中心的方法:将 FPGA 的时序信息作为更大系统的一部分加以考虑。这样的时序信息包括电路板走线延迟和 FPGA 接口的外部设备的 I/O 时序要求。您可以创建约束来描述这些延迟,这些延迟是 FPGA 之外系统的一部分。当您拥有与 FPGA 接口有关的系统的时序信息时,或者您想要验证该接口上的系统时序时,请使用以系统为中心的方法。

  • 以 FPGA 为中心(或 data sheet)的方法:专注于 FPGA 边界的时钟和数据关系。这种方法不需要 FPGA 之外的任何时序参数信息,例如电路板走线延迟和外部设备的 I/O 时序要求。您可以创建约束来指定数据总线上可接受的最大偏差,以及数据和时钟信号之间的时序关系(例如,中心或边缘对齐)。当您为特定的偏差、时钟和数据关系约束源同步接口时,请使用以 FPGA 为中心的方法。当您不知道外部器件的时序参数时,也可以使用以 FPGA 为中心的方法。

  1. 时序例外:控制发起(launch)和锁存(latch)边沿用于时序分析。时序例外的作用是分析接口中有效的时序路径,不分析接口中无效的路径。有关为什么需要时序例外的更多信息,请参阅“默认时序分析行为”。

如果您不打算将您的设计迁移到 HardCopy® 设备,您可以使用 set_max_skew 约束来约束源同步接口。Altera 建议您使用本应用程序说明中描述的方法来约束和分析源同步接口。

默认时序分析行为

默认情况下,时序分析假设由上升时钟沿发起的数据被下一个上升时钟沿锁存。然而,源同步接口通常表现出不同的行为。数据被发起数据的同一边沿锁存,源同步 DDR 接口在上升和下降时钟沿上发起和锁存数据。

图 6 显示了默认情况下在边沿对齐 DDR 接口中建立时间关系的分析。红色实线箭头表示相同边沿(same-edge)传输的建立时间关系(从上升到上升和从下降到下降),红色虚线箭头表示相反边沿(opposite-edge)传输的建立时间关系(从上升到下降和从下降到上升)。
在这里插入图片描述

图 7 显示了默认情况下在边沿对齐的 DDR 接口中保持时间关系的分析。蓝色实线箭头表示相同边沿(same-edge)传输的保持时间关系(从上升到上升和从下降到下降),蓝色虚线箭头表示相反边沿(opposite-edge)传输的保持时间关系(从上升到下降和从下降到上升)。
在这里插入图片描述

图 8 显示了默认情况下在中心对齐的 DDR 接口中建立时间关系的分析。红色实线箭头表示相同边沿(same-edge)传输的建立时间关系(从上升到上升和从下降到下降),红色虚线箭头表示相反边沿(opposite-edge)传输的建立时间关系(从上升到下降和从下降到上升)。
在这里插入图片描述

图 9 显示了默认情况下在中心对齐的 DDR 接口中保持时间关系的分析。蓝色实线箭头表示相同边沿(same-edge)传输的保持时间关系(从上升到上升和从下降到下降),蓝色虚线箭头表示相反边沿(opposite-edge)传输的保持时间关系(从上升到下降和从下降到上升)。
在这里插入图片描述

根据时钟和数据的对齐以及用于发起(launch)和锁存(latch)数据的边沿,您可能必须添加时序例外或调整时序约束,以确保正确的时序分析。

例如,如果您的接口实现了相同边沿(same-edge)数据传输,则必须向图 6 到图 9 中标识的相反边沿(opposite-edge)数据传输添加 false path 时序例外,因为相反边沿传输对于您的实现是无效的。同样,如果您的接口实现了相反边沿(opposite-edge)数据传输,则必须向图 6 到图 9中 标识的相同边沿(same-edge)数据传输添加 false path 时序例外,因为相同边沿传输对您的实现无效。false path 时序例外会将无效路径排除在时序分析之外。

源同步输出

源同步输出需要以下类型的时钟约束、输出延迟约束和时序例外。

  • “输出时钟约束”
  • “以系统为中心的输出延迟约束”
  • “以 FPGA 为中心的输出延迟约束”
  • “以系统为中心的输出时序例外”
  • “以 FPGA 为中心的输出时序例外”

输出时钟

输出时钟由 FPGA 提供。图 10 显示了 FPGA 如何获取目标时钟的示例。
在这里插入图片描述

您可以使用各种电路来生成输出时钟。以下是一些类型的输出时钟:

  • 来自系统锁相环的时钟(Clocks from a system PLL)
  • 由切换时钟输出寄存器生成的时钟,例如 ALTDDIO 模块(Clocks generated by a toggling clock output register, such as in the ALTDDIO megafunction)
  • 由状态机控制的时钟,该状态机在一个时钟边沿上记录数据,在另一个时钟边沿上记录输出时钟(Clocks controlled by a state machine that clocks data on one clock edge and the output clock on another clock edge)
  • 由记录数据输出的同一时钟驱动的时钟(Clocks driven by the same clock that clocks the data outp)

两种常见的选择是使用直接从芯片驱动的时钟,或者使用带有 ALTDDIO_OUT 模块的 DDR 输出寄存器的芯片驱动的时钟。

当输出时钟独立于数据输出寄存器时钟产生时(例如,有两个锁相环 taps),您可以通过调整时钟之间的关系来改变时钟和数据的时序关系,例如通过调整锁相环相位。

在 FPGA 中,当输出时钟通过 DDR 寄存器驱动时,时钟和数据输出之间的偏差很低,因为从每个 DDR 寄存器到相应输出引脚的路由几乎相同。当直接从芯片驱动时钟时,DDR 数据寄存器和全局时钟网络之间路由类型的差异导致时钟和数据输出之间的较大偏差。同时,允许的时钟频率更低。在以较低时钟速度运行的接口中直接使用时钟是可以接受的,并且可以容忍时钟和数据之间更多的输出偏差。

如果您在 HardCopy II 设备中实现设计,为了实现最佳性能,请使用专用 PLL 输出作为时钟输出,而不是 DDR 输出寄存器。如果接口是低速接口,或者时钟输出多于可用的专用锁相环输出,则可以使用 DDR 输出寄存器作为时钟输出。

数据和时钟输出 DDR 寄存器的时钟由锁相环生成。在某些情况下,相同的锁相环输出驱动数据和时钟输出 DDR 寄存器。在其他情况下,使用两个锁相环输出。如果您的设计包含以下内容,可以使用相同的锁相环输出:

  • 中心或边沿对齐的 SDR 输出
  • 边沿对齐的 DDR 输出

如果您的设计包含以下内容,则应使用单独的锁相环输出:

  • 中心对齐的 DDR 输出(时钟和数据有 90° 相位)
  • 直接从芯片驱动的时钟(补偿时钟和数据之间的延迟差异)
  • 时钟和数据不是中心对齐或边沿对齐(不同于 90° 或 180° 的相位)
  • 精确调整时钟和数据关系(微调相位调整)

输出时钟约束

与任何包含锁相环的电路一样,必须在锁相环输出上创建生成时钟(create generated clocks)。使用 derive_pll_clocks 命令自动创建所有生成时钟,并使生成的时钟特性(如周期、相移、乘法和除法因子)与 PLL 设置保持同步。derive_pll_clocks 还根据 PLL 输出和层次结构名称命名生成的时钟。

可以使用 create_generated_clock 命令单独指定每个 PLL 输出时钟,而不是使用 derive_pll_clocks 命令。单独创建生成的时钟可以让您灵活地命名时钟;但是,在更改 PLL 设置时,必须记住手动更新 SDC 文件中的时钟定义。

除了在锁相环输出上生成时钟外,还必须创建一个应用于 FPGA 输出时钟端口的生成时钟。这个生成的时钟表示驱动源同步接口的目标的时钟,它是输出延迟约束的时钟参考。与任何生成的时钟一样,您必须根据驱动时钟的电路的行为使用适当的相位和反转选项。

时钟电路和约束示例

图 11 和例 3 显示了具有同一数据时钟和输出时钟的输出的电路和约束。
在这里插入图片描述

3。具有同一数据时钟和输出时钟的输出的时钟约束

create_clock -name input_clock -period 10.000 [get_ports clk_in]
create_generated_clock -name output_clock -source [get_ports clk_in] [get_ports clk_out]

图 12 和例 4 显示了具有独立数据时钟和输出时钟的边沿对齐输出的电路和约束。
在这里插入图片描述

4。具有独立数据时钟和输出时钟的输出的时钟约束

create_clock -name input_clock -period 10.000 [get_ports clk_in]
create_generated_clock -name data_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[0]]
create_generated_clock -name unshifted_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[1]]
create_generated_clock -name output_clock -source [get_pins PLL|clk[1]] [get_ports clk_out]

图 13 和例 5 显示了具有独立数据时钟和输出时钟的 DDR 中心对齐输出的电路和约束。
在这里插入图片描述

5。具有独立数据时钟和输出时钟的中心对齐输出的时钟约束

create_clock -name input_clock -period 10.000 [get_ports clk_in]
create_generated_clock -name data_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[0]]
create_generated_clock -name shifted_clock -phase 90 -source [get_pins PLL|inclk[0]] [get pins PLL|clk[1]]
create_generated_clock -name output_clock -source [get_pins PLL|clk[1]] [get_ports clk_out]

图 14 和例 6 显示了具有同一数据时钟和输出时钟的 DDR 输出的电路和约束。输出时钟通过 ALTDDIO_OUT 模块的实例连接。
在这里插入图片描述

6。具有同一数据时钟和输出时钟的边沿对齐输出的时钟约束

create_clock -name input_clock -period 10.000 [get_ports clk_in]
create_generated_clock -name common_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[0]]
create_generated_clock -name output_clock -source [get_pins DDR|ddio_outa[0]|muxsel] [get_ports clk_out]

图 15 和例 7 显示了驱动数据 DDR 寄存器的一个锁相环输出和驱动时钟 DDR 寄存器的一个单独的锁相环输出的电路和约束。
在这里插入图片描述

7。具有独立数据时钟和输出时钟的输出的时钟约束

create_clock -name input_clock -period 10.000 [get_ports clk_in]
create_generated_clock -name data_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[0]]
create_generated_clock -name pll_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[1]]
create_generated_clock -name output_clock -source [get_pins DDR|ddio_outa[0]|muxsel] [get_ports clk_out]

图 16 和例 8 显示了直接从芯片驱动的时钟的锁相环的电路和约束。
在这里插入图片描述

8。具有直接输出时钟的输出的时钟约束

create_clock -name input_clock -period 10.000 [get_ports clk_in]
create_generated_clock -name data_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[0]]
create_generated_clock -name pll_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[1]]
create_generated_clock -name output_clock -source [get_pins PLL|clk[1]] [get_ports clk_out]

以系统为中心的输出延迟约束

使用以系统为中心的约束方法,输出延迟值可以包括接收设备的建立或保持时间要求,以及电路板在数据和时钟走线上的延迟,如图 17 所示。
在这里插入图片描述

输出最大延时

公式 1 显示了计算输出最大延迟值的公式。输出最大延迟值指定输出延迟的上限,因为它使用最长的数据路径和最短的时钟路径。它定义了与目标寄存器的建立时间关系。
在这里插入图片描述

例 9 显示了输出最大延迟 SDC 约束,其输出最大延迟值来自公式 1。如果源同步接口包含 SDR 输出,则此示例非常有用。

9。输出最大延迟约束

set_output_delay -max <output maximum delay value> -clock [get_clocks output_clock] [get_ports data_out]

例 10 显示了一个 DDR 输出,该输出具有应用于下降时钟沿的重复约束。

10。DDR 输出的最大延迟约束

set_output_delay -max <output maximum delay value> -clock [get_clocks output_clock] [get_ports data_out]
set_output_delay -max <output maximum delay value> -clock [get_clocks output_clock] -clock_fall [get_ports data_out] -add_delay

输出最小延时

公式 2 显示了如何计算输出最小延迟值。输出最小延迟为输出延迟指定一个下限,因为它使用最小的数据延迟和最大的时钟延迟。它定义了与目标寄存器的保持时间关系。
在这里插入图片描述

例 11 显示了输出最小延迟 SDC 约束,其输出最小延迟值来自公式 2。如果源同步接口包含 SDR 输出,则此示例非常有用。

11。输出最小延迟约束

set_output_delay -min <output minimum delay value> -clock [get_clocks output_clock] [get_ports data_out*]

例 12 显示了一个 DDR 输出,它具有应用于下降时钟沿的重复约束。

使用 -clock_fall 选项会导致输出延迟约束应用于下降时钟边沿。使用 -add_delay 选项允许多个输出延迟应用到 data_out 端口。

12。DDR 输出的最小延迟约束

set_output_delay -min <output minimum delay value> -clock [get_clocks output_clock] [get_ports data_out*]
set_output_delay -min <output minimum delay value> -clock [get_clocks output_clock] -clock_fall [get_ports data_out*] -add_delay

以系统为中心的输出时序例外

以下部分描述了不同的对齐和捕获边沿组合,并显示了适用于每种组合的任何额外的时序例外或调整约束。对于正确操作所必需的其他时序例外或约束修改,请参考以下用例之一:

  • “相同边沿捕获边沿对齐输出”
  • “相反边沿捕获边沿对齐输出”
  • “相同边沿捕获中心对齐输出”
  • “相反边沿捕获中心对齐输出”

相同边沿捕获边沿对齐输出

图 18 显示了必须对 SDR 相同边沿捕获、边沿对齐输出进行分析的建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

图 19 显示了 DDR 相同边沿捕获必须分析的建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

要更改默认时序分析方法以确保分析相同边沿捕获的正确建立和保持关系,请使用以下例外之一:

  • 目标建立多周期例外(Destination Setup Multicycle Exception)
  • 为输出最大延迟增加一个时钟周期(Add One Clock Period to Output Maximum Delay)

两种时序例外类型都会产生相同的时序分析结果,但是多周期例外更能表示设计意图。

在使用这些时序例外时,还必须添加 false path 例外,如例 13 所示,以确保不分析相反边沿传输。

13。false path 例外

set_false_path -setup -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
目标建立多周期例外

例 14 显示了 SDC 命令,通过添加两个值为零的目标建立多周期例外来修改默认的时序分析方法。

14。目标建立多周期例外

set_multicycle_path -setup -end 0 -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_multicycle_path -setup -end 0 -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]

必须指定上升到上升边沿和下降到下降边沿,以确保保持关系。

当使用值为零的目标建立多周期例外时,用于建立和保持分析的目标时钟边沿向后移动一个时钟边沿。这些时序例外将用于建立分析的锁存器边沿调整为提前一个时钟边沿,即在发射边沿后零周期;并将用于保持分析的锁存器边沿调整为提前一个时钟边沿,即在发射边沿前一个周期。这些用于建立和保持分析的锁存器边沿调整确保时钟之间的数据传输以零周期进行,如图 20 所示。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

为输出最大延迟增加一个时钟周期

例 15 显示了修改输出最大延迟值以增加一个时钟周期的 SDC 命令。

15。添加一个时钟周期

set_output_delay -max <output maximum delay value + clock period> -clock [get_clocks output_clock] [get_ports data_out]
set_output_delay -max <output maximum delay value + clock period> -clock [get_clocks output_clock] -clock_fall [get_ports data_out]

向输出最大延迟值添加一个时钟周期不会调整锁存器边沿,但会将所需的数据时间提前一个周期,如图 21 所示。
在这里插入图片描述

16。false path 例外

set_false_path -setup -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]

如果您使用一个小的正相移来更好地对齐时钟和数据输出,不要使用零的多周期例外,或前面描述的额外时钟周期。较小的正相移导致较小的建立关系,并且默认情况下分析的锁存器边沿与发射边沿是相同的时钟边沿(具有较小的移位),如图 22 所示。红色箭头表示建立关系。
在这里插入图片描述

如果您使用一个小的负相移来更好地对齐时钟和数据输出,您必须使用零的多周期例外,或者前面描述的额外时钟周期。对于一个小的负相移,正确的建立关系是相对发射边沿左移的时钟边沿,如图 23 中的实箭头所示。虚线箭头表示默认建立关系,即在发射边沿之后的下一个时钟边沿。红色箭头表示建立关系。
在这里插入图片描述

相反边沿捕获边沿对齐输出

图 24 显示了建立和保持关系,必须对这些关系进行分析,以获得相反边沿捕获和边沿对齐输出。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

相反边沿传输不使用多周期例外,输出最大延迟值不增加时钟周期。正确时序分析所需的唯一例外是false path 例外,如例 17 所示。

17。false path 例外

set_false_path -setup -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]

如果您使用一个小的正相移或负相移来更好地对齐时钟和数据输出,则例 17 中显示的 false path 例外仍然足够。

相同边沿捕获中心对齐输出

图 25 显示了必须在相同边沿捕获、中心对齐输出中分析的建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

不要使用任何多周期例外,不要在输出最大延迟值上增加时钟周期。正确时序分析所需的唯一例外是相反边沿传输的 false path 例外,如例 18 所示。

18。false path 例外

set_false_path -setup -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]

如果您使用一个小的正相移或负相移来更好地对齐时钟和数据输出,那么示例 18 中的 false path 例外仍然足够。图 26 显示了小的正相移和负相移,必须对中心对齐的源同步输出进行分析。锁存边沿的相同边沿传输永远不会改变。红色箭头表示建立关系。
在这里插入图片描述

相反边沿捕获中心对齐输出

图 27 显示了必须分析的建立和保持关系,以实现相反边沿捕获、中心对齐输出。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述
正确的时序分析所需的唯一例外是 false path 例外,如例 19 所示,以防止对相同边沿传输进行时序分析。

19。false path 例外

set_false_path -setup -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]

以 FPGA 为中心的输出延迟约束

以 FPGA 为中心的约束方法使用来自时钟和数据关系的约束,如公式 3 所示。数据必须在时钟到达时间两侧的一个偏移时间窗口内到达。
在这里插入图片描述

图 28 显示了时钟和数据到达时间的关系。
在这里插入图片描述

以 FPGA 为中心的约束是基于数据和输出时钟之间的时钟偏移,以及数据的偏移需求。时钟偏移是数据时钟边沿和输出时钟边沿之间的时间差。在边沿对齐的接口中,时钟偏移为零。在中心对齐的接口中,时钟偏移量是 UI 的一半。在 SDR 接口中,UI 等于时钟周期。在 DDR 接口中,UI 等于时钟周期的一半。因此,在 SDR 接口中,时钟偏移为时钟周期的一半,在 DDR 接口中,时钟偏移为时钟周期的四分之一。

您可以使用以下两种方法来计算以 FPGA 为中心的输出约束:

  • 最小数据有效约束
  • 最大数据无效约束

最小数据有效约束

您可以使用以下方法根据时钟偏移和偏移值推导出的最小数据有效约束:

  • 基于数据和输出时钟之间的建立和保持关系的方程,在“从建立和保持关系推导出的约束”中描述。
  • 基于时钟偏移和偏移值从早期和晚期边沿的方程,在“从早期和晚期边沿推导出的约束”中描述。
  • 如果您使用 tco 和最小 tco 值来为您的接口推导输出延迟约束,请使用“从早期和晚期边沿推导出的约束”中描述的方法。

这三种方法都是正确的,并且产生了等效的约束。

从建立和保持关系推导出的约束

要计算具有发射和锁存边沿的约束值,请使用一组指定建立关系的方程和一组指定保持关系的方程。

建立关系:使用建立检查来指定时钟和数据关系的左侧,如公式 3 所示。建立检查验证最新数据到达时间(数据到达 + 偏移)早于数据所需时间(时钟到达)。到达时间分量为公式 4,所需时间分量为公式 5。
在这里插入图片描述

公式 6 给出了正余量(positive slack)必须满足的不等式,然后分别用公式 4 和公式 5 代入到达时间和所需时间。
在这里插入图片描述

在源同步电路中,数据到达时间必须与时钟到达时间相匹配。公式 7 显示了如何创建一个等式,该等式消去了数据到达时间和时钟到达时间,并显示了数据输出的最大延迟值。
在这里插入图片描述

例 20 显示了 SDR 输出的 SDC 命令,其输出最大延迟值来自公式 7。

20。SDR 接口输出最大延迟约束

set_output_delay -max <output maximum delay value> -clock [get_clocks output_clock] [get_ports data_out]

DDR 输出具有应用于下降时钟沿的重复约束,如示例 21 所示。

21。DDR 接口的输出最大延迟约束

set_output_delay -max <output maximum delay value> -clock [get_clocks output_clock] [get_ports data_out]
set_output_delay -max <output maximum delay value> -clock [get_clocks output_clock] -clock_fall [get_ports data_out] -add_delay

保持关系:使用保持检查来指定时钟和数据关系的右侧,如公式 3 所示。保持检查验证最早的数据到达时间(数据到达 - 偏移)晚于数据所需的时间(时钟到达)。到达时间的分量为公式 8,所需时间的分量为公式 9。
在这里插入图片描述

公式 10 给出了正余量(positive slack)必须满足的不等式,然后分别用公式 8 和公式 9 代入到达时间和所需时间。
在这里插入图片描述

在源同步电路中,数据到达时间必须与时钟到达时间相匹配。公式 11 显示了如何创建一个等式,该等式消去了数据到达时间和时钟到达时间,并显示了数据输出的最大延迟值。
在这里插入图片描述

例 22 显示了用于 SDR 输出的 SDC 命令,其输出最大延迟值来自公式 11。

22。SDR 接口的输出最小延迟约束

set_output_delay -min <output minimum delay value> -clock [get_clocks output_clock] [get_ports data_out*]

DDR 输出具有应用于下降时钟沿的重复约束,如示例 23 所示。

23。DDR 接口的输出最小延迟约束

set_output_delay -min <output minimum delay value> -clock [get_clocks output_clock] [get_ports data_out*]
set_output_delay -min <output minimum delay value> -clock [get_clocks output_clock] -clock_fall [get_ports data_out*] -add_delay
来自早期和晚期边界的约束

您可以使用时钟偏移量 (offset)和倾斜值(skew)来确定要更改的数据的早期和晚期边界,从而定义最小数据有效窗口。时钟偏移是发射(launch)和锁存(latch)边沿之间的差值。在中间对齐的接口中,发射和锁存边沿是 UI 的一半。在边沿对齐输出中,发射和锁存同时发生,因此时钟偏移为零。

早期余量(early margin)对应于最小 tco 值,晚期余量(late margin)对应于最大 tco 值。图 29 显示了中心对齐的 DDR 接口时序图上显示的早期和晚期边界。
在这里插入图片描述

公式 12 显示了如何计算输出最大延迟值。晚期余量相当于 tco 值。
在这里插入图片描述

公式 13 显示了如何计算输出最小延迟值。早期余量相当于最小 tco 值。
在这里插入图片描述

图 30 显示了公式 12 和公式 13 中的时钟值,并显示了沿边对齐的 SDR 输出时序图。在边沿对齐的接口中,时钟偏移值为零。
在这里插入图片描述

图 31 显示了公式 12 和公式 13 中的时钟值,并显示了中心对齐的 SDR 输出时序图。在中心对齐的接口中,时钟偏移量是 UI 的一半。
在这里插入图片描述

图 32 显示了公式 12 和公式 13 的时钟值,并显示了边沿对齐的 DDR 输出时序图。在边沿对齐接口中,时钟偏移值为零。
在这里插入图片描述

图 33 显示了公式 12 和公式 13 的时钟值,并显示了中心对齐的 DDR 输出时序图。在中心对齐接口中,时钟偏移量为 UI 的一半,即时钟周期的四分之一。
在这里插入图片描述

最大数据无效约束

图 34 显示了由正倾斜值(positive skew)和负倾斜值(negative skew)产生的数据无效窗口。
在这里插入图片描述

Altera 建议约束最大数据无效时间,而不是最小数据有效时间。要约束最大数据无效时间,必须设置输出最小延迟和输出最大延迟约束。输出最小延迟约束值为正倾斜要求,输出最大延迟约束值为负倾斜要求。根据接口的操作,您可能必须调整约束值或添加例外以确保正确的时序分析,但是不需要计算来确定初始输出延迟值。

如图 34 所示的输出最小延迟对应于最小 tco 要求,即数据在时钟边沿之后可以改变的最早时间。当您限制最大数据无效时间时,数据在时钟边沿之后可以更改的最早时间是正倾斜时间。图 34 所示的输出最大延迟对应于 tco 需求,tco 是数据在时钟边沿之后更改的最新时间。当您约束最大数据无效时间时,数据更改发生的最新时间是倾斜要求,即在时钟边沿之前。若要将该时间表示为发生在时钟边沿之后,必须使用负松弛值(negative slack value)。

如果您使用这种方法来约束最大数据无效时间,并且您使用 PrimeTime 软件,则必须修改输出最大和最小延迟值,以绕过 PrimeTime 软件的限制。使用小于相应的输出最小延迟值的输出最大延迟值会导致错误的时序分析。下面几节描述了每种边沿捕获和对齐组合所需的约束修改。有关适当的解决方法,请参阅与接口操作相对应的部分。

以 FPGA 为中心的输出时序例外

根据接口的操作,您可能需要添加如下部分所述的时序例外,以确保正确的时序分析。

发射和锁存(launch and latch)的值是建立和保持检查中各自时钟边沿发生的时间。但是,有几种方法可以将输出延迟约束与例外结合起来,以约束源同步输出接口的不同配置。

以下部分描述了不同的对齐和捕获边沿组合,并显示了适用于每种组合的任何额外的时序例外或约束修改。对于正确操作所必需的其他时序例外或约束修改,请参阅与您的接口操作相对应的以下列表中的部分:

  • “相同边沿捕获边沿对齐输出”
  • “相反边沿捕获边沿对齐输出”
  • “相同边沿捕获中心对齐输出”
  • “相反边沿捕获中心对齐输出”

相同边沿捕获边沿对齐输出

您可以使用两种类型的例外来更改默认分析,以便分析相同边沿捕获的正确建立和保持关系。您可以使用以下方法来约束边沿对齐接口以进行相同边沿捕获:

  • 目标多周期例外方法(Destination Multicycle Exception Method)
  • 增加一个时钟周期(Add One Clock Period)

两种方法的时序分析结果相同。使用多周期例外是设计意图的最佳表现。

当您约束 DDR 输出时,还必须使用例 24 中的 false path 例外,这样就不会分析相反边沿传输。

24。

set_false_path -setup -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
目标多周期例外方法

使用两个目标建立多周期例外,其值为 0,两个目标保持多周期例外,其值为 -1,如例 25 所示。

25。

set_multicycle_path -setup -end 0 -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_multicycle_path -setup -end 0 -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_multicycle_path -hold -end -1 -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_multicycle_path -hold -end -1 -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]

使用目标建立多周期例外将建立锁存边沿(setup latch edge)调整为更早的一个边沿(发射边沿(launch edge)之后的零周期),因此时钟之间的数据传输发生在零周期中,如图 35 所示。红色箭头表示建立关系,蓝色箭头表示保持关系。使用目标建立多周期例外 0 也会导致默认保持分析边沿向前移动一个边沿(在发射边沿之前一个周期)。
在这里插入图片描述

然而,保持分析也必须发生在与建立分析相同的发射/锁存边沿(launch/latch edges)上。调整用于保持分析的边沿需要一个值为 -1 的目标保持多周期例外。值 -1 将用于保持分析的锁存边沿(latch edge)向后移动一个周期,如图 36 所示。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

使用目标多周期例外方法与 PrimeTime 软件不兼容,因为输出的最大延迟值小于输出的最小延迟值。

增加一个时钟周期

图 37 显示了对相同边沿捕获边沿对齐输出进行分析的默认建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

使用以 FPGA 为中心的方法来约束接口需要您进行调整,使锁存边沿(latch edge)与发射边沿(launch edge)相同,以进行建立和保持分析。

图 38 显示了为了进行 SDR 相同边沿捕获而必须分析的建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

图 39 显示了 DDR 相同边沿捕获必须分析的建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

在相同边沿捕获配置中,默认建立关系是在上升沿和它后面的上升沿之间,或者在下降沿和它后面的下降沿之间。建立关系必须在同时发生的边沿之间。要消除延长一个周期的建立时间的影响,必须在输出最大延迟上增加一个周期,如公式 14 所示。
在这里插入图片描述

例 26 显示了修改后的约束。

26。

set_output_delay -max <output maximum delay value + (latch – launch)> -clock [get_clocks output_clock] [get_ports data_out]
set_output_delay -max <output maximum delay value + (latch – launch)> -clock [get_clocks output_clock] -clock_fall [get_ports data_out]

向输出最大延迟值添加一个时钟周期实际上并不能调整锁存边沿,但它将所需的数据时间提前了一个周期,如图 40 所示。
在这里插入图片描述

在输出最大延迟值中增加一个时钟周期与 PrimeTime 软件兼容。

相同边沿之间的默认保持关系是正确的,发射边沿与锁存边沿同时发生。因此,锁存项和发射项从式 15 中消去,得到输出最小延迟值,该值与原始值相比没有变化。
在这里插入图片描述

相反边沿捕获边沿对齐输出

图 41 显示了对相反边沿捕获边沿对齐输出分析的默认建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

使用以 FPGA 为中心的方法来约束接口需要您进行调整,以使锁存边沿时间与建立和保持分析的发射边沿时间相同。图 42 显示了必须对相反边沿捕获进行分析的建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

在相反边沿捕获配置中,默认建立关系是在发射边沿和随后的下一个相反边沿之间。发射和锁存边沿间隔半个周期。建立关系必须在同时发生的边沿之间。要消除延长半个周期建立时间的影响,必须在输出最大延迟上增加半个周期,如公式 16 所示。
在这里插入图片描述

保持关系是在发射边沿和它之前的锁存边沿之间,因此发射边沿和锁存边沿相隔半个周期。保持关系必须在同时发生的边沿之间。要消除延长半个周期保持时间的影响,必须从输出最小延迟中减去半个周期,如公式 17 所示。减去半个周期,因为发射时间晚于锁存时间,所以(锁存 - 发射)是负的。
在这里插入图片描述

对于相反边沿传输,不要使用任何多周期或延迟例外。正确时序分析所需的唯一例外是 false path 例外,如例 27 所示。

27。

set_false_path -setup -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]

如果您使用一个小的正相移来更好地对齐时钟和数据输出,则例 27 中的 false path 例外仍然足够。一个小的正相移导致一个小的建立关系,如图 43 所示。红色箭头表示建立关系。false path 例外用虚线箭头表示,false path 例外包括上升-上升(rise-rise)和下降-下降(fall-fall)建立和保持路径。
在这里插入图片描述

如果您使用一个小的负相移来更好地对齐时钟和数据输出,则例 27 中的 false path 例外仍然足够。默认锁存边沿是发射边沿之后的下一个时钟边沿,它仍然是相反的边沿,如图 44 所示。红色箭头表示建立关系。
在这里插入图片描述

相同边沿捕获中心对齐输出

图 45 显示了在相同边沿捕获中心对齐输出中分析的默认建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

您可以使用两种类型的例外来更改默认分析,以便分析相同边沿捕获的正确建立和保持关系。这两种方法都具有使锁存边沿与锁存边沿对齐以进行建立和保持分析的效果。您可以使用以下方法来约束中心对齐的接口以进行相同边沿捕获:

  • 最大和最小延迟例外(Maximum and Minimum Delay Exceptions)
  • 添加部分时钟周期(Add Partial Clock Period)

两种方法的时序分析结果相同,但最大和最小延迟例外方法与 PrimeTime 软件不兼容。

最大和最小延迟例外

使用数据时钟和输出时钟之间的最大和最小延迟例外,可以直接控制两者之间的时序关系。

图 46 用红色曲线箭头显示了时序关系规范的点。
在这里插入图片描述

数据时钟和输出时钟之间的最大和最小延迟例外的标称值为零。例 28 显示了与图 46 对应的最大和最小延迟例外示例。在某些情况下,使用非零值是合适的,如下所述。

28。

set_max_delay -from [get_clocks data_clock] -to [get_clocks output_clock] 0
set_min_delay -from [get_clocks data_clock] -to [get_clocks output_clock] 0

使用值为零的最大和最小延迟例外只影响时序分析,而不影响实际电路运行。输出时钟继续由驱动它的锁相环中实现的量移位。设置最大和最小延迟值为 0,使时序分析仪在执行时序分析时覆盖任何输出时钟相移。有效地,最大和最小的延迟值为零,使接口被分析,好像它是一个边沿对齐的接口。当接口边沿对齐时,您可以使用正负倾斜值(positive and negative skew values)作为输出最小延迟值和输出最大延迟值,如 “最大数据无效约束” 中所述。

如果您还使用 PrimeTime 软件为您的设计执行时序分析,则不要使用此方法。如果输出最大延迟的值比输出最小延迟的值更负,则 PrimeTime 软件使用更负的输出最大和最小延迟的值。TimeQuest 时序分析器同时使用输出最大和输出最小延迟值,而不管它们的正或负关系。

例 29 显示了使用正负倾斜值(positive and negative skew values)的输出延迟约束。

29。

set_output_delay -max <negative skew> -clock [get_clocks output_clock] [get_ports data_out]
set_output_delay -max <negative skew> -clock [get_clocks output_clock] -clock_fall [get_ports data_out] -add_delay
set_output_delay -min <positive skew> -clock [get_clocks output_clock] [get_ports data_out*]
set_output_delay -min <positive skew> -clock [get_clocks output_clock] -clock_fall [get_ports data_out*] -add_delay

使用最大和最小延迟例外来指定与理想时钟相移的任何偏差。如果您将锁相环略微移动到数据有效窗口的中心,请更新最大和最小延迟例外,以反映理想相移与实际相移之间的差异。

例如,具有 5 ns UI 的中心对齐 DDR 输出具有 90°(2.5 ns)的理想锁相环相移。如果将时钟输出移位 10° 以使数据有效窗口处于中心位置,则将最大和最小延迟例外更改为 138 ps 以反映 10° 相移。10° 相移对应于 138 ps,因为相移量为 5 ns × 10°/ 360°。

用于最大和最小延迟例外的值必须包括时钟之间的偏差(skew)。在那些偏差可以忽略不计的情况下,例如当您对数据和时钟输出都使用 ALTDDIO_OUT 函数时,您可以对偏差使用零。但是,当锁相环输出直接在芯片外驱动时,不能使用零来表示偏差。

如果除了源同步输出寄存器之外,源时钟和目标时钟之间还有数据路径,如图 47 所示,请在例 28 所示的延迟例外中更改 -from 选项的值。使用带有通配符的寄存器集合,该通配符将集合限制为由源时钟驱动的源同步输出寄存器。例如,如果你的源同步输出寄存器在一个名为 ss_data_if 的模块中实例化,并且你使用了 ALTDDIO_OUT 函数,使用以下集合:

[get_registers *ss_data_if*altddio_out_component*]

在这里插入图片描述

添加部分时钟周期

在相同边沿捕获配置中,建立和保持关系必须在相同的发射和锁存边沿之间,在中心对齐配置中,锁存时钟被移动半个 UI。在 SDR 接口中,中心对齐需要时钟偏移半个周期,在 DDR 接口中,中心对齐需要时钟偏移四分之一周期。

图 48 显示了中心对齐输出的发射和锁存波形,并标识了用于建立和保持分析的发射和锁存边沿。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

公式 18 显示了如何计算输出最大延迟约束的值。
在这里插入图片描述

这个方程是由公式 4、公式 5、公式 6 和公式 7 推导出来的。图 48 显示了用于建立分析的锁存边沿发生在发射边沿之后的四分之一周期。因此,输出最大延迟的值为(1/4)周期 - 倾斜(skew)。

公式 19 显示了如何计算输出最小延迟约束的值。
在这里插入图片描述
公式 19 由公式 8、公式 9、公式 10 和公式 11推导而来。图 48 显示保持分析的锁存边沿发生在发射边沿之前的四分之三周期。因此,输出最小延迟的值为(-3/4)周期 + 倾斜(skew)。

例 30 显示了正确时序分析所必需的 false path 例外。

30。

set_false_path -setup -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]

即使您使用小的正相移或负相移来更好地对齐时钟和数据输出,也不要使用任何其他例外或约束。图 49 显示了相同边沿捕获、中心对齐的源同步输出的小正相移和负相移。锁存边沿总是与发射边沿相同的边沿,但有一个小移位。红色箭头表示建立关系。
在这里插入图片描述

相反边沿捕获中心对齐输出

图 50 显示了必须分析的建立和保持关系,以便对相反边沿捕获中心对齐输出进行时序分析。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

在相反边沿捕获配置中,建立和保持关系在相反的发射和锁存边沿之间,并且在中心对齐的接口中,锁存时钟移位(the latch clock is shifted)。

图 51 显示了相反边沿捕获中心对齐输出的发射和锁存波形,并标识了用于建立和保持分析的发射和锁存边沿。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

公式 20 显示了如何计算输出最大延迟约束的值。公式由 “从建立和保持关系推导出的约束” 中的公式 4、公式 5、公式 6 和公式 7 推导而来。
在这里插入图片描述

图 51 显示了用于建立分析的锁存边沿发生在发射边沿之后的四分之三周期。因此,输出最大延迟的值为(3/4)周期 - 倾斜(skew)。

公式 21 显示了如何计算输出最小延迟约束的值。公式由 “从建立和保持关系推导出的约束” 中的公式 8、公式 9、公式 10和公式 11 推导而来。
在这里插入图片描述

图 51 显示保持分析的锁存边沿发生在发射边沿之前的四分之一周期。因此,输出最小延迟的值为(-1/4)周期 + 倾斜(skew)。

您还必须在相同边沿传输中添加 false path 例外,如例 31 所示。分割的路径用于相同边沿捕获。设置这些 false path 可确保对相反边沿传输执行时序分析。

31。

set_false_path -setup -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]

时序分析和时序收敛

图 52 显示了一个简单的源同步 DDR 输出设计示例,用于说明时序分析概念。
在这里插入图片描述

要报告输出的时序,请使用带有 -from_clock 和 -to_clock 选项的 report_timing 命令。对于 -from_clock 选项,使用驱动数据输出寄存器的时钟名称,对于 -to_clock 选项,使用输出时钟端口上生成的时钟名称。例如,使用以下两个命令来报告前面描述的电路的建立和保持时序:

report_timing -from_clock data_clock -to_clock output_clock -setup
report_timing -from_clock data_clock -to_clock output_clock -hold

必须对接口的各个时序路径进行时序分析,保证接口满足时序要求。

时序收敛

每个 report_timing 命令报告的松弛值(slack values)表示数据满足其时序要求的程度。负值表示不满足约束。

为了实现时序收敛,建立和保持松弛值必须为正,并且建立和保持松弛值必须平衡或相等。接口的时序余量(timing margin)等于松弛值中的小者。最佳余量出现在建立松弛等于保持松弛时。在 FPGA 的整个工作范围内平衡建立和保持松弛值是不可能的。您必须调整接口时序,直到松弛值相似。可接受的值取决于接口的操作。高速接口数据有效窗口小;因此,松弛值非常接近是很重要的。低速接口可以容忍较大的松弛差值,因为数据有效窗口较大。

如果建立和保持松弛值不平衡,您必须调整部分接口。如果您为数据输出和时钟输出使用单独的时钟,则可以直接相移其中一个时钟(通常是输出时钟)来平衡建立和保持松弛值。

使用公式 22 所示的步骤来计算所需的相移。
在这里插入图片描述

当您移动时钟时,如果锁存时钟边沿移动超过发射时钟边沿,您可能还必须修改输出延迟约束或时序例外。例如,如果在相同边沿捕获、边对齐电路中向输出时钟添加一个正相移,则可能必须修改中心对齐电路的时序例外。

如果数据输出和时钟输出使用相同时钟,则必须采取其他步骤。如果您想少量调整松弛值,您可以调整延迟链设置。延迟链在从寄存器到引脚的输出路径中提供小而可变的延迟。

有关延迟链的信息,请参阅您正在使用的器件的相应手册。

如果您希望比使用延迟链更多地调整松弛值,则必须更改接口的位置,例如使用数据输出寄存器。

示例

下面的示例基于图 52 中的输出接口。设备源时钟的周期为 10 ns,并与数据边沿对齐。数据的倾斜(skew)要求为 +/-100 ps。输出受到约束,如例 32 所示。

32。相同边沿捕获边沿对齐输出示例的 SDC 约束

# Clock constraints
create_clock -name input_clock -period 10.000 [get_ports clk_in]
create_generated_clock -name data_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[0]]
create_generated_clock -name pll_clock -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[1]]
create_generated_clock -name output_clock -source [get_pins PLL|clk[1]] [get_ports clk_out]

# Output delay constraints of +/- skew
set_output_delay -clock output_clock [get_ports data_out] -max -0.1
set_output_delay -clock output_clock [get_ports data_out] -min 0.1 -add_delay
set_output_delay -clock output_clock -clock_fall [get_ports data_out] -max -0.1-add_delay
set_output_delay -clock output_clock -clock_fall [get_ports data_out] -min 0.1 -add_delay

# Destination multicycle exceptions
set_multicycle_path -setup -end 0 -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_multicycle_path -setup -end 0 -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_multicycle_path -hold -end -1 -rise_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_multicycle_path -hold -end -1 -fall_from [get_clocks data_clock] -fall_to [get_clocks output_clock]

# False path exceptions for opposite-edge transfers
set_false_path -setup -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -setup -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]
set_false_path -hold -rise_from [get_clocks data_clock] -fall_to [get_clocks output_clock]
set_false_path -hold -fall_from [get_clocks data_clock] -rise_to [get_clocks output_clock]

使用例 33 中的命令来报告时序。报告时序使用慢角和快角延迟模型(both slow and fast corner delay models)。

33。

report_timing -from_clock data_clock -to_clock output_clock -setup
report_timing -from_clock data_clock -to_clock output_clock -hold

表 1 显示了时序分析结果。
在这里插入图片描述

最坏情况下的建立松弛是 -2.107 ns,最坏情况下的保持松弛是 1.041 ns。时移为(1.041 ns - 2.107 ns)÷ 2,即 1.574 ns。1.574 ns 的时移等于 360° × 1.574 ns ÷ 10 ns 的相移,即 56°。

将产生输出时钟的锁相环输出的相位更改为 56°,并更新 SDC 产生的时钟,如例 34 所示。

34。

create_generated_clock -name pll_clock -phase 56 -source [get_pins PLL|inclk[0]] [get_pins PLL|clk[1]]

建立和保持松弛值现在是平衡的,接口以最大的余量运行。

源同步输入

源同步输入需要以下类型的约束和例外:

  • 时钟约束:创建时钟约束,如 “输入时钟约束” 所述。
  • 输入延迟约束:使用以下方法之一创建输入延迟约束:
    “以系统为中心的输入延迟约束”。
    “以 FPGA 为中心的输入延迟约束”。
  • 时序例外:创建时序例外,如 “输入时序例外” 所述。

输入时钟

源同步接口的输入时钟可以直接对输入捕获寄存器进行时钟处理,也可以驱动一个锁相环对输入捕获寄存器进行时钟处理。使用锁相环对输入捕获寄存器进行时钟处理的接口通常比直接使用输入时钟对捕获寄存器进行时钟处理的接口有更大的时间余量。对于高速 DDR 接口尤其如此。在 SDR 接口中,时间余量通常足够大,您可以直接将输入时钟连接到输入捕获寄存器。直接时钟具有消除锁相环作为时钟不确定性来源的优点(Direct clocking has the advantage of eliminating the PLL as a source of clock uncertainty)。然而,锁相环具有在功率、电压和温度(PVT)上提供时钟补偿的优点。在高接口速度下,使用锁相环的好处超过了相关的时钟不确定性。

如果使用锁相环作为输入时钟,则应将其配置为源同步补偿模式。在源同步补偿模式下,输入捕获寄存器(在 I/O 元件或 IOE 中)的时钟和数据关系与 FPGA 设备输入的关系相同。锁相环保持相同的相位关系。这种模式简化了时序收敛的约束和调整过程,因为您不必计算任何锁相环相移来满足输入时序要求。

您可以将锁相环配置为其他操作模式,例如正常模式,但您可能必须调整相移以满足时序要求。不同的锁相环模式调整时钟以补偿 FPGA 中的不同延迟。如果输入捕获寄存器的时钟和数据关系由于锁相环补偿不同的延迟而不满足时序要求,则需要相移。

使用直接时钟连接还是通过锁相环进行时钟连接取决于接口类型和时序要求。

在输入时钟上使用锁相环,用于以下输入类型:

  • 边沿对齐的 SDR 或 DDR 输入(创建相移以锁存数据在数据有效窗口的中间)
  • 高速输入
  • 精确调整时钟和数据关系(微调相位调整)

Altera 不建议在输入时钟上使用锁相环,用于以下输入类型:

  • 中心对齐的 SDR 或 DDR 输入
  • 低速输入

输入时钟约束

源同步接口是在不同设备的寄存器之间进行寄存器到寄存器的传输,输入时钟由源设备产生。您必须在接口的输入时钟端口上创建一个时钟,该时钟描述源时钟的特征,例如周期和相移。例如,如果您的源设备发送的 DDR 数据是中心对齐的(时钟相位为 90°),则在您的接口的输入时钟端口上创建一个时钟,并使用 -waveform 选项进行 90° 相移。

虚拟时钟(Virtual Clocks)

您应该创建一个虚拟时钟来表示对源设备中的数据输出寄存器进行时钟处理的时钟。然后,使用虚拟时钟作为输入延迟约束的参考时钟。创建与源设备上实际时钟周期、相移相同的虚拟时钟。如果时钟有任何相移,用 -waveform 选项指定相移对应的上升沿和下降沿。

图 53 显示了源同步接口的输入时钟和虚拟时钟。
在这里插入图片描述

没有必要使用虚拟时钟来限制输入延迟。您可以创建相对于输入时钟而不是虚拟时钟的输入延迟约束,但是使用虚拟时钟使接口约束更容易和更准确。虚拟时钟可以很容易地约束输入与基于偏置的 FPGA 为中心的方法(A virtual clock makes it easy to constrain inputs with the skew-based FPGA-centric approach)。您可以对输入最大和最小延迟约束使用正负倾斜需求值(positive and negative skew requirement values),而无需进行其他计算。即使源或目标时钟被移动,输入最大和最小延迟值也不会改变。更多细节请参阅 “最大数据倾斜”

您可以将时钟不确定性应用于虚拟时钟,它独立于您应用于 FPGA 反馈时钟的不确定性。有关详细信息,请参阅 “时钟不确定性”

生成时钟(Generated Clocks)

对于任何包含锁相环的电路,必须在锁相环输出上创建生成时钟。在 .sdc 中使用 derive_pll_clocks 命令自动创建所有生成的时钟,并使生成的时钟特征(如周期、相移、乘法和除法因子)与 PLL 设置保持同步。它还根据 PLL 输出和层次结构名称命名生成的时钟。

与使用 derive_pll_clocks 命令不同,您可以使用单独的 create_generated_clock 命令分别指定每个 PLL 输出时钟。单独创建生成的时钟可以灵活地命名时钟,但是必须记住在更改 PLL 设置时手动更新 .sdc 中的时钟定义。

时钟不确定性(Clock Uncertainty)

您应该使用 set_clock_uncertainty 约束来指定输入电路中每个时钟的时钟不确定性。使用时钟不确定性约束来考虑抖动、锁相环相移误差和占空比失真。

当您使用虚拟时钟作为输入延迟约束的参考时钟时,您可以为独立于核心时钟的 I/O 指定时钟不确定性。如果输入时钟是输入延迟约束的参考时钟,那么如果 I/O 时钟用于 I/O 和核心传输,则 I/O 时钟的不确定性可能会影响核心时钟的不确定性。

图 54 显示了 clk_in 提供 I/O 和核心寄存器的情况。对 clk_in 应用时钟不确定性会影响 I/O 和核心时钟。
在这里插入图片描述

输入时钟电路和约束示例

当时钟和数据到达 FPGA 边沿对齐时,通常使用锁相环来移位用于锁存数据的时钟,如图 55 所示。
在这里插入图片描述

在这种情况下,不要在输入时钟上指定相位调整,因为时钟和数据是边沿对齐的。对锁相环输出的产生的时钟指定锁相环相位调整。例 35 显示了图 55 的 SDC 约束。

35。

create_clock -name virtual_clock -period 10.000
create_clock -name input_clock -period 10.000 [get_ports clock_in]
create_generated_clock -name plus_90_degrees -source [get_pins PLL|inclk[0]] -phase 90

当时钟和数据信号到达 FPGA 中心对齐时,使用 -waveform 选项指定输入时钟上的时钟相位调整,如例 36 所示。如果时钟通过锁相环驱动输入寄存器,使用 -phase 选项为生成的锁相环时钟指定由锁相环施加的任何相移。

36。

create_clock -name virtual_clock -period 10.000
create_clock -name input_clock -period 10.000 [get_ports clock_in] -waveform { 2.5 7.5 }
create_generated_clock -name plus_0_degrees -source [get_pins PLL|inclk[0]]

图 56、图 57 和图 5 8显示了各种输入时钟配置以及相应的 SDC 约束。
在这里插入图片描述

37。

create_clock -name virtual_source -period 10.000
create_clock -name input_clock -period 10.000 -waveform { 2.5 7.5 } [get_ports clk_in]

在这里插入图片描述

38。

create_clock -name virtual_source -period 10.000
create_clock -name input_clock -period 10.000 [get_ports clk_in]
create_generated_clock -name shifted_clock -source [get_pins PLL|inclk[0]] -phase 90 [get_pins PLL|clk[0]]

在这里插入图片描述

39。

create_clock -name virtual_source -period 10.000
create_clock -name input_clock -period 10.000 -waveform { 2.5 7.5 } [get_ports clk_in]
create_generated_clock -name internal_clock -source get_pins PLL|inclk[0]] [get_pins PLL|clk[0]]

以系统为中心的输入延迟约束

使用以系统为中心的约束方法,输入延迟值包括时钟和数据线上的板间延迟(board delays),以及时钟到输出的时间(clock-to-out times),如图 59 所示。
在这里插入图片描述

如果外部设备 tco 规范与输出时钟相关,如图 60 所示,则直接使用指定的 tco 和 tco min 值来计算输入最大和最小延迟值。
在这里插入图片描述

如果外部设备 tco 规范与输入时钟相关,如图 61 所示,则使用(tcoDATA – tcominCLOCK)作为 tco 值,使用(tcominDATA - tcoCLOCK)作为 tco min 值,以计算输入最大和最小延迟值。
在这里插入图片描述

tco 和 tco min 方法

当外部设备规格包含 tco 和 tco min 时,使用公式 23 计算输入最大延迟值。输入最大延迟值指定了输入延迟的上限,因为它使用最长的数据路径和最短的时钟路径。
在这里插入图片描述

将输入最大延迟 SDC 约束写入例 40,并使用公式 23 中的输入最大延迟值。此示例适用于 SDR 输入。

40。

set_input_delay -max <input maximum delay value> -clock [get_clocks virtual_clock] [get_ports data_in]

DDR 输入具有应用于下降时钟沿的重复约束,如例 41 所示。

41。

set_input_delay -max <input maximum delay value> -clock [get_clocks virtual_clock] [get_ports data_in]
set_input_delay -max <input maximum delay value> -clock [get_clocks virtual_clock] -clock_fall [get_ports data_in] -add_delay

计算输入最小延迟值的公式为公式 24。输入最小延迟值指定输入延迟的下限,因为它使用最短的数据路径和最长的时钟路径。
在这里插入图片描述

写入例 42 中所示的输入最小延迟 SDC 约束,并使用公式 24 中的输入最小延迟值。此示例适用于 SDR 输入。

42。

set_input_delay -min <input minimum delay value> -clock [get_clocks virtual_clock] [get_ports data_in]

DDR 输入具有应用于下降时钟沿的重复约束,如例 43 所示。

43。

set_input_delay -min <input minimum delay value> -clock [get_clocks virtual_clock] [get_ports data_in]
set_input_delay -min <input minimum delay value> -clock [get_clocks virtual_clock] -clock_fall [get_ports data_in] -add_delay

建立和保持方法

一些源同步输入接口可以连接到为数据输出指定设建立和保持时间参数的设备。建立和保持参数指定相对于时钟输出的数据输出的建立和保持时间。在这种情况下,使用以下公式计算最大输入延迟值。输入最大延迟值指定了输入延迟的上限,因为它使用最长的数据路径和最短的时钟路径。
在这里插入图片描述

用公式 25 的输入最大延迟值编写例 44 所示的 SDC 约束。

44。

set_input_delay -max <input maximum delay value> -clock [get_clocks virtual_clock] [get_ports data_in]

DDR 输入具有应用于下降时钟沿的重复约束,如例 45 所示。

45。

set_input_delay -max <input maximum delay value> -clock [get_clocks virtual_clock] [get_ports data_in]
set_input_delay -max <input maximum delay value> -clock [get_clocks virtual_clock] -clock_fall [get_ports data_in]

计算输入最小延迟值的公式为公式 26。输入最小延迟值指定输入延迟的下限,因为它使用最短的数据路径和最长的时钟路径。
在这里插入图片描述

如例 46 所示,使用公式 26 中的最小延迟值编写 SDC 约束。

46。

set_input_delay -min <input minimum delay value> -clock [get_clocks virtual_clock] [get_ports data_in]

DDR 输入具有应用于下降时钟沿的重复约束,如例 47 所示。

47。

set_input_delay -min <input minimum delay value> -clock [get_clocks virtual_clock] [get_ports data_in]
set_input_delay -min <input minimum delay value> -clock [get_clocks virtual_clock] -clock_fall [get_ports data_in]

以 FPGA 为中心的输入延迟约束

在 FPGA 边界以以下两种方式指定源同步输入要求:

  • “建立和保持(Setup and Hold)”
  • “最大数据倾斜(Maximum Data Skew)”

建立和保持

当您的 FPGA 源同步输入接口具有建立和保持时间要求时,根据建立和保持要求计算等效的最大和最小输入延迟。

图 62 显示了具有建立和保持要求的时钟波形,以及相应的输入最大和最小延迟。要将建立时间要求转换为输入最大延迟约束,请从 UI 中减去建立时间。在 DDR 接口中,UI 值为时钟周期的一半,因为数据在两个时钟沿上传输。保持时间要求值等于输入最小延迟值。
在这里插入图片描述

例 48 显示了输入延迟约束。

48。

set_input_delay -max [expr <unit interval> - <setup time>] -clock [get_clocks input_clock] -add_delay [get_ports data_in]
set_input_delay -min <hold time> -clock [get_clocks input_clock] -add_delay [get_ports data_in]

如果您从建立中获得输入延迟约束,并使用虚拟时钟作为输入延迟时钟参考来保持需求,并且输入数据不是边沿对齐的,则必须修改约束值以补偿时钟移位。

图 63 显示了对补偿的需求。
在这里插入图片描述

虚拟时钟没有相移,输入时钟有 90° 相移,并且输入数据相对于输入时钟中心对齐(具有相等的 tSU 和 tH 要求)。

但是,当对虚拟时钟进行输入延迟约束时,建立和保持关系与对输入时钟的建立和保持关系是不一样的。输入数据相对于虚拟时钟是边沿对齐的。与虚拟时钟相关的保持需求必须减少移位量(对于中心对齐 DDR 接口,周期 ÷ 4)。关于虚拟时钟的建立要求必须增加移位量(对于中心对齐的 DDR 接口,周期 ÷ 4)。输入最大和最小延迟值都增加移位量(对于中心对齐的 DDR 接口,周期 ÷ 4)。

最大数据倾斜

当指定输入可以容忍的最大数据倾斜时,必须约束最小数据有效窗口。

图 64 所示的时钟和数据波形显示了输入最大和最小延迟值是如何根据偏差要求推导出来的。
在这里插入图片描述

输入最大延迟等于倾斜要求(skew requirement),因为输入最大延迟等于 UI 减去建立值。输入最小延迟等于负倾斜要求值,因为输入最小延迟等于保持值。保持值是负的,因为在参考时钟边沿之前数据可以改变(变得无效)。

使用虚拟时钟作为输入延迟约束的时钟参考使得以 FPGA 为中心的约束易于应用。如图 64 所示,输入最大延迟值为倾斜要求的正值,输入最小延迟值为倾斜要求的负值。

例 49 显示了 DDR 接口的输入延迟约束,使用正负倾斜值(positive and negative skew values)。

49。

set_input_delay -max <skew> -clock [get_clocks virtual_clock] [get_ports data_in]
set_input_delay -max <skew> -clock [get_clocks virtual_clock] -clock_fall [get_ports data_in] -add_delay
set_input_delay -min <negative skew> -clock [get_clocks virtual_clock] [get_ports data_in] -add_delay
set_input_delay -min <negative skew> -clock [get_clocks virtual_clock] -clock_fall [get_ports data_in] -add_delay

即使虚拟时钟(驱动源设备中输出寄存器的源时钟)或输入时钟(驱动 FPGA 中目标寄存器的时钟)有任何相移,输入延迟值仍然是正倾斜值和负倾斜值。

输入时序例外

以下部分描述了不同的对齐和捕获边沿组合,并显示了适用于每种组合的任何额外的时序例外或调整约束。对于正确操作所必需的其他时序例外或约束修改,请参阅与接口操作对应的部分:

  • “相同边沿捕获边沿对齐输入”
  • “相同边沿捕获中心对齐输入”
  • “相反边沿捕获边沿对齐输入”
  • “相反边沿捕获中心对齐输入”

相同边沿捕获边沿对齐输入

在边沿对齐的输入配置中,约束规定了 FPGA 输入端的时钟和数据关系。时钟信号通常在 FPGA 中延迟(通常使用锁相环),以便它可以满足用于捕获数据的 FPGA 寄存器的微时序参数(utSU 和 utH)。

图 65 显示了如果输入电路不包含锁相环,或者包含一个锁相环使数据捕获寄存器的相移小于或等于 0,则必须分析的建立和保持关系。虚线表示相移小于 0 时所需的建立和保持关系。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

在相同边沿捕获配置中,建立关系是在相同的发射和锁存边沿之间。保持关系是在相反的边沿之间,发射边沿发生在锁存边沿的一个周期之后。使用例 50 中的目标建立多周期例外来确保分析正确的建立和保持关系。

50。

set_multicycle_path -setup -end -rise_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk] 0
set_multicycle_path -setup -end -fall_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk] 0

使用例 51 中的 false path 例外来防止对相反边沿传输进行时序分析。

51。

set_false_path -setup -fall_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
set_false_path -setup -rise_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]
set_false_path -hold -rise_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
set_false_path -hold -fall_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]

相同边沿捕获中心对齐输入

图 66 显示了必须分析的建立和保持关系,如果数据和时钟中心对齐,或者您的输入电路包含一个锁相环,该锁相环将数据捕获寄存器的时钟相移大于 0。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

在这种情况下,必须为 DDR 输入分析默认建立和保持关系。唯一必要的例外是防止对相反边沿传输进行时序分析的 false path 例外,如例 52 所示。

52。

set_false_path -setup -fall_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
set_false_path -setup -rise_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]
set_false_path -hold -rise_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
set_false_path -hold -fall_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]

相反边沿捕获边沿对齐输入

图 67 显示了相反边沿捕获必须分析的建立和保持关系,如果您的电路不包含锁相环,或者包含一个锁相环,该锁相环将数据捕获寄存器的相移小于或等于 0。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

在这种情况下,false path 例外是必要的,因为必须分析的建立和保持关系不是默认情况下为 DDR 输入分析的关系。在例 53 中添加 false path 例外,以防止对相同边沿传输进行时序分析。

53。

set_false_path -setup -rise_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
set_false_path -setup -fall_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]
set_false_path -hold -fall_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
set_false_path -hold -rise_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]

相反边沿捕获中心对齐输入

图 68 显示了相反边沿捕获必须分析的建立和保持关系,如果数据和时钟在中心对齐,或者您的输入电路包含一个锁相环,该锁相环将数据捕获寄存器的相移大于零。红色箭头表示建立关系,蓝色箭头表示保持关系。
在这里插入图片描述

相反边沿捕获中心对齐输入需要目的地多周期例外和 false path 例外的复杂组合,以将默认时序分析行为更改为所需行为。在没有任何多周期例外和 false path 例外的情况下,图 69 显示了默认情况下分析的时序关系。红色箭头表示建立关系,蓝色箭头表示保持关系。第一个波形用红色表示上升-上升(rise-rise)和上升-下降(rise-fall)传输的建立关系,用蓝色表示保持关系。第二个波形用红色表示下降-上升(fall-rise)和下降-下降(fall-fall)传输的建立关系,用蓝色表示保持关系。
在这里插入图片描述

使用例 54 中所示的多周期例外来更改相同边沿数据传输的建立和保持关系。

54。

set_multicycle_path -setup -end -rise_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk] 2
set_multicycle_path -setup -end -fall_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk] 2

图 70 显示了应用多周期例外后的建立和保持关系。虚线显示了应用目标建立多周期例外后的关系。红色箭头表示建立关系,蓝色箭头表示保持关系。第一个波形用红色表示上升-上升(rise-rise)和上升-下降(rise-fall)传输的建立关系,用蓝色表示保持关系。第二个波形用红色表示下降-上升(fall-rise)和下降-下降(fall-fall)传输的建立关系,用蓝色表示保持关系。
在这里插入图片描述

最后,添加例 55 中所示的 false path 例外来切断相同边沿传输路径。

55。

set_false_path -setup -rise_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
set_false_path -setup -fall_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]
set_false_path -hold -fall_from [get_clocks virtual_clk] -rise_to [get_clocks data_clk]
set_false_path -hold -rise_from [get_clocks virtual_clk] -fall_to [get_clocks data_clk]

图 71 用虚线表示由例 55 中的 false path 例外切断的路径。它表示用实线分析的路径。红色箭头表示建立关系,蓝色箭头表示保持关系。第一个波形用红色表示上升-上升(rise-rise)和上升-下降(rise-fall)传输的建立关系,用蓝色表示保持关系。第二个波形用红色表示下降-上升(fall-rise)和下降-下降(fall-fall)传输的建立关系,用蓝色表示保持关系。
在这里插入图片描述

时序分析

图 72 显示了一个简单的源同步 DDR 输入设计示例,用于说明时序分析概念。
在这里插入图片描述

发送到设备的时钟具有 90° 相移以使其与数据中心对齐,因此在输入电路中不需要移位。数据的倾斜要求(skew requirement)为 +/-100 ps。输入受到例 56 中所示约束的约束。

56。

create_clock -name virtual_source -period 10.000
create_clock -name input_clock -period 10.000 -waveform { 2.5 7.5 } [get_ports clk_in]
set_input_delay -clock virtual_source -max 0.100 [get_ports data_in]
set_input_delay -clock virtual_source -min -0.100 [get_ports data_in] -add_delay
set_input_delay -clock virtual_source -clock_fall -max 0.100 [get_ports data_in] -add_delay
set_input_delay -clock virtual_source -clock_fall -min -0.100 [get_ports data_in] -add_delay

图 73 显示了发射和锁存时钟的时钟波形。
在这里插入图片描述

时序报告

要报告输入的时序,请使用 report_timing 命令和 -from_clock 和 -to_clock 选项。对于 -from_clock 选项使用虚拟时钟的名称,对于 -to_clock 选项使用驱动输入寄存器的时钟的名称。例如,使用例 57 中的两个命令来报告前面描述的电路的建立和保持时序。

57。

report_timing -from_clock virtual_source -to_clock input_clock -setup
report_timing -from_clock virtual_source -to_clock input_clock -hold

在所有可用的时间角(timing corners)进行建立和保持分析,以确保设计符合时序要求。每个 report_timing 命令报告的松弛数(slack numbers)表示数据满足其时序要求的程度。负值表示不满足约束。添加最坏情况建立并保持松弛以确定接口余量(Add the worst-case setup and hold slacks to determine the interface margin)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969186.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

webshell通信流量分析

环境安装 Apatche2 php sudo apt install apache2 -y sudo apt install php libapache2-mod-php php-mysql -y echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo ufw allow Apache Full 如果成功访问info.php&#xff0c;则环境安…

docker学习---第3步:docker实操大模型

文章目录 1.Images2.Container3.DockerfileENTRYPOINT和CMDCOPY和ADDLABLE、EXPOSE和VOLUME卷中的数据是如何做数据备份的&#xff1f; ARG和ENVHEALTHCHECK 4. Network&#xff08;本节讲容器与容器之间的通信方案&#xff09; 跟着b站 胖虎遛二狗学习 Docker动手入门 &…

DeepSeek系统崩溃 | 极验服务如何为爆火应用筑起安全防线?

引言 极验服务让您的产品站在风口之时&#xff0c;不必担心爆红是灾难的开始&#xff0c;而是期待其成为驱动持续创新的全新起点。 01现象级狂欢背后&#xff0c;你的业务安全防线抗得住吗&#xff1f; “近期DeepSeek线上服务受到大规模恶意攻击&#xff0c;注册可能繁忙&am…

中国计算机学会(CCF)新规解读:CSP-J/S年龄限制政策

中国计算机学会&#xff08;CCF&#xff09;新规解读&#xff1a;CSP-J/S年龄限制政策 一、政策背景与动机 问题根源 低龄化竞赛趋势&#xff1a;近年来&#xff0c;CSP-J/S&#xff08;非专业级软件能力认证&#xff09;参赛者中小学生比例显著增加&#xff0c;部分学生甚至在…

K8s之存储卷

一、容忍、crodon和drain 1.容忍 即使节点上有污点&#xff0c;依然可以部署pod。 字段&#xff1a;tolerations 实例 当node01上有标签test11&#xff0c;污点类型为NoSchedule&#xff0c;而node02没有标签和污点&#xff0c;此时pod可以在node01 node02上都部署&#xff0c…

用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理

要深入浅出地理解条件概率与贝叶斯定理&#xff0c;可以从以下几个方面入手&#xff0c;结合理论知识和实例进行学习&#xff1a; 贝叶斯定理与智能世界的暗语 条件概率&#xff0c;全概率公式与贝叶斯公式的推导&#xff0c;理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …

JAVA学习第三天

继承关系变量访问的特点 01.方法中找 02.子类变量定义中找 03.父类中找 this和super关键字的使用区别&#xff1a; super父类构造函数的使用&#xff1a; 使用子类构造函数时&#xff0c;都会初始化父类的数据&#xff0c;自动调用父类的无参构造函数 super内存图——007 继…

多媒体软件安全与授权新范例,用 CodeMeter 实现安全、高效的软件许可管理

背景概述 Reason Studios 成立于 1994 年&#xff0c;总部位于瑞典斯德哥尔摩&#xff0c;是全球领先的音乐制作软件开发商。凭借创新的软件产品和行业标准技术&#xff0c;如 ReWire 和 REX 文件格式&#xff0c;Reason Studios 为全球专业音乐人和业余爱好者提供了一系列高质…

计算机三级网络技术知识点全面总结

声明1 本文参考了计算机三级网络技术考过指南和其他网络教程写成&#xff0c;感谢这些作者提供的资料声明2 如果存在错误和不足&#xff0c;欢迎提出评判建议&#xff1b;如果涉及侵权&#xff0c;请联系我进行删除声明3 本文还提供了PDF版本以便下载&#xff0c;所有资料均完全…

【数据结构】(8) 二叉树

一、树形结构 1、什么是树形结构 根节点没有前驱&#xff0c;其它节点只有一个前驱&#xff08;双亲/父结点&#xff09;。所有节点可以有 0 ~ 多个后继&#xff0c;即分支&#xff08;孩子结点&#xff09;。每个结点作为子树的根节点&#xff0c;这些子树互不相交。 2、关于…

qt中实现QListWidget列表

FR:徐海涛&#xff08;hunkxu)

网络工程师 (35)以太网通道

一、概念与原理 以太网通道&#xff0c;也称为以太端口捆绑、端口聚集或以太链路聚集&#xff0c;是一种将多个物理以太网端口组合成一个逻辑通道的技术。这一技术使得多个端口能够并行工作&#xff0c;共同承担数据传输任务&#xff0c;从而提高了网络的传输能力和可靠性。 二…

8K样本在DeepSeek-R1-7B模型上的复现效果

7B Model and 8K Examples: Emerging Reasoning with Reinforcement Learning is Both Effective and Effic (notion.site) 港科大助理教授何俊贤的团队以Qwen2.5-Math-7B&#xff08;基础模型&#xff09;为起点&#xff0c;直接对其进行强化学习。整个过程中&#xff0c;没有…

Docker部署Alist网盘聚合管理工具完整教程

Docker部署Alist网盘聚合管理工具完整教程 部署alist初始化修改密码添加存储&#xff01;联通网盘阿里云盘百度网盘 部署alist 本文以Linux Docker部署&#xff0c;假设你已经安装好Docker docker run -d --restartalways \-v /your/data:/opt/alist/data \-p 5244:5244 \-e …

SpringMVC环境搭建

文章目录 1.模块创建1.创建一个webapp的maven项目2.目录结构 2.代码1.HomeController.java2.home.jsp3.applicationContext.xml Spring配置文件4.spring-mvc.xml SpringMVC配置文件5.web.xml 配置中央控制器以及Spring和SpringMVC配置文件的路径6.index.jsp 3.配置Tomcat1.配置…

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展&#xff0c;大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世&#xff0c;为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、…

多模态本地部署和ollama部署Llama-Vision实现视觉问答

文章目录 一、模型介绍二、预期用途1. 视觉问答(VQA)与视觉推理2. 文档视觉问答(DocVQA)3. 图像字幕4. 图像-文本检索5. 视觉接地 三、本地部署1. 下载模型2. 模型大小3. 运行代码 四、ollama部署1. 安装ollama2. 安装 Llama 3.2 Vision 模型3. 运行 Llama 3.2-Vision 五、效果…

破局・重构:建筑行业数字化转型生死时速——当“推土机思维”撞上“数据洪流”,谁能率先上岸?

一、冰与火之歌&#xff1a;大基建遗产下的转型阵痛 中国建筑行业曾用20年时间&#xff0c;浇筑了超越西方200年总量的基建工程&#xff1a;543万公里公路、16万公里铁路、6亿栋房屋……这些钢铁巨龙曾托起“基建狂魔”的荣光&#xff0c;却也埋下时代转折的伏笔。 1. 大维修时…

深入理解Java对接DeepSeek

其实&#xff0c;整个对接过程很简单&#xff0c;就四步&#xff0c;获取key&#xff0c;找到接口文档&#xff0c;接口测试&#xff0c;代码对接。 1.获取 KEY https://platform.deepseek.com/transactions 直接付款就是了&#xff08;现在官网暂停充值2025年2月7日&#xf…

yanshee机器人初次使用说明(备注)-PyCharm

准备 需要&#xff1a; 1&#xff0c;&#xff08;优必选&#xff09;yanshee机器人Yanshee 开发者说明 2&#xff0c;手机-联网简单操控 / HDMI线与显示器和键鼠标-图形化开发环境 / 笔记本&#xff08;VNC-内置图形化开发环境/PyCharm等平台&#xff09;。 3&#xff0c;P…