UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

cancel
Showing results for 
Search instead for 
Did you mean: 

Vivado Incremental Synthesis Flow

Moderator
Moderator
6 0 424

Starting in Vivado 2019.1, the Vivado Synthesis engine supports Incremental Flow. This enables users to reduce overall synthesis runtime when the design changes are small.

This flow can be enabled using the Vivado IDE and also by using Tcl commands for batch mode. Please refer to (UG901) for more details on the flow.

 

Before we start talking about Incremental Synthesis, let's discuss a few important concepts in order to understand the flow better.

  1. Parallel Synthesis:

In order to improve overall runtime of the design, Vivado synthesis launches parallel processes if the design is large enough and can benefit from the parallel flow.

The parallel flow partitions the design into smaller 'RTL Partitions' which are processed independently by parallel processes.

Vivado Synthesis will decide to use parallel flow only if the design size is large enough. There should be at least 5 RTL Partitions of size greater than 10K instances.

 

To check whether the tool has used parallel flow or not, you can look for a "Multithreading enabled for synth_design…" message in the Synthesis log.

The message below confirms that Synthesis was done using parallel flow and that the design is compatible for an Incremental Synthesis Run:

"INFO: [Synth 8-5580] Multithreading enabled for synth_design using a maximum of 4 processes."

 

  1. RTL Partitions:

Vivado Synthesis will partition a big design based on instances into a number of partitions to enable synthesis in parallel flow.

Here is a snapshot of how the tool reports partitions in the Vivado Synthesis log file:

Report RTL Partitions:

+------+----------------------------+------------+----------+

|      |RTL Partition          |Replication |Instances |

+------+----------------------------+------------+----------+

|1     |Partition_name1        |           1|     31536|

|2     |Partition_name2        |           1|     21130|

|3     |Partition_name3        |           1|     18061|

……..

……..

If the design qualifies for parallel synthesis, the tool writes all of the partitions to the .runs/synth_1/runme.log file.

For an incremental run, these partitions help the tool to identify which partitions have changed and need to be resynthesized, and tracks which partitions are intact (to preserve them).

 

Note: Parallel Synthesis in the reference run is a requirement for Incremental Synthesis. If 50% or more of the partitions are changed then the tool will use the default flow instead of the Incremental Flow.

 

Here is a flow level description of Incremental Synthesis, where the left side shows the input set and generated output files of the incremental flow, and the right side shows the respective commands.

Please refer to (UG901) for more detailed project level and non-project level flows.

flow.png

Key Points for the Revised Design:

There should be NO top-level changes in the revised design.

Global Synthesis Settings which are used with the initial "synth_design" command should be exactly the same for the revised flow.

If tool level changes are required at lower levels of hierarchy, then use the BLOCK_SYNTH property on that boundary. Refer to (UG901) for more details on the BLOCK_SYNTH flow.

In cases where more than 50% of the design has changed (changed partitions), then the tool will use default synthesis instead of using incremental synthesis.

 

Project Flow Incremental Synthesis Run Example:

To start with the Incremental Synthesis Flow, when you synthesize the design initially, make sure that the "Write Incremental Synthesis" option is checked to write an incremental checkpoint for the incremental run.

Please use the 'Synthesis Settings' window to set this option:

1.png

After launching synthesis, please check the log file to confirm whether parallel synthesis was used or not.

Look for INFO: Synth 8-5580 in the synthesis log file.

2.png

Also, you can check the 'RTL Partitions' details printed in the log file as below:

3.png

At the end of the log file, you can check the total time taken by the synthesis run.

4.png

Once synthesis is complete, you can save the generated checkpoint file to use for the incremental flow or you can use the tool option “Automatically use the checkpoint from the previous run”.

You can now modify the design/RTL.


Here is a simple example where I have added two registers into the data path.
5.png

the screen capture below shows an example of referring an incremental checkpoint for the incremental run.

6.png

To confirm whether the tool read the incremental checkpoint or not, check for "Command: read_checkpoint -incremental ./top.dcp" in the generated synthesis log file.

 

The tool will analyze the changed and unchanged design to report a summary which can help users to understand the changes and the amount of resynthesis required for the design.

Here is an example of an "Incremental Synthesis Summary Report":

7.png

Details of Change Summary:

  1. Module name: The module where the RTL is changed inside the design partition. Please note that there could be more than one module under a partition.
  2. Replication: Total number of instantiations of the mentioned module (in this case "rtlRam”). The replication number depends on the number of direct instantiations.

For example (see the below screen capture), ‘rtlRam’ is instantiated by ‘usbf_top’ only once (hence Replication = 1) even when usbf_top is called twice.

8.png

  1. Instances: Number of cells/primitives under ‘rtlRam’ at the time of pre-elaboration phase. This number can change after the elaboration and the post-synthesis phase.
  2. Changed %: RTL changed(66) / Total unchanged design(801353) * 100 = 0.008%
  3. Full Design Size: Total number of cells in the entire design (including changed and unchanged design)
  4. Resynthesis Design Size: Please note that if there is any change in a module which belongs to a partition then the whole partition will be resynthesized by the tool. In this case, the changed partition size is 30279 which is called twice in the design and hence the Resynthesis Design Size number is ~60555.

9.png

Also, the tool will resynthesize those partitions where the optimizations were propagated and the Resynthesis Design Size number can vary accordingly.

   7. Re-synthesis Design Size: Number of cells which are resynthesized = 60555/801353 * 100 = 7.55%

As you can see in the below synthesis log snapshot, the runtime is only 1 minute 35 seconds after incremental flow as compared to the previous default synthesis runtime of 3 minutes 28 seconds.

10.png

Incremental Synthesis is a very powerful feature when the design changes are small. Please feel free to use this feature and share your feedback with us. Thanks for reading.