本文翻译自Xilinx官方文档UG903(v2021.1)。有认为不对的地方,请返回原文对照。

第1章

介绍

将UCF约束改成XDC约束

Xilinx® Vivado® 集成设计环境 (IDE) 使用 Xilinx 设计约束(XDC),并且不支持旧版用户约束文件 (UCF) 格式。

Xilinx 设计约束 (XDC) 和用户约束文件(UCF)之间存在主要区别: XDC 约束基于标准 Synopsys® 设计约束(SDC) 格式。 SDC 已经使用和发展了 20 多年,使其成为最用于描述设计约束的流行且经过验证的格式。

如果您熟悉 UCF 但不熟悉 XDC,请参阅UG911中将UCF约束改成XDC约束章节中的“XDC 和 UCF 的区别”部分。那一章还介绍了如何转换现有 UCF 文件到 XDC 作为创建 XDC 约束的起点。

注:XDC 与 UCF 有根本区别,必须了解这些区别才能正确地约束设计。 UCF 到 XDC 的转换实用程序不能替代正确理解并创建 XDC 约束。 本用户指南中描述了每个 XDC 约束。

按设计过程导航内容

Xilinx® 文档围绕一组标准设计流程进行组织,以帮助您查找与您当前的开发任务相关的内容。 本文件涵盖以下设计流程:

硬件、IP 和平台开发

为硬件平台创建 PL IP 模块,创建 PL 内核、子系统功能仿真,并评估 Vivado® 时序、资源使用和电源关闭。还涉及开发用于系统集成的硬件平台。 本期话题适用于本设计过程的文件包括:

• 专用硬件资源

• 使用 XDC 进行 IP 和子模块约束

关于 XDC 约束

XDC 约束是行业标准 Synopsys 设计约束 (SDC1.9 版)和 Xilinx 专有物理约束的组合。

XDC 约束具有以下属性:

• 它们不是简单的字符串,而是遵循 Tcl 语义的命令。

• 它们可以像任何其他 Tcl 命令一样被 Vivado Tcl 解释器解释。

• 它们的读入和解析顺序与其他 Tcl 命令相同。

您可以通过多种方式在流程中的不同点输入 XDC 约束。

• 将约束存储在一个或多个 XDC 文件中。

要在内存中加载 XDC 文件,请执行以下操作之一:

° 使用 read_xdc 命令。

° 将其添加到您的项目约束集之一。 XDC 文件只接受集合、列表、和 expr 内置 Tcl 命令。请参阅附录 A,有对支持的 XDC 和 SDC支持命令的完整列表的命令。

• 使用非托管 Tcl 脚本生成约束。

要执行 Tcl 脚本,请执行以下操作之一:

° 运行源命令。

° 使用 read_xdc -unmanaged 命令。

° 将 Tcl 脚本添加到您的项目约束集之一。

提示:与 XDC 文件不同,非托管 Tcl 脚本可以包含任何常用的 Tcl 命令,用于选择设计对象和定义设计约束,包括条件和循环控制结构。

注:Vivado 设计套件允许您将 XDC 文件和 Tcl 脚本混合在同一个约束集。 修改后的约束仅在它们最初被保存回其原始位置时来自 XDC 文件,而不是来自非托管 Tcl 脚本。 Tcl 脚本生成的约束是不由 Vivado Design Suite 管理,也无法进行交互修改。 想要查询更多的信息,参见第 2 章,约束方法。

注:对于 XDC 约束,命令源和 read_xdc之间的行为存在差异。使用 source 命令导入的约束没有保存在

与导入的顺序相同的检查点中。 使用 read_xdc 导入的约束首先保存,然后然后是那些用源导入的。 按照应用到的相同顺序保存所有约束在设计中,使用 read_xdc -unmanaged 而不是 source命令。

         在内存加载您的设计后验证特定约束的语法或影响,使用 Tcl 控制台和 Vivado Design Suite 报告功能。 这是特别适用于分析和调试时序约束和物理约束。

第二章

约束方法

关于约束方法

为了使设计在电路板上起作用,设计约束定义了编译流程必须满足的要求。在编译流程中,并非所有步骤都使用所有约束。 例如,物理约束仅在实现步骤(即由布局器和路由器使用)。

因为 Xilinx® Vivado® 集成设计环境 (IDE) 综合和实现算法是时序驱动的,您必须创建适当的时序约束。对设计过约束或不足约束会使时序收敛变得困难。 你必须使用与您的应用程序要求相对应的合理约束。

组织你的约束

Vivado IDE 允许您使用一个或多个约束文件。 虽然对整个编译流程使用单个约束文件似乎更方便,但随着设计变得更加复杂,维护所有约束可能是一项挑战。 对于使用多个 IP 核或由不同团队开发的大型模块的设计,通常就是这种情况。

导入时序和物理约束后,无论源文件的数量或设计处于project模式还是non-project模式,都可以使用 write_xdc 命令将所有约束导出为单个文件。 约束写入到指定的输出文件,其顺序与它们被读入项目或设计的顺序相同。命令行选项 write_xdc -type 可用于选择要导出的约束子集(时序、物理或豁免(waiver)约束)。

推荐:Xilinx 建议您将时序约束和物理约束保存到两个不同的文件中。 您还可以将特定于某个模块的约束保存在单独的文件中。

project流程

您可以在创建新项目期间或之后从 Vivado IDE 菜单将您的 Xilinx 设计约束 (XDC) 文件添加到约束集。

图 2-1 显示了一个项目中的两个约束集,它们是单 XDC 或多 XDC。 第一个约束集包括两个 XDC 文件。 第二个约束集仅使用一个包含所有约束的 XDC 文件

重要提示:如果您的项目包含使用其自身约束的 IP,则相应的约束文件不会出现在约束集中。 相反,它与 IP 源文件一起列出。

您还可以将 Tcl 脚本添加到您的约束集作为非托管约束或非托管 Tcl 脚本。 Vivado 设计套件不会将修改后的约束写回非托管 Tcl 脚本。 Tcl 脚本和 XDC 文件的加载顺序与 Vivado IDE 中显示的顺序相同(如果它们属于同一个 PROCESSING_ORDER 组)或由命令 report_compile_order -constraints 报告。

