Quartus® Prime Pro Edition User Guide: Timing Analyzer

ID 683243
Date 9/30/2024
Public
Document Table of Contents

2.3.5.2.1. Entity-Bound SDC Constraint Scope

The entity-bound SDC approach offers diverse scoping possibilities for your constraints, each dictating the extent of their influence.
Table 10.  Entity-bound Constraint Scope
Constraint Scope Type Features To Enable Instance-bound Scoping
Automatic
  • Default mode applied to entity-bound SDC files defined in the Quartus® Prime Pro Edition GUI.
  • Under automatic scoping, constraints apply to every instance of the assigned entity across the project.
  • Each result from any get command (for example, get_pins, get_ports, and so on) in the SDC file is prepended with the instance's path.
  • All get commands are confined to the target elements within the bound instance associated with the SDC file.
Default mode for SDC_ENTITY_FILE. No additional steps required.
Manual
  • Configurable only by .qsf assignment.
  • The -no_sdc_promotion setting disables automatic scoping, necessitating full hierarchical path for targeting nodes.
  • Allows the flexibility to target nodes beyond entity boundaries.
  • The get_current_instance command specifies the top-level path to the current instance, allowing you to merge filters targeting elements in the current instance with commands addressing those beyond entity boundaries.
Use -no_sdc_promotion. Append each collection filter with get_current_instance to target nodes within the entity boundaries.

For example:

get_registers [get_current_instance]|reg[*]
Disabled
  • Configurable only by .qsf assignment.
  • -no_sdc_promotion and the -no_auto_inst_discovery arguments together disable scoping, treating an entity-bound SDC as a global SDC file. The SDC file is read only once for the entire compilation instead of processing repeatedly for each instance it is linked to.
  • This mode is ideal when bundling an SDC with an entity destined for export as a qdb file, while preserving the capability for SDC's collection filters to specify global, top-level paths in their get commands.
Use -no_sdc_promotion and -no_auto_inst_discovery arguments.

When you define entity-bound SDC files either through the GUI or via .qsf assignments (excluding the -no_sdc_promotion and -no_auto_inst_discovery arguments), the constraints use automatic scoping. Automatic scoping involves prepending filters with the instance's path. To provide clarity, the following table illustrates how paths are interpreted in various Tcl commands due to the automatic scoping of constraints:

Table 11.  Automatic Scope of Constraints
Constraint Example Auto-Scope Constraint Interpretation for Instance X|Y
set_false_path -from [get_keepers a] set_false_path -from [get_keepers X|Y|a]
set_false_path -from [get_registers a] -to [get_registers b] set_false_path -from [get_registers X|Y|a] -to [get_registers X|Y|b]
set_false_path –from [get_clocks clk_1] –to [get_clocks clk_2] set_false_path –from [get_clocks clk_1] –to [get_clocks clk_2]
set_max_delay –from [get_ports in] -to [get_registers A] 2.0 set_max_delay –from [get_ports in] -to [get_registers X|Y|A] 2.0
get_ports *
Note: get_ports in conventional entity SDC's always refers to top level ports, and cannot be used to refer to boundary ports on an entity, as boundary ports do not exist in a flattened netlist.
get_ports *
get_clocks * get_clocks *
get_ports a get_ports a
get_clocks a get_clocks a

When you disable automatic scoping through .qsf assignments, including the use of the -no_sdc_promotion argument, you must manually prepend the top-level path to achieve the same behavior as automatic scoping. To simplify this process, use the -get_current_instance command to return the top-level path of the current instance. The following table illustrates how paths are interpreted when the -get_current_instance command is employed to add the top-level path to certain Tcl commands:

Table 12.  Manual Scope of Constraints
Constraint Example Manual Scope Constraint Interpretation
set_false_path –from [get_current_instance]|d\ 
     –to [get_current_instance]|e
set_false_path –from i1|inner|d –to i1|inner|e 
set_false_path –from i2|inner|d –to i2|inner|e 
set_false_path –from i3|d –to i3|e
create_generated_clock –divide_by 2 –source \
   [get_ports inclk] –name \
   [get_current_instance]_divclk \
   [get_current_instance]|div 
set_multicycle_path –from [get_current_instance]|a \ 
   –to [get_current_instance]|b 2 
create_generated_clock –divide_by 2 –source \ 
    [get_ports inclk] –name “i1_divclk” i1|div 
set_multicycle_path –from i1|a –to i1|b 2 \ 
    create_generated_clock –divide_by 2 –source \ 
    [get_ports inclk] –name “i2_divclk” i2|div 
set_multicycle_path –from i2|a –to i2|b 2