文档目录

1.7.3.5. 使用基于实体的SDC-on-RTL约束

典型的设计包括第三方IP和RTL的组合,因此基于实体的SDC-on-RTL 的主要目标是通过授权IP所有者封装其IP的SDC约束来确保IP的无缝集成。

鉴于SDC文件中指定的时序约束通常全局应用于整个设计而不是应用于特定实体,正确封装IP SDC变得至关重要。这种封装允许使用IP而不会遇到意外的SDC漏泄。为了实现这一点,实体绑定前置于IP的RTL路径名称,可有效防止任何SDC漏泄并避免对可能恰好与名称匹配的设计路径产生潜在影响。

此外,引入基于实体的SDC-on-RTL约束使IP创作者能够在模块边缘定义特定约束。这些约束针对设计层次结构中上下文IP实例化内部综合后时序分析进行了优化。即使IP创作者在其实现过程中对IP在设计层次结构中的实例化位置缺乏精确的了解,但这些约束仍然有效。这种方法允许IP创作者实现其SDC约束,而无需关于IP在层次结构中最终位置的详细信息。

该流程支持在Analysis & Elaboration阶段读取设计和IP核中基于实体的SDC-on-RTL,在此阶段中基于实体的SDC-on-RTL约束被读取并保存在底层实体数据库中。这些约束最终按SDC的读入顺序进行处理,并在编译期间应用于层次网表对象。

Quartus® Prime运行时通过IP实例一起生成IP SDC,并指定工程分配以将IP SDC与IP设计实体名称关联起来。

QSF赋值语句(QSF Assignment Syntax):

set_instance_assignment -name RTL_SDC_FILE <sdc_file_name> -entity <entity_name> [-no_sdc_promotion]

其中:

参数 描述
RTL_SDC_FILE 指定SDC-on-RTL文件名。
-entity 表示这是基于实体的分配。SDC文件应用于设计实体的每个实例。实例层次结构路径隐式应用于搜索dni::get_* (get_cellsget_pinsget_portsget_nets)命令的pattern参数。
[-no_sdc_promotion] 仅适用于-entity标志的可选参数。对于基于实体的约束,[-no_sdc_promotion]参数删除了实例层次结构路径的默认行为,即默认隐含在网表搜索命令中,从而允许您控制在网表对象搜索中需要应用到实例层次结构路径的单个命令。使用get_entity_current_instance Tcl命令获取实体的当前实例层次结构路径。例如:
set_false_path -from [get_pins [get_entity_current_instance]|ff_src|clk] \
-to [get_pins [get_entity_current_instance]|ff_dst|d]]

基于实体的SDC-on-RTL约束示例

此外,这些基于实体的SDC-on-RTL约束提供了灵活性。您可以在实现阶段引入其他SDC约束来使其增强或将其覆盖。以下示例显示了如何在包含两个IOPLL实例的设计上使用基于实体的SDC约束为综合后时序分析建立逻辑约束:

图 51. 具有两个IOPLL实例的示例设计

在这个简单的设计示例中,观察iopll_1iopll_2实体。这些实体内部还有其他层次结构。下图描绘了iopll_1的层次结构:

图 52.  iopll_1模块内部层次结构
  1. 使用RTL_SDC_FILE参数将初始SDC-on-RTL约束应用于整个设计。
    set_global_assignment -name RTL_SDC_FILE test.sdc
  2. 使用由参数-entity-library补码的RTL_SDC_FILE来定义特定SDC-on-RTL约束文件从而以每个IOPLL实体为目标。
    set_global_assignment -name RTL_SDC_FILE clock_generator.sdc  -entity "iopll_1" -library "iopll_1"
    set_global_assignment -name RTL_SDC_FILE clock_generator.sdc  -entity "iopll_2" -library "iopll_2”
  3. 定义对IOPLL模块的约束。
    注: 在设计的初始阶段生成RTL网表时,可能还不完全了解PLL的内部连接。因此,应在模块边缘处应用这些约束,特别是在IOPLL端口处使用get_ports (或get_pins <port_name> ) Tcl命令来处理模块输入和输出。连同其他约束一起使用,有助于创建和传播从传入参考时钟生成的输出时钟。最初不需要时钟源和目标之间的RTL网表中存在实际际连接来应用早期时序约束。但是,Timing Analyzer将发布关于连接缺失的告警并继续运行。
    # clock_generator.sdc
    # get the name of the current instance to generate a name
    set current_entity_instance [get_entity_current_instance]
     
    # Note: Do not specify the -master_clock if you want STA to 
    #       use the source to determine the master clock name.
    create_generated_clock -divide_by 1 -source [get_ports refclk] [get_ports outclk_0] -name ${current_entity_instance}_outclk_0
    create_generated_clock -divide_by 2 -source [get_ports refclk] [get_ports outclk_1] -name ${current_entity_instance}_outclk_1

    Timing Analyzer报告中显示的时钟,如下所示:

    图 53. 综合后(Post-Synthesis)时钟报告

    利用SDC-on-RTL范围界定功能生成针对 RTL节点的时序约束非常有利,这些约束可在时序分析的早期阶段应用。即便如此,通过基于实体的SDC-on-RTL文件定义的约束仍然可以在实现阶段进行调整、替换或补充,此时物理约束开始发挥作用,从而可允许您根据需要定位内部节点,以实现准确的时序建模。

Tcl命令

SDC命令集模型与行业标准SDC密切相关。特别是dni::get_ports命令可以查询非扁平化设计网表上的分层端口。此行为不同于现有的Timing Analyzer get_ports命令,具体体现为可以在综合后设计中查询顶层端口。

在基于实体的SDC-on-RTL文件的上下文中使用时,dni::get_ports命令,例如,[dni::get_ports refclk]用于在实例化RTL的当前实例上下文中搜索端口。为了避免dni::get_ports命令中当前实例的隐式前缀,请在需要实体实例层次结构路径的地方使用-no_sdc_promotion选项以及SDC文件中的dni::get_entity_current_instance命令。