Quartus® Prime专业版用户指南: 设计编译

ID 683236
日期 4/01/2024
Public
文档目录

1.7.3.7. 示例:使用SDC-on-RTL功能

本主题提供关于如何在设计中使用SDC-on-RTL功能和设置时序约束的实例。

您可以使用新的和预先存在的设计,这些设计包含来自不同来源的组件,包括Verilog、VHDL、IP和Platform Designer。假设您的设计包含需要约束定义的节点,例如时钟、生成的时钟或异步路径,跨越不同的层次结构级别。在这种情况下,您可以使用SDC-on-RTL约束有效地找到它们。您选择的设计必须成功通过编译流程内各个Analysis & Elaboration阶段,以实现无缝且有效的测试过程。

您可以使用Project > Settings下的RTL Analysis Debug Mode选项控制Analysis & Elaboration期间所生成阶段的数量。该模式默认被关闭,所以意味着只有Elaborated和Swept检查点(checkpoint)可用,Instrumented和Constrained检查点不可用。启用此模式后,所有四个检查点都可用。

注: 当前, Quartus® Prime IP仅使用常规SDC,就意味着如果您想要创建与IP时钟交互的SDC-on-RTL约束,需要首先使用SDC-on-RTL约束对其进行定义。这些时钟最终可能会被IP SDC覆盖。或者,如果您不需要在 Elaboration中定义的时钟,则请在综合后静态时序分析 (STA)期间使用derive_clocks以自动针对Timing Analyzer会话过程临时生成时钟。

以下步骤演示了通过定位RTL节点名称为您的设计启动时序约束的过程:

  1. 点击左手边Tasks窗格中的New。出现新建对话框。
  2. 点击SDC File targeting RTL Names (Read and stored after elaboration)
    图 54. 新对话框
  3. 点击OK
  4. 在新的SDC-on-RTL文件中,根据节点的RTL名称制定一套全面的约束条件。有关如何获取受支持命令列表的信息,请参阅创建SDC-on-RTL SDC文件中的约束
  5. 请确保约束目标正确,并且所选设计通过Analysis & Elaboration编译阶段,具体表现为此阶段中约束被读取并被应用于经过解析的网表。此步骤至关重要,因为它使软件能够生成设计的数据库。此外,它还对各种检查点(checkpoint)授予访问权限,您可以由此访问RTL Analyzer
    注: RTL Analyzer可帮助您定位设计中需要应用约束的特定网表节点。它允许您浏览设计并选择所需的目标节点。随后,您可以使用Tcl控制台内生成的相应Tcl命令,从Tcl命令中提取分层节点名称。此过程简化了在网表节点上实现约束的任务。有关 RTL Analyzer的更多信息,请参阅探索RTL Analyzer
    图 55. 在RTL Analyzer中找到特定网表节点

    或者,您可以使用 Find 工具,可从RTL Analyzer的Edit菜单中找到查找工具。Find工具允许您从访问过的检查点,在已更新的数据库中搜索对象。

    图 56. 在RTL Analyzer中查找Dialog对话框

    此外,您可以通过使用get_ports命令关注设计的输入和输出从而创建您的一套数据。在您的设计中,可以使用get_nets命令找到特定的网络,或使用get_pins命令来针对管脚。

    在建立设计中的时序约束后,请使用以下实例作为指导例建立您的约束,尤其关注RTL节点名称,从而确保整个设计处理的精度和效率。

顶层实例管脚所在位置

在某些情况下,需要约束顶层实例的管脚。例如,在定义时钟和复位输入时,可以利用get_pins Tcl命令后跟分层管脚名称来过滤每个管脚,如下所示:

get_pins U0|clk_in

此Tcl命令将输入管脚clk_in返回实例U0

图 57. 顶层实例管脚所在位置
类似地,您还可以找到同一实例的其他管脚所在位置并应用必要的约束,如下所示:
create_clock -name clk_input -period 10 [get_pins U0|clk_in]
create_generated_clock -name clk_output -source [get_pins U0|clk_in] -divide_by 2 [get_pins U0|clk_out]

单元中管脚所在位置

在约束设计时,您可能需要找到单元管脚所在位置以应用约束。该情况下,您可以使用get_pins Tcl命令和RTL名称来定位特定的单元管脚,例如clkd输入和q输出。例如:

get_pins U6|reg_a[0]|clk
get_pins U6|reg_a[0]|d
get_pins U6|reg_a[0]|q
图 58. 单元中管脚所在位置的示例

