This section describes how to combine the hardware design and the software applications into a complete integrated system. A prerequisite for software application development is the hardware specification, which contains information about the hardware design and its address map. You compile the software applications to binaries, and then package the binaries with the hardware configuration data into device images that also contain boot instructions.
The packaging process consists of two steps:
- Use the Vitis packager to generate loadable images from the Vivado hardware design and the AI Engine handoffs, into a binary container. This step also creates a draft BIF file.
- Collect the binary containers and software executables, and assemble them into a delivery package that contains the boot-process instructions. The delivery package can be an SD card image, a QSPI flash image, or another similar package type. You can perform this step with either the Vitis packager or Bootgen.
The system integration packaging process uses the file types listed in the following table.
| Input File Type | Name | Description | Applicable Devices |
|---|---|---|---|
| XSA | Support Archive | Primary design handoff archive file from Vivado. The XSA file can be fixed or extensible. | Versal adaptive SoC / Zynq / Zynq UltraScale+ |
| BIF | Boot Image Format | File that Bootgen uses to determine how to generate boot images and how to configure them in a PDI file. | Versal adaptive SoC / Zynq / Zynq UltraScale+ |
| PDI | Programmable Device Image | Output of Bootgen. The image file contains the bootloader, descriptions, and partitions used to process the input data files (ELF, PL configuration, and other binary files). | Versal adaptive SoC |
| XCLBIN | XCLBIN | Enhanced PDI container with metadata about PL kernels and the AI Engine. XCLBIN is used exclusively for the XRT API on the Linux OS. | Versal adaptive SoC / Zynq / Zynq UltraScale+ |
| CDO | Configuration data object | List of commands that are executed in sequence to configure various components in the system. | Versal adaptive SoC |
libadf.a
|
AI Engine graph library |
For details, see Compiling AI Engine Graph for Independent Partitions in the AI Engine Tools and Flows User Guide (UG1076) . |
Versal adaptive SoC |
| FSBL | First stage bootloader | Image for the PL bitstream, code, and data that starts the initial design. The FSBL can bring up the entire design or pass on to a second bootloader to finalize the boot. | Zynq / Zynq UltraScale+ |
| DTSI | Device tree system include | Adds user settings that override device tree defaults, such as the MAC address and UART baud rates, on hardware devices. | Versal adaptive SoC / Zynq / Zynq UltraScale+ |
zocl.dtsi
|
Container for data-driven customization | Contains the domain description, memory reservation, board DTSI, and user DTSI used to apply device tree overlays for Linux and the XRT drivers. For flat designs and hardware emulation, the container also requires boot artifacts from EDF (prebuilt or custom-built), so that the Vitis packager can call Bootgen to merge the boot PDI, the PL PDI, and, where applicable, the AIE binaries, into a single-stage boot. | Versal adaptive SoC / Zynq UltraScale+ |
qemu_args.txt /
pmc_args.txt
|
QEMU command arguments file | Command-line arguments used when you launch QEMU, because the DTB for emulation differs from the Linux device tree. | Versal adaptive SoC |
The packaging process varies depending on the domain you select, because the domain affects the boot order and how the hardware specification is extracted for the host application. The following sections describe these variants.
The first packaging step requires the Vitis packager, and the second step can use either the Vitis packager or Bootgen. Familiarize yourself with the boot components and the way the BIF sets up the boot order, as described in Software Platform. Advanced users can use Bootgen User Guide (UG1283) for details and custom packaging control options. The following sections describe how to use the Vitis packager.
--target hw_emu.Packaging Process for Bare-Metal and RTOS Applications
Bare-metal applications interact with the hardware through registers defined in the hardware specification and through low-level drivers. You can also add drivers for frequently used services, such as Ethernet, file handling, and FPGA management, through a board support package (BSP).
The hardware specification is extracted from the fixed XSA. When
you create the Vitis platform component for
bare-metal or RTOS domains, the tool generates the xparameters.h
file. For details about how to add and configure bare-metal and RTOS domains, see
Board Support
Package Settings Page in the
Vitis
Unified Software Platform Documentation: Embedded Software
Development (UG1400)
. If
hardware changes affect the hardware specification, you must regenerate the BSP
and xparameters.h.
Alternatively, you can use PetaLinux multiconfig tools to regenerate the BSP. See Building multiconfig Applications in the PetaLinux Tools Documentation: Reference Guide (UG1144).
First, generate a loadable PDI and extract the AI Engine CDO with the following command:
v++ -p -s -f <fixed.xsa> <libadf.a> --temp-dir <temp_dir> --save-temps
--save-temps option, as
shown above, to preserve the files that Bootgen needs.Next, integrate the hardware and software platform with the Vitis packager:
v++ -p -s -f <fixed.xsa> <libadf.a> --package.generate_sd_card --package.sd_file <pdi, elf, xclbin, etc.> --package.sd_dir <outdir>
For full details about the command-line options for v++, see
v++
Command in the Vitis
Reference Guide (UG1702).
Packaging Process for Linux Applications
Linux applications can use drivers in two ways: the standard driver approach with the system device tree, or the XRT API.
With the XRT API, drivers that run in user space query address information from the XCLBIN file. When design changes affect hardware specification registers on Vitis-managed components, the XCLBIN file is automatically updated during linking and packaging.
For AMD EDF-based Software Platform, a new data-driven approach
regenerates the system device tree drivers for the fixed XSA. This approach enables
faster design iterations by reducing the need to rebuild the embedded OS for
hardware changes in the Vitis-managed region. The
Vitis packager applies the data-driven settings
by invoking SDTgen, Lopper, and Bootgen, using the descriptions and overlays from a
zipped container currently named zocl.dtsi. For a
detailed example of the container contents, see Adding Domain and Custom Overlays When Using a Prebuilt Embedded OS. For practical examples of how
the container is used, see the
Vitis Tutorials: System Design
tutorials.
For the legacy PetaLinux flow, you adjust user-specific settings for the Linux drivers through DTSI. See Device Tree Configuration in the PetaLinux Tools Documentation: Reference Guide (UG1144).
After you set up the device tree and configurations, package the design in the same way as for bare-metal and RTOS applications.
Packaging and Boot Configuration Using Bootgen
After the first packaging step, the AMD Vitis™ packager collects and assembles the binaries and executables required to boot and run a design on AMD SoC devices, using the BIF file. For details about device-specific boot and configuration, see the following user guides:
- Versal adaptive SoC: Boot and Configuration in the Versal Adaptive SoC System Software Developers Guide (UG1304)
- Zynq UltraScale+: Validate NoC DRCs in the Versal Adaptive SoC Hardware, IP, and Platform Development Methodology Guide (UG1387)
- Zynq: Boot and Configuration in the Versal Adaptive SoC System Software Developers Guide (UG1304)
Packaging Specifics for Versal Designs
The Versal AI Engine compiler generates a library file, libadf.a, which contains ELF and CDO files, along with tool-specific data and metadata, for hardware and hardware emulation flows. To create a loadable image binary, you must combine this data with PL-based configuration data, bootloaders, and other binaries. The Vitis packager performs this function by combining information from libadf.a and the XSA file generated by the Vitis linker.
For Versal adaptive SoCs,
the programmable device image (PDI) file boots and programs the hardware device.
For hardware emulation, the --package command
adds the PDI, the EMULATION_DATA
sections, and the XSA file, and outputs an XCLBIN file. For hardware builds, the
package process creates an XCLBIN file that contains the ELF files and the graph
configuration data objects (CDOs) for the AI Engine application. The XCLBIN file includes the following
information:
- PDI
- Programming information for the AI Engine array.
- Debug data
- Debug information, when included in the build.
- Memory topology
- Defines the memory resources and the structure for the target platform.
- IP layout
- Defines the layout information for the implemented hardware design.
- Metadata
- Platform metadata that lets the tool load and run the XCLBIN file on the target platform.