仅对英特尔可见 — GUID: csq1692201125147
Ixiasoft
仅对英特尔可见 — GUID: csq1692201125147
Ixiasoft
1.7.3.7. 示例:使用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检查点不可用。启用此模式后,所有四个检查点都可用。
以下步骤演示了通过定位RTL节点名称为您的设计启动时序约束的过程:
- 点击左手边Tasks窗格中的New。出现新建对话框。
- 点击SDC File targeting RTL Names (Read and stored after elaboration)。
图 54. 新对话框
- 点击OK。
- 在新的SDC-on-RTL文件中,根据节点的RTL名称制定一套全面的约束条件。有关如何获取受支持命令列表的信息,请参阅创建SDC-on-RTL SDC文件中的约束。
- 请确保约束目标正确,并且所选设计通过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。

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名称来定位特定的单元管脚,例如clk或d输入和q输出。例如:
get_pins U6|reg_a[0]|clk get_pins U6|reg_a[0]|d get_pins U6|reg_a[0]|q

这些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的总线porta或portb的位置,如下所示:
get_pins U7|porta[*] get_pins U7|portb[*]

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内的生成时钟:

为了实现这一点,找到必须应用约束的单元格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管脚。

未了找到模块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约束。

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

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