这些Tcl命令返回U6实例中reg_a[0]寄存器的特定管脚。您可以使用返回的集合来约束路径。例如,从U6|reg_a[0]U7|regb_a[0][7],如下:

set_false_path -from [get_pins U6|reg_a[0]|clk] -to [get_pins U7|regb_a[0][0]|d]

使用通配符的管脚所在位置

在您的设计中,您可能需要约束具有相似属性和名称的多个管脚。该情况下,请使用通配符来过滤结果。

注: 请谨慎使用通配符,并确保选取的使用范围中未包含不必要的目标。以无关节点为目标可能会限制优化,并增加编译运行时间和内存。

get_pins命令可以找到U7的总线portaportb的位置,如下所示:

get_pins U7|porta[*]
get_pins U7|portb[*]
图 59. 使用通配符的管脚所在位置示例

Tcl命令返回从porta[0]porta[7]和从portb[0]portb[7]的管脚集合。您可以使用返回的集合同时约束所有对象,如下所示:

set_false_path -from [get_pins U5|rega*|clk] -to [get_pins U7|porta[*]]
set_false_path -from [get_pins U6|rega*|clk] -to [get_pins U7|portb[*]]

示例 4. 在更深层次上应用约束

在设计中,您可以使用竖线字符(|)(pipe character) 来分隔实例的层次结构级别。当层次结构级别匹配且字符串值(包括通配符)与管脚名称匹配时,将应用约束。例如:

get_pins U3|U0_lv1|U0_lv2|U0_lv3|flag

基本时序分析流程要求在应用任何约束之前执行fitter来解析时序网表。在以下示例中,假设您打算约束深埋在模块A内的生成时钟:

图 60. 在更深层次上应用约束的示例

为了实现这一点,找到必须应用约束的单元格clk_out_mux并确定管脚名称COMBOUT。该过程通常会导致难以解读的复杂路径名称,尤其是当模块名很复杂时(不同于简单直观的名称,例如A|B|C)。此外,假设层次结构在未来发生变化。该情况下,您必须重新运行布局布线器(fitter)并再次深入研究设计以得出更新的路径,这样可能会导致设计与约束目标之间出现不一致。您可以找到COMBOUT管脚如下:

get_pins A|B|C|U0|clk_out_mux~0|combout

SDC-on-RTL还提供了一种有效的约束传播方法,使您能够在模块边界应用约束。它确保这些约束在综合阶段无缝扩展到相应的叶子节点(leaf)实例。对于实例,重新回顾前面的示例,其中嵌入在模块A中的时钟约束可以使用模块A边界上的SDC-on-RTL约束来建立,请特别关注clk_out管脚。

图 61. 更深层的设计层次

未了找到模块A的clk_out管脚,请使用以下过滤器:

get_pins A|clk_out

集中关注抽象块边界处的管脚,您就可以根据需要灵活修改内部实例层次结构。即使您决定重命名模块中的内部实例(例如,将其从A|B|C|U0改为A|X|Y|U0,约束任然保持有效。重要的是可以在不改变现有约束的情况下完成。从而证明了SDC-on-RTL的强健功能,使您可以专注于边界管脚,而不是浏览复杂的层次结构。这种方法可确保约束准确性并简化约束管理。

创建约束后,重新运行编译记录板(dashboard)上的Analysis & Elaboration,以便读取约束并将其应用于您的设计。打开RTL Analyzer的约束检查点,并仔细选择应用了约束的节点。利用Property Viewer(属性查看器)验证是否对这些节点应用正确的约束。有关更多信息,请参阅检查SDC-on-RTL约束

图 62. RTL Analyzer中的Property Viewer

利用 Quartus® Prime软件的其他工具可探索和确认所有SDC约束均已被读取并成功应用。从RTL Analyzer启动Constraints查看器可以帮助您使用Schematic Viewer来验证和交叉探测约束。

图 63. Constraints Viewer(约束查看器)

此外,Compilation Report > SDC Constraints文件夹下的报告提供了关于约束及其位置的详细视图。使用Constraint Propagation Report查看约束在网表转换时如何传播,并检查约束在优化后最终出现的位置。

重要: 这些工具提供了验证是否正确应用约束的有效方法。但是,如果您打算使用SDC-on-RTL方法迭代定义约束的过程,则每次都必须重新运行Analysis & Elaboration阶段。这种迭代方法可确保在网表生成期间对约束进行细致分析,从而提高性能并与您的设计无缝集成。