Vivado Design Suite Tutorial - Implementation (UG986)
Vivado Design Suite Tutorial - Implementation (UG986)
Vivado Design Suite Tutorial - Implementation (UG986)
Implementation
UG986 (v2018.2) June 6, 2018
Implementation www.xilinx.com 1
UG986 (v2018.2) June 6, 2018
Revision History
The following table shows the revision history for this document.
IMPORTANT: This tutorial requires the use of the Kintex®-7 and Kintex UltraScale™ family
of devices. You will need to update your Vivado® Design Suite tools installation if you do
not have this device family installed. Refer to the Vivado Design Suite User Guide: Release
Notes, Installation, and Licensing (UG973) for more information on Adding Design Tools or
Devices.
Overview
This tutorial includes four labs that demonstrate different features of the Xilinx® Vivado® Design Suite
implementation tool:
• Lab 1 demonstrates using implementation strategies to meet different design objectives.
• Lab 2 demonstrates the use of the incremental compile feature after making a small design
change.
• Lab 3 demonstrates the use of manual placement and routing, and duplicated routing, to fine-
tune the timing on the design.
• Lab 4 demonstrates the use of the Vivado ECO to make quick changes to your design post
implementation.
Vivado implementation includes all steps necessary to place and route the netlist onto the FPGA device
resources, while meeting the logical, physical, and timing constraints of a design.
VIDEO: You can also learn more about implementing the design by viewing the following
Quick Take videos:
• Vivado Quick Take Video: Implementing the Design
• Vivado Quick Take Video: Using Incremental Implementation in Vivado
TRAINING: Xilinx provides training courses that can help you learn more about the
concepts presented in this document. Use these links to explore related courses:
• Designing FPGAs Using the Vivado Design Suite 1
• Designing FPGAs Using the Vivado Design Suite 2
• Designing FPGAs Using the Vivado Design Suite 3
• Designing FPGAs Using the Vivado Design Suite 4
You can also extract the provided zip file, at any time, to write the tutorial files to your local directory, or
to restore the files to their starting condition.
Extract the zip file contents from the software installation into any write-accessible location.
<Vivado_install_area>/Vivado/<version>/examples/Vivado_Tutorial.zip
Introduction
In this lab, you will learn how to use implementation strategies with design runs by creating multiple
implementation runs employing different strategies, and comparing the results. You will use the CPU
Netlist example design that is included in the Vivado® IDE.
4. In the Select Project Template screen, choose the CPU (Synthesized) project and click Next.
5. In the Project Name screen, specify the following, and click Next:
o Project name: project_cpu_netlist
o Project location: <Project_Dir>
6. In the Default Part screen, select the xc7k70tfbg676-2 part and click Next.
7. In the New Project Summary screen, review the project details, and click Finish.
The Configure Implementation Runs screen now displays three new implementations along with the
strategy you selected for each, as shown in the below figure.
3. In the Launch Runs dialog box, select Launch runs on local host and Number of jobs: 2, as shown
below.
4. Click OK.
Two runs launch simultaneously, with the remaining runs going into a queue.
When the active run, impl_1, completes, examine the Project Summary. The Project Summary
reflects the status and the results of the active run. When the active run (impl_1) is complete, the
Implementation Completed dialog box opens.
5. Click Cancel to close the dialog box.
Note: The implementation utilization results display as a bar graph at the bottom of the summary
page (you might need to scroll down), as shown in the following figure.
When you open an implementation run, the report_power and the report_timing_summary results
are automatically opened for the run in a new tab in the Results Window.
6. When all the implementation runs are complete, select the Design Runs tab.
7. Right-click the impl_3 run in the Design Runs window, and select Make Active from the popup
menu.
The Project Summary now displays the status and results of the new active run, impl_3.
8. Compare the results for the completed runs in the Design Runs window, as shown in Figure 13.
• The Flow_RuntimeOptimized strategy in impl_4 completed in the least amount of time, as you
can see in the Elapsed time column.
• The WNS column shows that all runs met the timing requirements.
2. On line 2, change the period of the create_clock constraint from 10 ns to 7.35 ns.
The new constraint should read as follows:
create_clock -period 7.35 -name sysClk [get_ports sysClk]
3. Save the changes by clicking the Save File button in the sidebar menu of the text editor.
Note: Saving the constraints file changes the status of all runs using that constraints file from
“Complete” to “Out-of-date,” as seen in the Design Runs window.
4. In the Design Runs window, select all runs and click the Reset Runs button.
5. In the Reset Runs dialog box, click Reset.
This directs the Vivado Design Suite to remove all files associated with the selected runs from the
project directory. The status of all runs changes from “Out-of-date” to “Not started.”
6. With all runs selected in the Design Runs window, click the Launch Runs button.
The Launch Selected Runs window opens.
TIP: You can also launch runs without resetting them first. If the runs are out of date, the Reset
Runs dialog box displays. In this dialog box, you can reset the runs before they are launched.
7. Select Launch runs on local host and Number of jobs: 2 and click OK.
When the active run (impl_3) completes, the Implementation Completed dialog box opens.
8. Click Cancel to close the dialog box.
9. Compare the Elapsed time for each run in the Design Runs window, as seen in the following figure.
• Notice that the impl_2 run, using the Performance_Explore strategy has passed timing with
positive slack (WNS), but also took the most time to complete.
• Only one other run passed timing.
Conclusion
In this lab, you learned how to define multiple implementation runs to employ different strategies to
resolve timing. You have seen how some strategies trade performance for results, and learned how to
use those strategies in a more challenging design.
This concludes Lab #1. If you plan to continue directly to Lab #2, keep the Vivado IDE open and close
the current project. If you do not plan to continue, you can exit the Vivado Design Suite.
Introduction
Incremental Compile is an advanced design flow to use on designs that are nearing completion, where
small changes are required.
After resynthesizing a design with minor changes, the incremental compile flow can speed up
placement and routing by reusing results from a prior design iteration. This can help you preserve
timing closure while allowing you to quickly implement incremental changes to the design.
In this lab, you use the BFT example design that is included in the Vivado® Design Suite, to learn how to
use the incremental compile flow. Refer to the Vivado Design Suite User Guide: Implementation (UG904)
to learn more about Incremental Compile.
4. In the Select Project Template screen, select the BFT (Small RTL project) design, and click Next.
5. In the Project Name screen, specify the following, and click Next:
• Project name: project_bft_core_hdl
• Project location: <Project_Dir>
6. In the Default Part screen, select the xc7k70tfbg484-2 part, and click Next.
7. In the New Project Summary screen, review the project details, and click Finish.
3. After implementation finishes, the Implementation Complete dialog box opens. Click Cancel to
dismiss the dialog box.
In a project-based design, the Vivado Design Suite saves intermediate implementation results as
design checkpoints in the implementation runs directory. You will use one of the saved design
checkpoints from the implementation in the incremental compile flow.
4. In the Design Runs window, right click on impl_1 and select Open Run Directory from the popup
menu.
This opens the run directory in a file browser as seen in the figure below. The run directory contains
the routed checkpoint (bft_routed.dcp) to be used later for the incremental compile flow.
The location of the implementation run directory is a property of the run.
5. Get the location of the current run directory in the Tcl Console by typing:
get_property DIRECTORY [current_run]
This returns the path to the current run directory that contains the design checkpoint. You can use
this Tcl command, and the DIRECTORY property, to locate the DCP files needed for the incremental
compile flow.
Implementation www.xilinx.com Send Feedback
28
UG986 (v2018.2) June 6, 2018
Lab 2: Using Incremental Compile
TIP: When you re-run implementation the previous results are deleted. Save the
intermediate implementation results to a new directory or create a new implementation run
for your incremental compile to preserve the reference implementation run directory.
3. The Configure Synthesis Runs screen opens. Accept the default run options by clicking Next.
4. The Configure Implementation Runs screen opens, as shown in the figure below. Enable the Make
Active check box, and click Next.
5. From the Launch Options window, select Do not launch now and click Next.
6. In the Create New Runs Summary screen, click Finish to create the new runs.
The Design Runs window displays the new active runs in bold.
2. Go to line 45 of the bft.vhdl file and change the error port from an output to a buffer, as follows:
error : buffer std_logic
3. Go to line 331 of the bft.vhdl file and modify the VHDL code, as follows:
From To
4. Save the changes by clicking the Save File button in the sidebar menu of the text editor.
As you can see in the following figure, changing the design source files also changes the run status
for finished runs from Complete to Out-of-date.
5. In the Flow Navigator, click Run Synthesis to synthesize the updated netlist for the design using the
active run, synth_2.
6. When the Synthesis Completed dialog box opens, click Cancel to close the dialog box.
2. Click the Browse button in the Set Incremental Compile dialog box, and browse to the
./project_bft_core_hdl.runs/impl_1 directory.
4. Click OK.
This is stored in the INCREMENTAL_CHECKPOINT property of the selected run. Setting this
property tells the Vivado Design Suite to run the incremental compile flow during implementation.
5. You can check this property on the current run using the following Tcl command:
get_property INCREMENTAL_CHECKPOINT [current_run]
TIP: To disable incremental compile for the current run, clear the
INCREMENTAL_CHECKPOINT property. This can be done using the Set Incremental
Compile dialog box, or by editing the property directly through the Properties window of
the design run, or through the reset_property command.
The runtime for the flows can be compared in the Elapsed column of the Design Runs window. The
time reported here includes:
o The extra time taken to read the incremental checkpoint and examine it for reuse
o The time saved in the placement and routing phases.
Note: In this case the numbers are approximately equal, but this is an extremely small design. The
advantages of the incremental compile flow are greater with larger, more complex designs.
8. Select the Reports tab in the Results Window area and double-click the Incremental Reuse Report
in the Route Design section, as shown in the following figure.
The Incremental Reuse Report opens in the Vivado IDE text editor, as displayed in Figure 36. This
report shows the percentage of reused Cells, Ports, and Nets. A higher percentage indicates more
effective reuse of placement and routing from the incremental checkpoint.
So far, you have modified the generation of the readEgressFifo so that the signal is zero when the
error signal is non-zero. This is a small change to the design so you would expect the reuse to be
high. Now examine the Incremental Reuse Report to confirm this is the case.
In the report you can confirm that a high percentage of cells, nets and ports are fully reused.
9. Select the Reports tab in the Results Window area and double-click the Incremental Reuse Report
in the Route Design section.
Figure 37: Reference DCP and Comparison with Reference Section of Incremental Reuse Report
In the Reference Checkpoint Information section you can see information reported on the
reference checkpoint. The WNS reported here is the target WNS of the incremental run. You can
confirm this by searching the log file for place_design. Directly after place_design, the
following is reported. In the Comparison with Reference Run section you can see how the
runtime and WNS at each stage of the flow compares.
Figure 38: WNS Reported in place_design is the Target WNS for Incremental Run
In the Non Reuse Information section (shown below) details are given on why cells, nets, or
ports were not reused.
Conclusion
This concludes Lab #2. You can close the current project and exit the Vivado IDE.
In this lab, you learned how to run the Incremental Compile flow, using a checkpoint from a previously
implemented design. You also examined the similarity between a reference design checkpoint and the
current design by examining the Incremental Reuse Report.
Introduction
In this lab, you learn how to use the Vivado® IDE to assign routing to nets for precisely controlling the
timing of a critical portion of the design.
• You will use the BFT HDL example design that is included in the Vivado Design Suite.
• To illustrate the manual routing feature, you will precisely control the skew within the output
bus of the design, wbOutputData.
4. In the Select Project Template screen, select the BFT (Small RTL project) design, and click Next.
5. In the Project Name screen, specify the following, and click Next:
o Project name: project_bft_core
o Project location: <Project_Dir>
6. In the Default Part screen, select the xc7k70tfbg484-2 as your Default Part, and click Next.
7. In the New Project Summary screen, review the project details, and click Finish.
3. In the Implementation Completed dialog box, select Open Implemented Design and click OK.
The Device window opens, displaying the placement results.
4. Click the Routing Resources button to view the detailed routing resources in the Device
window.
You can use the Report Datasheet command to analyze the current timing of members of the output
bus, wbOutputData. The Report Datasheet command lets you analyze the timing of a group of ports
with respect to a specific reference port.
1. From the main menu, select Reports > Timing > Report Datasheet.
2. Select the Groups tab in the Report Datasheet dialog box, as seen in the following figure, and enter
the following:
o Reference: [get_ports {wbOutputData[0]}]
o Ports: [get_ports {wbOutputData[*]}]
3. Click OK.
In this case, you are examining the timing at the ports carrying the wbOutputData bus, relative to
the first bit of the bus, wbOutputData[0]. This allows you to quickly determine the relative timing
differences between the different bits of the bus.
4. Click the Maximize button to maximize the Timing - Datasheet window and expand the results.
5. Select the Max/Min Delays for Groups > Clocked by wbClk > wbOutputData[0] section, as seen in
the following figure.
You can see from the report that the timing skew across the wbOutputData bus varies by almost
500 ps. The goal is to minimize the skew across the bus to less than 100 ps.
6. Click the Restore button so you can simultaneously see the Device window and the Timing -
Datasheet results.
7. Click the hyperlink for the Max Delay of the source wbOutputData[27].
This highlights the path in the Device window that is currently open.
Note: Make sure that the Autofit Selection is highlighted in the Device window so you can see the
entire path, as shown in the following figure.
8. In the Device window, right click on the highlighted path and select Schematic from the popup
menu.
This displays the schematic for the selected output data bus, as shown in Figure 52. From the
schematic, you can see that the output port is directly driven from a register through an output
buffer (OBUF).
If you can consistently control the placement of the register with respect to the output pins on the
bus and control the routing between registers and the outputs, you can minimize skew between the
members of the output bus.
Blue diamond markers show on the output ports, and red diamond markers show on the registers
feeding the outputs, as seen in the following figure.
Zooming out on the Device window displays a picture similar to Figure 53.
The outputs marked in blue are spread out along two banks on the left side starting with
wbOutputData[0] (on the bottom) and ending with wbOutputData[31] (at the top), while the
output registers marked in red are clustered close together on the right.
To look at all of the routing from the registers to the outputs, you can use the
highlight_objects Tcl command to highlight the nets.
11. Type the following command at the Tcl prompt:
highlight_objects -color yellow [get_nets -of [get_pins -of [get_cells\
wbOutputData_reg[*]] -filter DIRECTION==OUT]]
This highlights all the nets connected to the output pins of the wbOutputData_reg[*] registers
as shown in Figure 54.
In the Device window, you can see that there are various routing distances between the clustered
output registers and the distributed outputs pads of the bus. Consistently placing the output
registers in the slices next to each output port eliminates a majority of the variability in the clock-to-
out delay of the wbOutputData bus.
12. In the main toolbar, click the Unhighlight All button and the Unmark All button .
RECOMMENDED: Use a series of Tcl commands to place the output registers in the slices next to the
wbOutPutData bus output pads.
1. In the Device window click to disable Routing Resources and make sure AutoFit Selection
is still enabled on the sidebar menu.
This lets you see placed objects more clearly in the Device window, without the added details of the
routing.
2. Select the wbOutputData ports placed on the I/O blocks with the following Tcl command:
select_objects [get_ports wbOutputData*]
The Device window will show the selected ports highlighted in white, and zoom to fit the selection.
The view should be similar to Figure 55. By examining the device resources around the selected
ports, you can identify a range of placement Sites for the output registers.
3. Zoom into the Device window around the bottom selected output ports. The following figure shows
the results.
The bottom ports are the lowest bits of the output bus, starting with wbOutputData[0].
As seen in Figure 56, this port is placed on Package Pin Y21. Over to the right, where the Slice logic
contains the device resources needed to place the output registers, the Slice coordinates are X0Y36.
You will use that location as the starting placement for the 32 output registers,
wbOutputData_reg[31:0].
By scrolling or panning in the Device window, you can visually confirm that the highest output data
port, wbOutputData[31], is placed on Package Pin K22, and the registers to the right are in Slice
X0Y67.
Now that you have identified the placement resources needed for the output registers, you must
make sure they are available for placing the cells. You will do this by quickly unplacing the Slices to
clear any currently placed logic.
4. Unplace any cells currently assigned to the range of slices needed for the output registers,
SLICE_X0Y36 to SLICE_X0Y67, with the following Tcl command:
for {set i 0} {$i<32} {incr i} {
unplace_cell [get_cells -of [get_sites SLICE_X0Y[expr 36 + $i]]]
}
This command uses a FOR loop with an index counter (i) and a Tcl expression (36 + $i) to get
and unplace any cells found in the specified range of Slices. For more information on FOR loops and
other scripting suggestions, refer to the Vivado Design Suite User Guide: Using Tcl Scripting (UG894).
TIP: If there are no cells placed within the specified slices, you will see warning messages that
nothing has been unplaced. You can safely ignore these messages.
With the Slices cleared of any current logic cells, the needed resources are available for placing the
output registers. After placing those, you will also need to replace any logic that was unplaced in the
last step.
5. Place the output registers, wbOutputData_reg[31:0], in the specified Slice range with the
following command:
for {set i 0} {$i<32} {incr i} {
place_cell wbOutputData_reg[$i] SLICE_X0Y[expr 36 + $i]/AFF
}
6. Now, place any remaining unplaced cells with the following command:
place_design
10. Click the Routing Resources button to view the detailed routing resources in the Device
window.
11. Mark the output ports and registers again, and re-highlight the routing between them using the
following Tcl commands:
mark_objects -color blue [get_ports wbOutputData[*]]
mark_objects -color red [get_cells wbOutputData_reg[*]]
highlight_objects -color yellow [get_nets -of [get_pins -of [get_cells\
wbOutputData_reg[*]] -filter DIRECTION==OUT]]
TIP: Because you have entered these commands before, you can copy them from the
journal file (vivado.jou) to avoid typing them again.
12. In the Device window, zoom into some of the marked output ports.
13. Select the nets connecting to them.
TIP: You can also select the nets in the Netlist window, and they will be cross-selected in
the Device window.
In the Device window, as seen in Figure 57, you can see that all output registers are now placed
equidistant from their associated outputs, and the routing path is very similar for all the nets from
output register to output. This results in clock-to-out times that are closely matched between the
outputs.
14. Run the Reports > Timing > Report Datasheet command again.
The Report Datasheet dialog box is populated with settings from the last time you ran it:
o Reference: [get_ports {wbOutputData[0]}]
o Ports: [get_ports {wbOutputData[*]}]
15. In the Report Datasheet results, select the Max/Min Delays for Groups > Clocked by wbClk >
wbOutputData[0] section.
Examining the results shown in Figure 58, the timing skew is closely matched within both the lower
bits, wbOutputData[0-13], and the upper bits, wbOutputData[14-31], of the output bus.
While the overall skew is reduced, it is still over 200 ps between the upper and lower bits.
With the improved placement, the skew is now a result of the output ports and registers spanning
two clock regions, X0Y0 and X0Y1, which introduces clock network skew. Looking at the
wbOutputData bus, notice that the Max delay is greater on the lower bits than it is on the upper
bits. To reduce the skew, add delay to the upper bits.
You can eliminate some of the skew using a BUFMR/BUFR combination instead of a BUFG, to clock
the output registers. However, for this tutorial, you will use manual routing to add delay from the
output registers clocked by the BUFG to the output pins for the upper bits, wbOutputData[14-
31], to further reduce the clock-to-out variability within the bus.
can use a Tcl FOR loop to report the existing routing on those nets, to let you examine them more
closely.
1. In the Tcl Console, type the following command:
for {set i 14} {$i<32} {incr i} {
puts "$i [get_property ROUTE [get_nets -of [get_pins -of \
[get_cells wbOutputData_reg[$i]] -filter DIRECTION==OUT]]]"
}
This For loop initializes the index to 14 (set i 14), and gets the ROUTE property to return the
details of the route on each selected net.
The Tcl Console returns the net index followed by relative route information for each net:
14 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
15 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
16 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
17 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
18 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
19 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
20 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
21 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
22 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
23 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
24 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
25 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
26 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
27 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
28 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
29 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
30 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC0_D1 LIOI_OLOGIC0_OQ LIOI_O0 }
31 { CLBLL_LL_AQ CLBLL_LOGIC_OUTS4 WW2BEG0 IMUX_L34 IOI_OLOGIC1_D1 LIOI_OLOGIC1_OQ LIOI_O1 }
From the returned ROUTE properties, note that the nets are routed from the output registers using
identical resources, up to node IMUX_L34. Beyond that, the Vivado router uses different nodes for
odd and even index nets to complete the connection to the die pad.
By reusing routing paths, you can manually route one net with an even index, like
wbOutputData_OBUF[14], and one net with an odd index, such as wbOutputData_OBUF[15],
and copy the routing to all other even and odd index nets in the group.
2. In the Tcl Console, select the first net with the following command:
select_objects [get_nets -of [get_pins -of \
[get_cells wbOutputData_reg[14]] -filter DIRECTION==OUT]]
3. In the Device window, right-click to open the popup menu and select Unroute.
4. Click Yes in the Confirm Unroute dialog box.
The Device window displays the unrouted net as a fly-line between the register and the output pad.
5. Click the Maximize button to maximize the Device window.
6. Right-click the net and select Enter Assign Routing Mode.
The Target Load Cell Pin dialog box opens, as seen in Figure 59, to let you select a load pin to route
to or from. In this case, only one load pin populates: wbOutputData_OBUF[14]_inst.
The Routing Assignment window includes the following sections, as seen in Figure 60:
o Net: Displays the current net being routed.
o Options: Are hidden by default, and can be displayed by clicking Options.
− Number of Hops: Defines how many programmable interconnect points, or PIPs, to look
at when reporting the available neighbors. The default is 1.
− Number of Neighbors: Limits the number of neighbors displayed for selection.
− Allow Overlap with Unfixed Nets: Enables or disables a loose style of routing which can
create conflicts that must be later resolved. The default is ON.
o Neighbor Nodes: Lists the available neighbor PIPs/nodes to choose from when defining the
path of the route.
o Assigned Nodes: Shows the currently assigned nodes in the route path of the selected net.
o Assign Routing: Assigns the currently defined path in the Routing Assignment window as
the route path for the selected net.
o Exit Mode: Closes the Routing Assignment window.
As you can see in Figure 60, the Assigned Nodes section displays six currently assigned nodes. The
Vivado router automatically assigns a node if it is the only neighbor of a selected node and there
are no alternatives to the assigned nodes for the route. In the Device window, the assigned nodes
appear as a partial route in orange.
In the currently selected net, wbOutputData_OBUF[14], nodes CLBLL_LL_AQ and
CLBLL_LOGIC_OUTS4 are already assigned because they are the only neighbor nodes available to
the output register, wbOutputData_reg[14]. The nodes IMUX_L34, IOI_OLOGIC0_D1,
LIOI_OLOGIC0_OQ, and LIOI_O0 are also already assigned because they are the only neighbor
nodes available to the destination, the output buffer (OBUF).
A gap exists between the two routed portions of the path where there are multiple neighbors to
choose from when defining a route. This gap is where you will use manual routing to complete the
path and add the needed delay to balance the clock skew.
You can route the gap by selecting a node on either side of the gap and then choosing the
neighbor node to assign the route to. Selecting the node displays possible neighbor nodes in the
Neighbor Nodes section of the Routing Assignment window and appear as dashed white lines in
the Device window.
TIP: The number of reachable neighbor nodes displayed depends on the number of hops defined
in the Options.
8. Under the Assigned Nodes section, select the CLBLL_LOGIC_OUTS4 node before the gap.
The available neighbors appear as shown in the following figure.
To add delay to compensate for the clock skew, select a neighbor node that provides a slight detour
over the more direct route previously chosen by the router.
11. In Neighbor Nodes, select and assign nodes WR1BEG1, and then WR1BEG2.
TIP: In case you assigned the wrong node, you can select the node from the Assigned Nodes
list, right click, and select Remove on the context menu.
You can turn off the Auto Fit Selection in the Device window if you would like to stay at
the same zoom level.
The following figure shows the partially routed path using the selected nodes shown in orange. You
can use the automatic routing feature to fill the remaining gap.
12. Under the Assigned Nodes section of the Routing Assignment window, right-click the Net Gap,
and select Auto-Route, as shown in the following figure.
The Vivado router fills in the last small bit of the gap. With the route path fully defined, you can
assign the routing to commit the changes to the design.
13. Click Assign Routing at the bottom of the Routing Assignment window.
The Assign Routing dialog box opens, as seen in the following figure. This displays the list of
currently assigned nodes that define the route path. You can select any of the listed nodes,
highlighting it in the Device window. This lets you quickly review the route path prior to committing
it to the design.
After defining the manual route for the even index nets, the next step is to define the route path for
the odd index net, wbOutputData_OBUF[15], applying the same steps you just completed.
16. In the Tcl Console type the following to select the net:
select_objects [get_nets wbOutputData_OBUF[15]]
You routed the wbOutputData_OBUF[14] and wbOutputData_OBUF[15] nets with the detour
to add the needed delay. You can now run the Report Datasheet command again to examine the
timing for these nets with respect to the lower order bits of the bus.
18. Switch to the Timing Datasheet report window. Notice the information message in the banner of the
window indicating that the report is out of date because the design was modified.
19. In the Timing Datasheet report, click Rerun to update the report with the latest timing information.
20. Select Max/Min Delays for Groups > Clocked by wbClk > wbOutputData[0] to display the
timing info for the wbOutputData bus, as seen in Figure 66.
You can see from the report that the skew within the rerouted nets, wbOutputData[14] and
wbOutputData[15], more closely matches the timing of the lower bits of the output bus,
wbOutputData[13:0]. The skew is within the target of 100 ps of the reference pin
wbOutputData[0].
In Step 6, you copy the same route path to the remaining nets, wbOutputData_OBUF[31:16], to
tighten the timing of the whole wbOutputData bus.
3. Set a Tcl variable to store the list of nets to be routed, containing all high bit nets of the output data
bus, wbOutputData_OBUF[16:31]:
for {set i 16} {$i<32} {incr i} {
lappend routeNets [get_nets wbOutputData_OBUF[$i]]
}
The even and odd nets of the output data bus, as needed, now have the same routing paths, adding
delay to the high order bits. Run the route status report and the datasheet report to validate that
the design is as expected.
7. In the Tcl Console, type the following command:
report_route_status
TIP: Some routing errors might be reported if the routed design included nets that use some of
the nodes you have assigned to the FIXED_ROUTE properties of the manually routed nets.
Remember you enabled Allow Overlap with Unfixed Nets in the Routing Assignment window.
8. If any routing errors are reported, type the route_design command in the Tcl Console.
The nets with the FIXED_ROUTE property takes precedence over the auto-routed nets.
9. After route_design, repeat the report_route_status command to see the clean report.
10. Examine the output data bus in the Device window, as seen in the following figure:
• All nets from the output registers to the output pins for the upper bits 14-31 of the output bus
wbOutputData have identical fixed routing sections (shown as dashed lines).
• You do not need to fix the LOC and the BEL for the output registers. It was done by the
place_cell command in an earlier step.
Having routed all the upper bit nets, wbOutputData_OBUF[31:14], with the detour needed for
added delay, you can now re-examine the timing of output bus.
11. Select the Timing tab in the Results window area.
Notice the information message in the banner of the window indicating that the report is out of
date because timing data has been modified.
12. Click rerun to update the report with the latest timing information.
13. Select the Max/Min Delays for Groups > Clocked by wbClk > wbOutputData[0] section to
display the timing info for the wbOutputData bus.
As shown in Figure 68, the clock-to-out timing within all bits of output bus wbOutputData is now
closely matched to within 83 ps.
14. Save the constraints to write them to the target XDC, so that they apply every time you compile the
design.
15. Select File > Constraints > Save to save the placement constraints to the target constraint file,
bft_full.xdc, in the active constraint set, constrs_1.16.
The synthesis and implementation will go out-of-date since constraints were updated. You can force
the design to update by clicking on Details in tool bar, since new constraints are already applied.
Conclusion
In this lab, you did the following:
• Analyzed the clock skew on the output data bus using the Report Datasheet command.
• Used manual placement techniques to improve the timing of selected nets.
• Used the Assign Manual Routing Mode in the Vivado IDE to precisely control the routing of a
net.
• Used the FIXED_ROUTE property to copy the relative fixed routing among similar nets to
control the routing of the critical portion of the nets.
Introduction
In this lab, you will learn how to use the Vivado® Engineering Change Order (ECO) flow to modify your
design post implementation, implement the changes, run reports on the changed netlist, and generate
programming files.
For this lab, you will use the design file that is included with this guide and is targeted at the Kintex®
UltraScale® KCU105 Evaluation Platform. For instructions on locating the design files, see Locating
Design Files for Lab 4.
A block diagram of the design is shown in the following figure.
In this design, a mixed-mode clock manager (MMCM) is used to synthesize a 100 MHz clock from the
300 MHz clock provided by the board.
A 29-bit counter is used to divide the clock down further. The 4 most significant bits of the counter
form the count<3:0> signal that is 0-extended to 8 bits and drives the 8 on-board LEDs through an
8-bit 2-1 mux.
The count<3:0> signal is also squared using a multiplier, and the product drives the other 8 inputs of
the mux. A Toggle signal controls the mux select and either drives the LEDs (shown in the following
figure) with the counter value or the multiplier output.
A Pause signal allows you to stop the counter, and a Reset signal allows you to reset the design. The
Toggle, Pause, and Reset signals can either be controlled from on-board buttons shown in Figure 70
or a VIO in the Hardware Manager as shown in Figure 71. The VIO also allows you to observe the status
of the LEDs. The following figures show the location of the push-buttons and the LEDs on the KCU105
board and a Hardware Manager dashboard. These allow you to control the push button and observe
the LEDs through the VIO.
You can use the generated bitstream programming file to download your design into the target FPGA
device using the Hardware Manager. For more information, see the Vivado Design Suite User Guide:
Programming and Debugging (UG908).
TIP: For more information about different ways to connect to a hardware target, refer to
the Vivado Design Suite User Guide: Programming and Debugging (UG908).
3. In the Vivado Flow Navigator, under Program and Debug, click Program Device.
The Program Device dialog box opens.
Alternatively, you can use the VIO to control and observe the hardware.
If the following warning message appears, select one of the alternatives suggested in the message.
WARNING: [Labtools 27-1952] VIO hw_probe OUTPUT_VALUE properties for hw_vio(s)
[hw_vio_1] differ from output values in the VIO core(s).
Resolution:
To synchronize the hw_probes properties and the VIO core outputs choose one of
the following alternatives:
1) Execute the command 'Commit Output Values to VIO Core', to write down the
hw_probe values to the core.
2) Execute the command 'Refresh Input and Output Values from VIO Core', to
update the hw_probe properties with the core values.
3) First restore initial values in the core with the command 'Reset VIO Core
Outputs', and then execute the command 'Refresh Input and Output Values from VIO
Core'.
6. Select the hw_vios tab in the dashboard and click the Add button to add probes.
The Add Probes dialog box opens.
9. In the hw_vios dashboard, select count_out_OBUF[7:0], then right-click and select LED.
The Select LED Colors dialog box opens.
10. Select Red for the Low Value Color and Green for the High Value Color.
11. Click OK.
12. In the hw_vios dashboard, select pause_vio_out, reset_vio_out, and toggle_vio_out, then right-click
and select Active-High Button.
13. In the hw_vios dashboard, select vio_select and select Toggle Button.
Now that the VIO is set up, you are ready to analyze the design.
1. Toggle the vio_select button to control the hardware from the VIO.
2. Press the pause_vio_out button to pause the counter.
3. Press the toggle_vio_out button to select between the count and the multiplier result.
4. Press the reset_vio_out button to reset the counter.
To illustrate the capabilities of the ECO flow, you next change the functionality of the multiplier from
a square of count[3:0] to a multiply by two.
TIP: To make it easier to locate objects that are included in the ECO modifications, it helps to
mark or highlight the objects with different colors.
10. Zoom into the multiplier in the schematic window and select the in2[3:0] pins.
Alternatively, you can type the following command in the Tcl Console:
select_objects [get_pins my_mult_0/in2[*]]
11. Click the Disconnect Net button in the Edit section of the Vivado ECO Navigator. The net is
disconnected from the pins in the schematic.
The Tcl Console reproduces the disconnect_net command that you just executed in the ECO
Navigator. This is useful if you want to replay your ECO changes later by opening the original
checkpoint and sourcing a Tcl script with the ECO commands.
The Scratch Pad is populated with the 4 nets divClk_reg[28:25] that you disconnected and the
multiplier input pins my_mult_0/in2[3:0]. Note the following in the Scratch Pad:
• The Scratch Pad connectivity column (Con) shows a check mark next to the
divClk_reg[28:25] nets, indicating that they are still connected to the other multiplier
inputs.
• The my_mult_0/in2[3:0] pins do not show a check mark next to them because they no
longer have nets connected.
• The Place and Route (PnR) column is unchecked for everything, indicating that the
changes have not yet been implemented on the device.
12. In the Scratch Pad, select the {my_mult_0/in2[3], my_mult_0/in2[2], and my_mult_0/in2[0]} pins.
13. In the Edit section of the Vivado ECO Navigator, click Connect Net.
The Connect Net dialog box opens.
14. In the Connect Net dialog box, select <const0> from the GROUND section.
19. In the Connect Net dialog box, select <const1> from the POWER section.
The pin that you connected now shows check marks in the Connectivity column of the Scratch Pad.
When you observe the count signal on the LEDs, you only use 4 bits. The upper 4 bits are padded
with zeroes.
Now, you will use the ECO flow to observe counter bit 24 on LED 7. The first step is to analyze the
logic that drives count_out_reg[3].
23. From the Tcl Console, type the following command:
select_objects [get_cells count_out[3]_i_1]
This lets you quickly identify the LUT3 that drives the count_out_reg[3] register, which drives
LED 3. The inputs are:
o mul_out_pre_reg[3] for pin I0
o count_out_pre_reg[3] for pin I1
o tog_state_reg for pin I2
24. Click the Cell Properties tab to view the cell properties and select the Truth Table tab.
25. Click Edit LUT Equation to view the equation for the LUT3. Note the LUT equation:
O= I1 & !I2 + I0 & I2
This command selects the LUT2 that drives the count_out_reg[7] register, which drives LED 7 on
the KCU105 board. The only inputs are tog_state_reg for pin I0 and mul_out_pre_reg[7]
for pin I1. You need to replace the LUT2 with a 3-input LUT and connect the output of counter
register divClk_reg[24] to the additional input pin.
28. In the Vivado ECO Navigator, under Edit, click Create Cell.
The Create Cell dialog box opens.
a. In the Cell name field, enter ECO_LUT3.
b. In the Search field, enter LUT3.
c. Select LUT3 as the cell type and copy the LUT equation O=I1 & !I2 + I0 & I2 from cell
count_out[3]_i_1.
d. Click OK.
ECO_LUT3 is added to the Scratch Pad and the schematic.
e. Right-click the newly added ECO_LUT3 cell in the Scratch Pad, then select Mark and the color
red.
Note: Marking the ECO_LUT3 cell makes it easier to locate.
Because you copied the LUT equation from cell count_out[3]_i_1, the nets must be hooked up in
the same order, with the following connections:
• Net mul_out_pre[7] connected to pin I0
• Net divClk_reg_n_0_[24] connected to pin I1
• Net tog_state connected to pin I2 of ECO_LUT3
29. Locate the tog_state net driven by the tog_state_reg register in the schematic and select it.
Alternatively you can select the net from the Tcl Console by running the following command:
select_objects [get_nets tog_state]
30. Connect the I2 pin of the newly added ECO_LUT3 cell by doing the following:
a. Hold down the CTRL key and select pin I2 in the Scratch Pad. This selects pin I2 in addition to
the already selected tog_state net.
b. Click Connect Net.
31. Locate the mul_out_pre[7] net in the schematic and select it.
Alternatively, you can select the net from the Tcl Console by executing the following command:
select_objects [get_nets mul_out_pre[7]]
32. Connect the I0 pin of the newly added ECO_LUT3 cell by doing the following:
a. Hold down the CTRL key and select pin I0 in the Scratch Pad. This selects pin I0 in addition to
the already selected mul_out_pre[7] net.
b. Click Connect Net.
33. Locate the divClk_reg_n_0_[24] net in the schematic and select it.
Alternatively, you can select the net from the Tcl Console by executing the following command:
select_objects [get_nets divClk_reg_n_0_[24]]
34. Connect the I1 pin of the newly added ECO_LUT3 cell by doing the following:
a. Hold down the CTRL key and select pin I1 from the Scratch Pad. This selects pin I1 in addition
to the already selected divClk_reg_n_0_[24] net.
b. Click Connect Net.
Next, you need to connect the updated logic function implemented in the newly created LUT3 to
the D input of count_out_reg[7]. The first step is to delete the LUT2 that was previously
connected to the D input.
36. In the main toolbar, click the Delete button to delete the selected cell.
37. Select the net connected to the D input of the count_out_reg[7] register in the schematic
window.
Alternatively you can select the net from the Tcl Console by executing the following command:
select_objects [get_nets count_out[7]_i_1_n_0]
38. Connect the O pin of the newly added ECO_LUT3 cell by doing the following:
a. Hold down the CTRL key and select pin O from the Scratch Pad.
b. Click Connect Net.
Because you added additional logic, you need to place the logic using the incremental place, and
then route the updated net connections using incremental route.
2. In the Vivado ECO Navigator, under Run, click Place Design.
The Place Design dialog box opens, allowing you to specify additional options for the
place_design command. For this exercise, do not specify additional options.
3. Click OK.
The incremental placement summary shows that the following two cells did not have their previous
placement reused:
o The new ECO_LUT3 cell, which had to be placed from scratch
o The count_out_reg[7] cell, which had to get updated placement due to the placement of the
ECO_LUT3 driving it
5. In the Vivado ECO Navigator, under Run, click Route Design.
Depending on your selection, you have four options to route the ECO changes:
o Incremental Route: This is the default option.
o Route selected pin: This option limits the route operation to the selected pin.
o Route selected non-Power nets: This option routes only the selected signal nets.
o Route selected Power nets: This option routes only the selected VCC/GND nets.
In this case, the best choice is to route the changes you made incrementally.
6. Select Incremental Route.
7. Click OK.
At the end of the route_design step, the incremental Routing Reuse Summary displays in the Tcl
Console.
Most of the nets did not require any routing and have been fully reused.
Before you generate a bitstream, run the ECO DRCs on the design.
9. In the ECO Navigator, click Check ECO. Make sure no Critical Warnings are generated.
10. In the Vivado ECO Navigator, under Program, click Save Checkpoint As.
The Save Checkpoint As dialog box opens and you can specify a name for the checkpoint file to
write to disk.
12. In the Vivado ECO Navigator, under Program, click Generate Bitstream.
The Generate Bitstream dialog box opens.
You can specify a name for a Bit file and select the desired options for the write_bitstream
operation.
13. Click OK to generate a bitstream with your changes.
14. In the Vivado ECO Navigator, under Program, click Write Debug Probes.
The Write Debug Probes dialog box opens.
You can specify a name for a .ltx file for your debug probes.
15. Click OK to generate debug probes file (LTX).
This command allows you to generate a new .ltx file for your debug probes. If you made changes to
your debug probes using the Replace Debug Probes command, you need to save the updated
information to a new debug probes file to reflect the changes in the Vivado Hardware Manager
16. Follow the instructions in Step 3: Validating the Design on the Board to download the generated
bitstream programming file and debug probes file into the target FPGA device using the Hardware
Manager to check your ECO modifications.
8. Choose a new net to connect to the debug probe probe4 by doing the following:
a. Type toggle_vio in the search field of the Choose Nets dialog box.
b. Click Find.
c. Select the toggle_vio net, and move it to the Selected names section.
d. Click OK.
Conclusion
In this lab, you did the following:
• Made changes to the previously implemented design using the Vivado ECO flow.
• Implemented the changes using incremental place and route.
• Generated a bitstream and probes file with your changes to configure the FPGA.
• Used the Replace Debug Probes command to switch the sources for debug probes in the
design.
© Copyright 2012-2018 Xilinx, Inc. Xilinx, the Xilinx logo, Artix, ISE, Kintex, Spartan, Virtex, Zynq, and other designated brands included herein
are trademarks of Xilinx in the United States and other countries. All other trademarks are the property of their respective owners.