如果需要,可以在多个约束集中使用 XDC 文件或 Tcl 脚本。 有关如何创建约束文件和约束集并将其添加到您的项目的更多信息,请参阅 Vivado 设计套件用户指南:系统级设计条目 (UG895) [参考 2] 中的使用约束。

non-project流程

在非项目模式下,您必须在执行编译命令之前单独读取每个文件。

下面的示例脚本显示了如何使用一个或多个 XDC 文件进行综合和实现。

示例脚本:

read_verilog [glob src/*.v]
read_xdc wave_gen_timing.xdc
read_xdc wave_gen_pins.xdc
synth_design -top wave_gen -part xc7k325tffg900-2
opt_design
place_design
route_design

上下文外(out-of-constraints,OOC)约束

在使用动态函数交换 (DFX) 的设计中,通常以上下文外 (OOC) 方法综合设计的各个部分。 当使用这样的流程时,可以仅为 OOC 综合指定一些约束。 例如,当模块被合成 OOC 时,必须定义在模块的输入边界处传播的时钟。 这些时钟在 OOC XDC 文件中定义。

在project模式下:

add_file constraints_ooc.xdc
set_property USED_IN {synthesis out_of_context} [get_files constraints_ooc.xdc]

也可以通过 GUI 在 XDC 文件上设置上下文外(constraints_ooc.xdc 上的文件属性)。

在non-project模式下:

read_xdc -mode out_of_context constraints_ooc.xdc

综合和实现约束文件

默认情况下,所有添加到约束集的 XDC 文件和 Tcl 脚本都用于综合和实现。 在 XDC 文件或 Tcl 脚本上设置 USED_IN_SYNTHESIS 和 USED_IN_IMPLEMENTATION 属性以更改此行为。 此属性可以采用 TRUE 或 FALSE 的值。

重要提示:DONT_TOUCH 属性不符合USED_IN_SYNTHESIS 和USED_IN_IMPLEMENTATION 的属性。 如果您在综合 XDC 中使用 DONT_TOUCH 属性,则无论 USED_IN_IMPLEMENTATION 的值如何,它都会传播到实现。 有关 DONT_TOUCH 属性的更多信息,请参阅 RTL 属性,第 59 页。

重要提示:如果任何模块 (IP/BD/...) 在上下文外 (OOC) 模式下综合,顶层综合运行会推断这些模块的黑匣子。 因此,顶层综合约束不会是能够引用 OOC 模块内部的对象,例如引脚、网络、单元等。 如果某些顶层约束引用任何 OOC 模块内的对象,则可能需要将约束拆分为 2 个文件:一个用于综合的 XDC 文件(USED_IN_SYNTHESIS=TRUE / USED_IN_IMPLEMENTATION=FALSE)和一个用于实现的 XDC 文件(USED_IN_SYNTHESIS=FALSE / USED_IN_IMPLEMENTATION=TRUE)。 在实现过程中没有这样的限制,因为来自 OOC 模块 DCP 的网表与综合顶层设计文件时生成的网表相关联,而 Vivado 设计套件解决了黑匣子问题。 为在实现期间使用而生成的 XDC 输出产品与任何用户约束一起应用。

例如,仅将约束文件用于实现:

1. 在 Sources 窗口中选择约束文件。

2. 在源文件属性窗口中:

a.取消选中综合。

b.选中实现。

等效的 Tcl 命令是:

set_property USED_IN_SYNTHESIS false [get_files wave_gen_pins.xdc]
set_property USED_IN_IMPLEMENTATION true [get_files wave_gen_pins.xdc]

在非项目模式下运行 Vivado 时,您可以直接在流程的任何步骤之间读取约束。 在此模式下,属性 USED_IN_SYNTHESIS 和 USED_IN_IMPLEMENTATION 无关紧要。

以下编译 Tcl 脚本显示了如何为流程的不同步骤读取两个 XDC 文件:

read_verilog [glob src/*.v]
read_xdc wave_gen_timing.xdc
synth_design -top wave_gen -part xc7k325tffg900-2
read_xdc wave_gen_pins.xdc
opt_design
place_design
route_design

提示:除了综合前读入的约束之外,实现还包括综合后读入的约束。

排序约束

因为 XDC 约束是按顺序应用的,并且根据明确的优先规则确定优先级,所以您必须仔细检查约束的顺序。 有关更多信息,请参阅第 7 章 XDC 优先级。

注意:如果多个物理约束发生冲突,则以最新的约束为准。 例如,如果通过多个 XDC 文件为 I/O 端口分配了不同的位置 (LOC),则分配给该端口的最新位置优先。

Vivado IDE 可让您全面了解您的设计。 要逐步验证您的约束:

1. 运行适当的报告命令。

2. 在 Tcl 控制台或消息窗口中查看消息。

推荐的约束序列

推荐:无论您在设计中使用一个还是多个 XDC 文件,请按以下顺序组织您的约束。

## Timing Assertions Section
# Primary clocks
# Virtual clocks
# Generated clocks
# Clock Groups
# Bus Skew constraints
# Input and output delay constraints
## Timing Exceptions Section
# False Paths
# Max Delay / Min Delay
# Multicycle Paths
# Case Analysis
# Disable Timing
## Physical Constraints Section
# located anywhere in the file, preferably before or after the timing constraints
# or stored in a separate constraint file

注意:应在定义生成的时钟之前定义改变时钟关系或时钟传播的案例分析约束。这包括在时钟缓冲器上定义的案例分析,导致缓冲器的输出时钟受到案例分析的影响。

从时钟定义开始。必须先创建时钟,然后才能被任何后续约束使用。在声明之前对时钟的任何引用都会导致错误并忽略相应的约束。在单个约束文件中以及设计中的所有 XDC 文件(或 Tcl 脚本)中都是如此。

约束文件的顺序很重要。您必须确保每个文件中的约束不依赖于另一个文件的约束。如果有文件依赖关系,您必须最后读取包含约束依赖项的文件。如果两个约束文件相互依赖,

您必须手动将它们合并到一个包含正确顺序的文件中,或者将这些文件分成几个单独的文件并正确排序。

约束序列编辑

Vivado IDE 约束管理器将任何编辑过的约束保存回 XDC 文件中的原始位置,但不会保存在 Tcl 脚本中。 任何新约束都保存在标记为目标的 XDC 文件的末尾。 在许多情况下,当您的约束集包含多个 XDC 文件时,目标约束文件不是列表中的最后一个文件,在打开或重新加载设计时不会最后加载。 因此,保存到约束源文件的约束序列可能与您之前在内存中的不同。

重要提示:您必须验证存储在约束文件中的最终序列是否仍按预期工作。 如果必须修改序列,则必须通过直接编辑约束文件来修改它。这对于时序约束尤其重要。

约束文件顺序

在没有任何 IP 的项目流程中,所有约束都位于约束集中。 默认情况下,Vivado IDE 中显示的 XDC 文件(或 Tcl 脚本)的顺序定义了工具在将elaborated设计或综合后的设计加载到内存中时使用的读取序列。 首先读取列表顶部的文件,最后读取底部的文件。 您可以通过简单地在 IDE 中选择文件并将其移动到列表中的所需位置来更改顺序。

例如,在图 2-3 中,通过拖放将文件 wave_gen_pin.xdc 移动到文件 wave_gen_timing.xdc 之前。

等效的tcl命令是:

reorder_files -fileset constrs_1 -before [get_files wave_gen_timing.xdc] \
[get_files wave_gen_pins.xdc]

在非项目模式下, read_xdc 调用的顺序决定了约束文件的评估顺序。

IP 核的约束文件顺序

许多 IP 核都带有一个或多个 XDC 文件。 当在您的 RTL 项目中生成此类 IP 核时,它们的 XDC 文件也会在各种设计编译步骤中使用。

例如,图 2-4 显示项目中的一个 IP 核带有一个 XDC 文件。

默认情况下,IP XDC 文件在用户 XDC 文件之前被读入。以这种方式处理它允许 IP 创建一个可以在 XDC 中引用的时钟对象。它还允许您覆盖由 IP 核设置的物理约束,因为在 IP 之后评估用户约束。对于依赖于由用户或其他 IP 创建的时钟对象的 IP 核,此顺序有一个例外(例如,get_clocks -of_objects [get_ports clka])。在这种情况下,IP XDC 在用户文件之后被读取。

此行为由 PROCESSING_ORDER 属性控制,为每个 XDC 文件设置:

• EARLY:必须首先读取的文件

• 正常:默认

• LATE:必须最后读取的文件

IP XDC 会将其 PROCESSING_ORDER 属性设置为 EARLY 或 LATE。没有 IP 提供属于 NORMAL 约束组的 XDC 文件。对于属于同一 PROCESSING_ORDER 组的用户 XDC(或 Tcl)文件,它们在 Vivado IDE 中显示的相对顺序决定了它们的读取顺序。可以通过移动 Vivado IDE 约束集中的文件或使用 reorder_files 命令来修改组内的顺序。

对于属于同一 PROCESSING_ORDER 组的 IP XDC 文件,顺序由 IP 核的导入或创建顺序决定。创建项目后无法更改此顺序。

最后,用户组和IP XDC PROCESSING_ORDER 组之间的相对顺序如下:

1. 用户约束标记为 EARLY

2. IP 约束标记为 EARLY(默认)

3. 用户约束标记为 NORMAL

4. 标记为 LATE 的 IP Constraints(包含时钟相关性)

5. 标记为 LATE 的用户约束

注意:将 PROCESSING_ORDER 设置为 LATE(以便在用户约束之后处理)的 IP XDC 文件命名为 <IP_NAME>_clocks.xdc。

下图显示了如何设置 PROCESSING_ORDER 属性的示例:

等效的tcl命令是:

set_property PROCESSING_ORDER EARLY [get_files wave_gen_pins.xdc]

推荐:工具根据上述属性包括 IS_ENABLED、USED_IN_SYNTHESIS 和 USED_IN_IMPLEMENTATION确定的 XDC 文件读取顺。在 Tcl 控制台中使用 report_compile_order -constraints 命令报告出来查看。

注意:当 IP 在上下文之外合成时,IP 会在需要时提供一个包含默认时钟定义的 _ooc.xdc 文件。 _ooc.xdc 的 USED_IN 属性设置为“synthesis out_of_context implementation”(顺序无关紧要)。 在 Out Of Context 综合期间,_ooc 文件总是在所有其他约束之前处理。

更改阅读顺序

要更改约束集中的 XDC 文件或非托管 Tcl 脚本的读取顺序:

1. 在 Sources 窗口中,选择要移动的 XDC 文件或 Tcl 脚本。

2. 将文件拖放到约束集中的所需位置。

对于图 2-3 所示的示例,等效的 Tcl 命令是:

reorder_files -fileset constrs_1 -before [get_files wave_gen_timing.xdc] \
[get_files wave_gen_pins.xdc]

在非项目模式下,read_xdc 或 source 命令的顺序决定了读取约束文件的顺序。

如果使用带有约束的 IP 核,则会自动处理两组约束,如下所示:

• 不依赖于时钟的约束分组在一个 XDC 文件中,PROCESSING_ORDER 设置为 EARLY,

• 依赖于时钟的约束分组在一个 XDC 文件中,PROCESSING_ORDER 设置为 LATE。

默认情况下,用户 XDC 文件属于 PROCESSING_ORDER NORMAL 组。 它们在 EARLY XDC 文件之后和 LATE XDC 文件之前加载。 对于每个 PROCESSING_ORDER 组,IP XDC 文件的加载顺序与 IP 源窗口中列出 IP 核的顺序相同。 例如,下图显示了 XDC 文件附带的项目 IP 核之一。

当您打开您的设计时,日志文件显示 IP XDC 文件是最后加载的:

Parsing XDC File [C:/project_wave_gen_hdl.srcs/sources_1/ip/clk_core/clk_core.xdc]
for cell 'clk_gen_i0/clk_core_i0/inst'
Finished Parsing XDC File
[C:/project_wave_gen_hdl.srcs/sources_1/ip/clk_core/clk_core.xdc] for cell
'clk_gen_i0/clk_core_i0/inst'
Parsing XDC File
[C:/project_wave_gen_hdl.srcs/sources_1/ip/char_fifo/char_fifo/char_fifo.xdc] for cell 'char_fifo_i0/U0'

Finished Parsing XDC File
[C:/project_wave_gen_hdl.srcs/sources_1/ip/char_fifo/char_fifo/char_fifo.xdc] for cell 'char_fifo_i0/U0'
Parsing XDC File
[C:/project_wave_gen_hdl.srcs/constrs_1/imports/verilog/wave_gen_timing.xdc]
Finished Parsing XDC File
[C:/project_wave_gen_hdl.srcs/constrs_1/imports/verilog/wave_gen_timing.xdc]
Parsing XDC File
[C:/project_wave_gen_hdl.srcs/sources_1/ip/char_fifo/char_fifo/char_fifo_clocks.xdc] for cell 'char_fifo_i0/U0'
Finished Parsing XDC File
[C:/project_wave_gen_hdl.srcs/sources_1/ip/char_fifo/char_fifo/char_fifo_clocks.xdc] for cell 'char_fifo_i0/U0'
Completed Processing XDC Constraints

与用户 XDC 文件不同,您不能直接更改属于同一 PROCESSING_ORDER 组的 IP XDC 文件的读取顺序。 如果您必须修改订单,请执行

下列的:

1.禁用对应的IP XDC文件(IS_ENABLED设置为false)。

2. 复制他们的内容。

3. 将内容粘贴到约束集中包含的 XDC 文件之一。

4. 在需要的地方使用完整的分层网表对象路径名称更新复制的 IP XDC 命令。 这样做是必需的,因为 IP XDC 约束的编写方式可以将它们限定为 IP 实例。

5. 查看针对范围约束以特殊方式处理的 get_ports 。 有关 XDC 范围界定的更多信息,请参阅约束范围界定,第 68 页。

输入约束

Vivado IDE 提供了多种输入约束的方法。 除非您在文本编辑器中直接编辑 XDC 文件,否则您必须打开设计数据库(精心设计、综合或实施)才能访问 Vivado IDE 中的约束窗口。

在内存中保存约束

您必须在内存中有一个设计才能在编辑期间验证您的约束。 当您使用 Vivado IDE 用户界面编辑约束时,Tcl 控制台中会发出等效的 XDC 命令,以便将其应用到内存中。 必须先在内存中应用已编辑的时序约束,然后才能将其保存到 XDC 文件中。

在运行综合或实现之前,您必须将内存中的约束保存回属于项目的 XDC 文件。 Vivado IDE 会在必要时提示您保存约束。

执行以下操作之一以手动保存约束:

• Click Save Constraints.
• Select File > Constraints > Save.

注意:当您保存内存中的约束时,会打开一个对话框,提醒您这可能会导致综合和实现过时。 选中此对话框中的Remember Preference以禁用此警告。

当您运行这些命令时,Vivado 会执行以下操作:

• 将所有新约束保存到与您的设计相关的约束集中标记为目标的 XDC 文件中。

• 将所有编辑的约束保存回它们源自的 XDC 文件。

注意:约束管理系统尽可能保留原始 XDC 文件格式。

约束编辑流选项

图 2-7 显示了推荐的流程选项。 不要同时使用这两个选项。 混合使用这些选项可能会导致您失去约束。 推荐的流量选项是:
• User Interface Option
• Hand Edit Option

User Interface Option

由于 Vivado IDE 管理您的约束,因此您不能同时编辑您的 XDC 文件。 当 Vivado IDE 保存内存内容时,会发生以下情况:

• 修改后的约束替换其原始文件中的原始约束。

• 新约束将附加到标记为目标的文件中。

• XDC 文件中的所有手动编辑都会被覆盖。

Hand Edit Option

当您使用 Hand Edit 选项时,您负责编辑和维护 XDC 文件。 虽然您可能会使用 Tcl 控制台来验证某些约束的语法,但您必须在关闭或重新加载设计时放弃在内存中所做的更改。

如果保存约束时发生冲突,系统会提示您选择以下选项之一:

• 放弃在内存中所做的更改

• 将更改保存在新文件中

• 覆盖 XDC 文件

约束创建是迭代的。 在某些情况下您可以使用 IDE 编辑器,而在其他情况下可以手动编辑约束文件。

在图 2-7 中描述的每次迭代中,不要同时使用这两个选项。

如果您在两个选项之间切换,您必须首先保存您的约束或重新加载您的设计,以确保内存中的约束与 XDC 文件正确同步。

引脚分配

要在使用 RTL 分析、综合或实现视图时创建和编辑现有的顶层端口布局:

1. 选择 I/O Planning 预配置布局。

2. 打开表 2-3 所示的窗口。

有关引脚分配的更多信息,请参阅 Vivado 设计套件用户指南:I/O 和时钟规划 (UG899) [参考 3] 中的此链接。

平面规划(Floorplanning)

要在使用 RTL 分析、综合或实现视图时创建和编辑 Pblock:

1. 选择 Floorplanning 预配置布局。

2. 打开表 2-4 所示的窗口。

要在特定 BEL 或 SITE 上创建cell放置约束:

1. 在网表视图中选择cell。

2. 将cell拖放到设备视图中的目标位置。

有关布局规划的更多信息,请参阅 Vivado 设计套件用户指南:设计分析和闭合技术 (UG906) [参考 4] 中的此链接。

时序约束向导

时序约束向导可识别综合或实现设计中缺失的时序约束。 它分析了网表、时钟网络连接和现有时序约束,以便根据 Vivado 设计套件的 UltraFast 设计方法指南 (UG949) [参考 5] 提供建议。 接下来讲述的内容涵盖了三类约束,下面是摘要。 包括以下步骤:

• Clocks
° Primary clocks
° Generated clocks
° Forwarded clocks
° External feedback delays
• Input and output ports
° Input delays
° Output delays
° Combinatorial delays
• Clock domain crossings
° Physically exclusive clock groups
° Logically exclusive clock groups with no interaction
° Logically exclusive clock groups with interaction
° Asynchronous clock domain crossings
• Constraints Summary

在每个步骤中,您可以接受建议的约束或通过选中或取消选中每个建议的约束来修改列表。 但是,在向导早期取消选中推荐的约束可能会阻止在后续步骤中识别其他缺失的约束。 例如,如果您决定跳过创建时钟,向导不会识别和推荐任何引用此时钟或其自动衍生时钟的约束。

向导的最后一页提供了将要创建的约束的摘要。 您可以单击每个单独的超链接以查看约束详细信息,或在退出向导后在 Timing Constraints 窗口中可视化新约束。

您还可以选择在单击“完成”后生成以下推荐报告,以验证设计是否完全且正确地受到约束:

Create Timing Summary report:除了check_timing 报告之外,时序松弛与新约束一起报告。 如果您输入的周期或 I/O 延迟约束太困难,则可能会显示时序违规。

Create Check Timing report:此报告通过运行 check_timing 命令识别缺失或不适当的约束。

Create DRC Report using only Timing Checks:此报告运行时序 DRC。

重要提示:除非您单击取消,否则新添加的约束会自动保存到目标 XDC 文件中。 退出向导后,您可以在 Timing Constraints 窗口中编辑或删除新的约束。

如果引入不安全的时序分析,时序约束向导不建议使用约束。 此外,该向导不会修复在内存中加载设计时已经存在的不适当约束。 然而,在项目模式下使用 Vivado Design Suite 时,在创建所有丢失的时钟后,一些无效的约束可能会变得有效; 有关更多详细信息,请参阅下面的约束处理顺序和无效约束。 此外,使用向导后,如果 check_timing 或 report_drc 仍然标记一些约束问题,通常是由于源 XDC 文件中已经存在的约束问题。 您必须直接解决这些问题,而不是使用向导来解决它们。

视频:有关 Vivado 时序约束向导的更多信息,请参见 Vivado Design Suite QuickTake 视频:使用 Vivado 时序约束向导Using the Vivado Timing Constraint Wizard

P25~P49页都是时序约束向导的内容,由于平时从不使用时序约束向导,因为不翻译。

时序约束窗口(Timing Constraints Window)

Timing Constraints 窗口仅适用于综合和已实现的设计。 对于详细的设计约束,您必须直接使用和编辑 XDC 文件。 有关更多信息,请参阅创建综合约束,第 59 页。

您可以使用以下三个选项之一打开 Timing Constraints 窗口,如图 2-36 所示:

• 选择 Window > Timing Constraints.
•在 Flow Navigator 面板的 Synthesis 部分,选择Synthesized Design > Edit Timing Constraints.
• 在 Flow Navigator 面板的实施部分,选择 Implemented Design > Edit Timing Constraints.

Timing Constraints 窗口显示内存中的时序约束,其顺序与 XDC 文件和 Tcl 脚本中的顺序相同,或者与您在 Tcl 控制台中输入它们的顺序相同。

某些约束不能从此窗口编辑。 它们标有 XDC 无编辑图标 。

Timing Constraints Spreadsheet

时序约束电子表格显示特定类型的所有现有约束的详细信息。 使用时序约束电子表格查看和编辑约束选项。

面板的最后两列显示:

• 源文件:约束来自的 XDC 文件或 Tcl 脚本的名称

• Scoped Cell:应用约束时当前实例的名称。此名称通常对应于带有专用约束的 IP 实例。有关更多信息,请参阅约束范围,第 68 页。

通过双击电子表格的最后一行,可以创建所选类型的新约束。相应的约束创建对话框打开,您可以填写新约束的详细信息。单击确定在内存中应用约束并关闭窗口。电子表格中的新行显示了新的约束信息。

您可以通过直接在电子表格中修改值来编辑任何现有约束。完成编辑后,单击应用将修改后的约束应用到内存中。

重要提示:应用新的或修改的约束不会将其保存在 XDC 文件中。您必须单击保存约束来保存它。

重要提示:无法编辑或删除 IP 约束。为了修改与 IP 一起交付的约束,您必须禁用相应的 IP XDC 文件,将约束复制到您的 XDC 文件,并根据需要编辑约束。

约束创建,按类别分组

当您选择约束类型时,相应的电子表格会出现在右侧的子窗口面板上。 这允许您查看已创建的相同类型的所有约束。

要创建新约束,请双击目标约束的名称。 一个对话框允许您为每个选项指定值。 单击“确定”后,该工具将执行以下操作:

1. 验证语法。

2. 将语法应用于内存。

3. 在电子表格的末尾添加新约束。

4. 在完整约束列表的末尾添加新约束。

所有约束

窗口底部显示加载到内存中的约束的完整列表,其顺序与应用的顺序相同。 约束根据 XDC 文件或它们源自的 Tcl 脚本进行分组。 当 XDC 文件的范围限定为特定的分层单元时,单元名称会显示在文件名旁边。

P54-P56还有部分内容,由于可能用不到,不翻译了。

XDC 模板

您可以通过选择Tools > Language Templates来访问 XDC 模板。

XDC 模板

包括:

• 最常见的时序约束,例如时钟定义、抖动、输入/输出延迟和异常

• 物理限制

• 配置约束

使用 XDC 模板

要使用 XDC 模板:

1. 选择您要使用的模板。

2. 复制预览窗口中显示的文本。

3. 将文本粘贴到您的 XDC 文件中。

4. 使用设计中的实际名称或适当的值替换通用字符串。

高级 XDC 模板

一些高级模板(例如系统同步和源同步 I/O 延迟约束)需要您设置一些 Tcl 变量来捕获设计要求。 Tcl 变量用于实际的 set_input_delay 和 set_output_delay 约束。

您必须验证是否已填充所有必需的值,而不是使用默认值。

Creating Synthesis Constraints
The Vivado Synthesis transforms the RTL description of your design into a technology
mapped netlist. This process happens in several steps, and includes a number of
timing-driven optimizations.
Xilinx® FPGAs include many logic features that can be used in many different ways. Your
constraints are needed to guide the synthesis engine towards a solution that meets all the
design requirements at the end of implementation.
There are four categories of constraints for the Vivado IDE synthesis:

创建综合约束

Vivado 综合将您设计的 RTL 描述转换为技术映射网表。 这个过程分几个步骤进行,包括许多时序驱动的优化。

Xilinx® FPGA 包括许多可以以多种不同方式使用的逻辑特性。 需要您的约束来引导综合引擎实现在实现结束时满足所有设计要求的解决方案。

Vivado IDE 综合有四类约束:

• RTL Attributes
• Timing Constraints
• Elaborated Design Constraints

RTL 属性

RTL 属性必须写入 RTL 文件中。 他们通常选择逻辑的某些部分的映射样式,以及保留某些寄存器和网络,或控制最终网表中的设计层次结构。

如需了解更多信息,请参阅 Vivado 设计套件用户指南:综合 (UG901) [参考 8] 中的此链接。

重要提示:DONT_TOUCH 属性不符合USED_IN_SYNTHESIS 和USED_IN_IMPLEMENTATION 的属性。 如果您在综合 XDC 中使用 DONT_TOUCH 属性,则无论 USED_IN_IMPLEMENTATION 的值如何,它都会在实现中使用。

有关 USED_IN_SYNTHESIS 和 USED_IN_IMPLEMENTATION 的更多信息,请参阅综合和实现约束文件,第 11 页。

DONT_TOUCH 属性例子:
set_property DONT_TOUCH true [get_cells fsm_reg]

时序约束

时序约束必须通过一个或多个 XDC 文件传递给综合引擎。 只有以下与设置分析相关的约束对综合结果有实际影响:

• create_clock
• create_generated_clock
• set_input_delay
• set_output_delay
• set_clock_groups
• set_false_path
• set_max_delay
• set_multicycle_path

物理和配置约束

综合算法忽略物理和配置约束。

Elaborated Design Constraints

建议:创建综合 XDC 的第一个版本时,请使用简单的时序约束来描述高级设计要求。

在综合流程上,网络延迟建模仍然不是很准确。 主要目标是在开始实现之前获得符合时序或少量失败的综合网表。 在许多情况下,您必须经过多次 XDC 和 RTL 修改迭代才能达到此状态。

基于 RTL 的 XDC 创建迭代如图 2-46 所示。 它基于对精化设计的利用,在您的设计中查找要限制进行综合的对象名称。

您必须使用 Tcl 控制台来验证 XDC 命令的语法,然后再将它们保存在 XDC 文件中。 通过详细设计,您可以创建约束、查询时钟和查询设计对象,但不能运行任何时序报告命令。

在编写综合约束时可以安全使用的设计对象是:

• 顶层端口

• 手动实例化的原语(单元和引脚)

在详细设计的创建过程中,某些 RTL 名称被修改或丢失。

以下是最常见的情况:

• Single-Bit Register Names
• Multi-Bit Register Names
• Absorbed Registers and Nets
• Hierarchical Names

P62-P63讲述了上面的4种情况,RTL的名字可能被更改成什么名字,不再翻译。

创建实现约束

获得综合网表后,您可以将其与 XDC 文件或启用的 Tcl 脚本一起加载到内存中以进行实现。 您必须在加载 XDC 时查看该工具发出的消息,以验证和更正无法应用的任何约束。

在某些情况下,综合网表中的对象名称与详细设计中的名称不同。 如果是这种情况,您必须使用更正的名称重新创建一些约束,并将它们保存在仅用于实现的 XDC 文件中。

在工具可以正确加载所有 XDC 文件后,您可以运行时序分析以便:

• 添加缺少的约束,例如输入和输出延迟。

• 添加时序例外,例如错误路径、多周期路径和最小/最大延迟约束。

• 识别由于设计中的长路径而导致的严重违规并更正 RTL 描述。

您可以使用与综合期间相同的基本约束,并创建第二个 XDC 文件来存储特定于实现的所有新约束。 您可以选择保存物理和配置约束在单独的 XDC 文件中。

注意:在项目模式下,打开综合设计会导致链接来自综合后 DCP 的网表以构建完整的顶级分层网表。 所有标记为实现的 XDC 约束也会自动加载。 这使您能够验证完整综合设计的实现约束。 这意味着如果修改了实现约束,打开的综合设计将过期,而不是运行后的综合。 GUI 显示一个小横幅并提供重新加载设计的选项。

基于网表的 XDC 迭代如图 2-49 所示。

调整综合逻辑复制的约束

在综合期间,会复制一些寄存器以提高设计性能。 合成引擎不会修改用户 XDC 约束以包括复制的单元格。 如果将时序约束附加到 Vivado Synthesis 复制的对象,则根据约束的写入方式,复制的单元并不总是被 XDC 约束覆盖,这可能会影响结果的实现质量。

使用 Vivado Synthesis 时,get_cells 和 get_pins 命令提供了一种自动包含复制对象的机制。

例如, set_false_path –from [get_cells –hierarchical *rx_reg] 可以重写如下,以便在实现过程中也安全地包含复制的对象:

set_false_path -from [get_cells -hierarchical *rx_reg -include_replicated_objects]

还有一些由于复制逻辑需要调整的细节,P66,未翻译。

         在继续实现之前,您必须验证您的设计不包含任何重大时序违规。 布局布线工具可以修复最合理的时序违规,但它们无法修复导致时序收敛不可能的基本设计问题。

建议:重新查阅 RTL 以减少违规路径上的逻辑级别数量并清理时钟树,以便使用专用时钟资源并最大程度地减少相关时钟之间的偏差。 您还可以添加综合属性并使用不同的综合选项。

如需更多信息,请参阅 Vivado 设计套件用户指南:综合 (UG901) [参考 8] 中的此链接,或 Vivado 设计套件用户指南:实现 (UG904) [参考 9] 中的此链接。

调整带综合时带黑盒的约束

当使用上下文外 (OOC) 综合模式时,OOC 模块 (IP/BD/DFx/...) 被推断为顶层内部的黑匣子。 这意味着顶层约束无法访问 OOC 模块内的网表对象。 这可能需要顶层综合约束不同于实施约束。 在项目模式下,这可以通过创建用于综合的特定 XDC 文件并在其上设置属性 USED_IN_SYNTHESIS=TRUE & USED_IN_IMPLEMENTATION=FALSE 来完成。 用于实现的顶层XDC 应具有 USED_IN_SYNTHESIS=FALSE。

可从黑匣子访问的唯一对象是输入和输出端口。 这限制了顶层在引用黑盒时可以指定的时序约束类型。

来自 OOC 综合的顶层约束的一些限制是:

• 在OOC 模块内部生成的自动衍生时钟不能重命名。

• 不能引用 OOC 模块内定义的时钟名称。 传播到 OOC 模块输出的时钟是根据连接到模块端口的网络命名的,而不是根据它在模块内部的名称,即使时钟在模块 XDC 内部被重命名。

• 如果顶层约束需要引用来自 OOC 模块的时钟,则应使用诸如“get_clocks -of_objects [get_pins <MODULE_OOC_OUTPUT_CLOCK_PORT>]”之类的查询。

约束范围

如果需要,可以选择将来自特定 XDC 文件的约束范围限定为特定模块、设计的特定单元或两者。 这对于在没有关于顶层的任何信息的情况下创建和应用约束到设计的子级别很方便。 块级约束必须独立于顶层约束开发,并且必须尽可能通用,以便它们可以在各种上下文中使用。 它们也不得影响超出块边界的任何逻辑。 默认情况下,Vivado 设计套件项目中生成的 Vivado IP 目录中的所有 IP 核都使用此机制将其约束加载到内存中

XDC 文件范围属性

通过在 XDC 文件上指定以下属性来激活约束范围机制:

• SCOPED_TO_REF:此属性采用模块(或实体)的名称。 约束仅应用于指定模块(或实体)的所有实例,

• SCOPED_TO_CELLS:此属性采用分层单元名称列表。 约束范围被单独应用于每个分层单元,

• SCOPED_TO_REF + SCOPED_TO_CELLS:如果指定了这两个属性,则约束将应用于 SCOPED_TO_CELLS 列表的每个单元格,位于 SCOPED_TO_REF 指定的模块(或实体)内。

这些属性由 Vivado 设计套件自动设置,用于通过 IP 目录添加到 RTL 项目的 IP 核。

设置 XDC 文件范围属性示例

图 2-50 显示了 uart_tx_i0 单元,它是 uart_tx 模块的一个实例,它包括两个分层单元,uart_tx_ctl_i0 和 uart_baud_gen_tx_i0。

该项目包含一个 XDC 文件 uart_tx_ctl.xdc 来约束 uart_tx_ctl 模块。

以下是使用 uart_tx_ctl.xdc 上的范围属性的三个等效 Tcl 示例。 可以在 Vivado IDE 中 XDC 文件的属性窗口中设置相同的值。

# Using the reference module name only:
set_property SCOPED_TO_REF uart_tx_ctl [get_files uart_tx_ctl.xdc]
# Using the cell name only:
set_property SCOPED_TO_CELLS uart_tx_i0/uart_tx_ctl_i0 [get_files uart_tx_ctl.xdc]
# Using both the uart_tx reference module and uart_tx_ctl_i0 instance:
set_property SCOPED_TO_REF uart_tx [get_files uart_tx_ctl.xdc]
set_property SCOPED_TO_CELLS uart_tx_ctl_i0 [get_files uart_tx_ctl.xdc]

在非项目模式下使用 Vivado Design Suite 时,您可以使用带有 -ref 和 -cells 选项的 read_xdc 命令来获得相同的结果:

# Using the reference module name only:
read_xdc -ref uart_tx_ctl uart_tx_ctl.xdc
# Using the cell name only:
read_xdc -cells uart_tx_i0/uart_tx_ctl_i0 uart_tx_ctl.xdc
# Using both the uart_tx reference module and uart_tx_ctl_i0 instance
read_xdc -ref uart_tx -cells uart_tx_ctl_i0 uart_tx_ctl.xdc

当一个模块在设计中被多次例化时,该模块在综合过程中是唯一的。 综合之后,RTL 模块的每个实例都指向不同的模块名称。 要将某些 XDC 约束应用于原始 RTL 模块的所有实例,应使用属性 ORIG_REF_NAME 而不是属性 REF_NAME。 例如:

set_property SCOPED_TO_REF [get_cells -hierarchical -filter {ORIG_REF_NAME ==
uart_tx_ctl}] [get_files uart_tx_ctl.xdc]
read_xdc -ref [get_cells -hierarchical -filter {ORIG_REF_NAME == uart_tx_ctl}]
uart_tx_ctl.xdc

注意:当一个模块被统一化时,属性 ORIG_REF_NAME 设置在原始单元格和来自原始单元格统一化的所有实例上。

XDC 范围界定机制

除了端口,约束范围依赖于 current_instance 机制,它是 Synopsys 设计约束 (SDC) 标准的一部分。 当使用 current_instance 命令将范围设置为设计层次结构的较低级别时,对象查询命令只能返回包含在该级别或以下级别的对象。

P70-P71,不翻译

使用 XDC 进行 IP 和子模块约束

当使用 Package IP 创建 IP 并从 Vivado IP 目录中使用它时,还可以打包 XDC 约束以供包含。 Vivado 设计套件中的任何 IP 都是即插即用的,也就是说,该 IP 不需要您必须从中剪切和粘贴约束以完成顶层设计约束的示例项目。 相反,IP 可以与为 IP 开发的 XDC 文件一起打包,就好像它是一个独立的顶级设计。 当使用 IP 目录在项目中实例化 IP 时,Vivado 工具负责适当地读取约束。

同样,您可以为设计的子模块开发约束,并通过在项目流程中适当设置 SCOPED_TO_REF/SCOPED_TO_CELLS XDC 文件属性,或在非项目模式使用 read_xdc -ref/-cells 命令来使用与 IP 核相同的范围机制。

范围查询指南

为了使该流程顺利运行,必须编写 XDC 约束,以便约束的影响保持在 IP 或子模块实例的本地。 Vivado 工具可以将查询范围设置为层次结构的特定级别,如先前在约束范围,第 68 页中所见。为 IP 或子级别模块开发约束时,您必须了解查询命令的行为:

P73-P74,下面是细化范围查询指南。

范围时序约束指南

为避免对顶层设计产生负面影响,重要的是确保为 IP 或子模块编写的时序约束不会传播到其边界之外,某些情况下的时钟定义除外。

例如,考虑在进入 IP 的两个时钟之间的 IP XDC 中定义false path约束的情况。 IP 包括用于异步时钟边界的适当电路,但可能不适用于设计的其余部分。 如果两个时钟相关并且必须在设计的其余部分一起计时以具有适当的硬件功能,则这是一个问题.

此外,如第 7 章 XDC 优先级中所述,IP XDC 文件中定义的时序异常可能具有比顶级约束更高的优先级,并且可以覆盖它们,这是不希望的。 为避免这种情况,赛灵思建议您将约束应用于 IP 本地的网表对象。 在两个全局时钟之间存在虚假路径的情况下,虚假路径也必须从 IP 内的一组起点单元应用到 IP 内的另一组终点单元。 这种技术被称为点对点异常而不是全局异常。

IP/子模块XDC的推荐约束规则

块级约束必须符合以下规则:

1. 如果希望在设计的顶层创建时钟,则不要在块级约束中定义时钟。

相反,可以使用 get_clocks -of_objects 命令在块内查询它们。 此命令返回遍历设计中特定对象的所有时钟。

例子:

设置 blockClock [get_clocks -of_objects [get_ports clkIn]]

如果需要在模块内部定义时钟,则它必须位于驱动实例化输入/输入输出缓冲器的输入/输入端口上,或者位于创建/转换时钟的单元的输出上(MMCM/PLL 或 由计时工具自动处理的特殊缓冲区)。

例子:

° 带输入缓冲器的输入时钟

° 时钟分频器

° GT 恢复时钟

2. 仅当端口直接连接到顶级端口并且 I/O 缓冲区在 IP 内部实例化时,才指定输入和输出延迟。

例子:

° 带有输入缓冲器的输入数据端口

° 带有输出缓冲器的输出数据端口

3. 不要在两个不受 IP 绑定的时钟之间定义时序异常。

4. 不要按名称引用时钟,因为名称可能会因顶层时钟名称或模块被多次例化而有所不同。

5. 如果模块可以在同一个顶层设计中多次实例化,则不要添加布局约束。

约束效率

查看约束覆盖率

改进约束运行时间

替换 all_registers 查询

排序约束以获得更好的运行时间

P76-P80将约束效率,细节不翻译

翻译到此告一段落,感觉并不是所有内容都要翻译,随后会通读整片文档,做一个读后总结。

使用Xilinx约束相关推荐

  1. Xilinx 约束(ISE)

    目录 1.简述 2.约束文件 2.1.概念 2.2.创建约束文件 3.UCF 文件语法 3.1.语法 3.2.通配符 3.3.定义设计层次 4.引脚和区域约束语法 4.1.LOC语句语法 4.2.LO ...

  2. FPGA 时序约束系列之周期约束

    目录 1.周期(PERIOD)约束 时钟周期估计 编辑约束 时钟偏斜计算 基本时序报告 数字时钟管理器的周期约束 Clock Phase Period Example Hold Calculation ...

  3. ISE中UCF约束文件的编写

    ISE 约束文件的基本操作 1.约束文件的概念 FPGA设计中的约束文件有3类:用户设计文件(.UCF文件).网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束.管脚约束以 ...

  4. xilinx fpga学习笔记5:Xst综合属性

    第六章:设计综合和行为仿真 6.1 设计综合 本节将详细介绍设计综合的概念,综合属性的设置,综合过程的实现,并且通过查看原理图符号更加直观的建立HDL高级描述和FPGA底层源语之间的联系. 6.1.1 ...

  5. ise 时钟约束_ISE 约束文件完整讲解

    ISE 约束文件的基本操作 1.约束文件的概念 FPGA设计中的约束文件有3类:用户设计文件(.UCF文件).网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束.管 脚约束 ...

  6. ISE约束文件UCF的基本语法

    (一)约束的分类: 利用FPGA进行系统设计常用的约束主要分为3类. (1)时序约束:主要用于规范设计的时序行为,表达设计者期望满足的时序条件,知道综合和布局布线阶段的优化算法等. (2)布局布线约束 ...

  7. FPGA UCF约束文件全解

    (一)约束的分类: 利用FPGA进行系统设计常用的约束主要分为3类.(1)时序约束:主要用于规范设计的时序行为,表达设计者期望满足的时序条件,知道综合和布局布线阶段的优化算法等.(2)布局布线约束:主 ...

  8. 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记

    对Verilog 初学者比较有用的整理(转自它处) 作者: Ian11122840 时间: 2010-9-27 09:04 标题: 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记 所谓综 ...

  9. 关于verilog的一些基础知识整理

    *作者: Ian11122840 时间: 2010-9-27 09:04 * *标题: 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记 * *所谓综合,就是把描述语言转化成能硬件实现的电 ...

最新文章

  1. 两个提高javascript执行效率的简易代码分享给大家
  2. 言论丨李开复:中国在AI领域的优势与机会,现阶段AI领域的挑战
  3. 从ICLR提交论文看机器学习的趋势和风口
  4. jpa 根据主键生成策略获取id_JPA主键生成策略
  5. 【多图】近距离接触甲骨文总裁马克赫德,Oracle在上海香格里拉酒店数据中心优化专题研讨会...
  6. crs 管理的几个演示(培训作业)
  7. 职场‘下班沉默症’调查
  8. linux 设置gbk编码格式,设置ubuntu支持gbk编码格式和设置eclipse 编码格式
  9. 在SQL Server数据库之间进行数据导入导出
  10. MySQL远程实时备份binlog
  11. 【Teradata SQL】禁用和启用数据库用户登录
  12. 2.1_stack_栈
  13. 2021-2025年中国电子束加速器行业市场供需与战略研究报告
  14. python简单查询用户
  15. Java排序算法——插入排序
  16. 常见问题之Golang——verifying github.com/go-playground/assert/v2@v2.0.1/go.mod: checksum mismatch错误...
  17. 几部科幻小说的评价和感想
  18. vue react 写法区别
  19. 如何从被领导到领导别人
  20. python爬斗鱼直播数据图片_最美小编带你Python爬虫实现获取斗鱼主播信息

热门文章

  1. 你还不清楚某个系统文件的作用吗?Windows_xp系统文件详解【大全】
  2. 从大型电子厂到互联网大厂(富士康到腾讯),我花了1年时间
  3. Henry捡钱 Java 动态规划
  4. 根植旅游行业酷讯旅游发布2011全新战略
  5. “B站”们的服务器藏哪儿了?
  6. Authorware与flash按钮的结合使用
  7. VC窗口刷新InvalidateRect和…
  8. 手机里同时放电信卡和联通卡诡异情况描述
  9. 获取当前年份前后各五年的数据与双击选中方法的使用
  10. 编程语言的自举之路——从机器码到高级语言