Setting a Block-Level Flow - 2023.1 English

Vivado Design Suite User Guide: Synthesis (UG901)

Document ID
UG901
Release Date
2023-06-09
Version
2023.1 English

To set a Block-Level Synthesis flow (using the BLOCK_SYNTH property), you enter a Tcl property in the XDC file only. The command syntax is, as follows:

set_property BLOCK_SYNTH.<option name> <value> [get_cells <instance_name>]

Where:

  • <option_name> is the option that you want to set.
  • <value> is the value you assign to that option.
  • <instance_name> is the hierarchical instance on which to set the option.

For example:

set_property BLOCK_SYNTH.MAX_LUT_INPUT 4 [get_cells fftEngine]

Set the property to an instance name, and not on an entity or module name. By using instance names, the Vivado synthesis tool is able to have more flexibility when there are modules/entities that are instantiated multiple times. In the provided example, the fftEngine instance is being set, so there are no LUT5 or LUT6 primitives.

Note: By setting a BLOCK_SYNTH on an instance, you affect that instance and everything below that instance. For example, if fftEngine had other modules instantiated within it, those modules would also not have any LUT5s or LUT6s primitives.
Note: In addition to affecting this instance, the BLOCK_SYNTH property also causes the hierarchy of this instance to be hardened. Be careful with this, especially if this hierarchy contains I/O buffers or is inferring input/output buffers.

When you put a BLOCK_SYNTH property on an instance, the instance gets that value for that specific option; all other options use the default values.

Multiple BLOCK_SYNTH properties can be set on the same instance to try out different combinations. For example, the following keeps equivalent registers, disables the FSM inference, and uses the AlternateRoutability strategy:

set_property BLOCK_SYNTH.STRATEGY {ALTERNATE_ROUTABILITY} [get_cells mod_inst]
set_property BLOCK_SYNTH.KEEP_EQUIVALENT_REGISTER 1 [get_cells mod_inst]
set_property BLOCK_SYNTH.FSM_EXTRACTION {OFF} [get_cells mod_inst]

To prevent impacting instances under the instance that require a different property setting, you can nest BLOCK_SYNTH properties on multiple levels. If you only want this on one particular level, you can set it on that level, and on the subsequent levels, you can set the default values back, using the command as follows:

set_property BLOCK_SYNTH.MAX_LUT_INPUT 6 [get_cells fftEngine/newlevel]

If the new level is the only hierarchy under fftEngine, this command ensures that only fftEngine gets the MAX_LUT_INPUT = 4 property. You can also put an entirely different set of options on this level as well, and not go back to the default.

Note: When performing the block level flow, the tool keeps this design in a top-down mode meaning that the full design goes through synthesis. For the instance in question, Vivado synthesis preserves the hierarchy to ensure that the logic of that level does not blur and stays within that level. This could have a potential effect on QoR. For this reason, be careful when setting BLOCK_LEVEL properties. Only set them on instances you know need them.