Build and Install SLASH
This guide covers the supported method of installing the SLASH stack: building
the Debian or RPM packages from the repository, then installing them with
apt or dnf. It is the same flow used by SLASH continuous integration.
Pre-built packages are not distributed. The static shell that every hardware design is linked against must be built by Vivado and cannot be redistributed, so each site builds the packages once for itself. This is a long build; see What the build does, and how long it takes.
The build and the installation may be performed on different machines. The build machine requires the AMD toolchain and a set of development packages, but no V80 board. The target machine requires a board and kernel headers, but no toolchain. The two are frequently the same machine; the distinction is noted where it applies.
Package Groups
SLASH is split into focused packages so you install only what you need.
Runtime packages (required on every host with a V80 board):
Package |
Purpose |
|---|---|
|
DKMS source for the |
|
Shared library for interacting with the kernel module over the driver’s character device. |
|
Daemon that multiplexes device access, enforces permissions, and
manages board state. Includes systemd units, udev rules, and
default |
|
Client libraries ( |
|
VRT C++ runtime library — the high-level API for kernels, buffers, and device control. |
|
Board management CLI: |
Development packages (required when building applications or HLS kernels):
Package |
Purpose |
|---|---|
|
Headers and CMake targets for |
|
Headers and CMake targets for |
|
Headers and CMake targets for |
|
Python-based kernel linker that packages compiled HLS IP into
|
Convenience metapackages:
Package |
Pulls in |
|---|---|
|
All runtime packages above except |
|
All development packages above. |
|
Runtime subset for simulation/emulation hosts (no board required). |
|
Development subset for simulation/emulation. |
Before You Start
Hardware and OS
An AMD Alveo V80 board in a PCIe x8 (or wider) slot, on the target machine.
Linux: Ubuntu LTS 22.04+, RHEL 9+ or compatible. Other distributions may work but are not tested.
Get the source
git clone -b dev https://github.com/Xilinx/SLASH.git
cd SLASH
git submodule update --init submodules/AVED submodules/qdma_drv submodules/Versal-DCMAC
Name those three submodules explicitly. Do not clone with
--recurse-submodules: an optional QEMU submodule that SLASH does not build
pulls in further submodules, one of which no longer exists upstream, causing the
clone to fail. The repository README documents this, and describes
how to enable the RP1 firmware test.
Unless stated otherwise, all commands on this page are run from the repository root.
Build-machine dependencies
The build machine requires a C/C++ toolchain, a number of library headers and the distribution packaging tools. A script installs the correct set for each supported distribution:
sudo ./scripts/install-dev-deps-ubuntu.sh
sudo ./scripts/install-dev-deps-rhel.sh
These scripts account for differences between releases; Ubuntu 22.04 and 24.04, for example, package debhelper DKMS support differently. Use them in preference to a manually assembled package list.
Installing the dependencies manually
The equivalent package sets, for distributions the scripts do not cover or where manual installation is preferred.
sudo apt install \
build-essential cmake ninja-build pkg-config rsync git dkms \
debhelper dpkg-dev apt-utils \
python3 python3-pip \
libcli11-dev libinih-dev libjsoncpp-dev \
libsystemd-dev libxml2-dev libzmq3-dev zlib1g-dev
sudo apt install \
build-essential cmake ninja-build pkg-config rsync git dkms dh-dkms \
debhelper dpkg-dev apt-utils \
python3 python3-pip \
libcli11-dev libinih-dev libjsoncpp-dev \
libsystemd-dev libxml2-dev libzmq3-dev cppzmq-dev zlib1g-dev
sudo dnf install \
gcc gcc-c++ cmake make ninja-build pkg-config rsync git dkms \
rpm-build createrepo_c systemd-rpm-macros \
python3.11 python3.11-pip \
cli11-devel cppzmq-devel inih-devel jsoncpp-devel \
libxml2-devel systemd-devel \
zeromq-devel zlib-devel
sudo dnf install \
gcc gcc-c++ cmake make ninja-build pkg-config rsync git dkms \
rpm-build createrepo_c systemd-rpm-macros \
python3 python3-pip \
cli11-devel cppzmq-devel inih-devel jsoncpp-devel \
libxml2-devel systemd-devel \
zeromq-devel zlib-devel
Target-machine dependencies
Every machine that will run the packages needs kernel headers, so that DKMS can compile the kernel module against the running kernel:
sudo apt install linux-headers-$(uname -r)
sudo dnf install kernel-devel-$(uname -r)
Everything else — dkms, gcc, the shared libraries — is declared as a
dependency by the packages themselves and pulled in automatically.
AMD tools and license
Building the static shell requires Vivado and Vitis 2025.1 and a Vivado Enterprise license. Both must be installed on the machine that runs them: normally the build machine, or the cluster nodes when offloading to a cluster, in which case the build machine does not require them.
Source both before building:
source <path-to-vivado>/settings64.sh
source <path-to-vitis>/settings64.sh
For csh/tcsh users, use settings64.csh. Releases other than 2025.1
are not supported.
Verify the environment with which v++; the packaging script tests for this
binary and exits if it is absent.
Note
Vivado Enterprise license configuration is site-specific. Contact your license administrator if you are unsure how licenses are served at your site.
SMBus IP
The SMBus IP (xilinx.com:ip:smbus:1.1) used for board management is
not included in this repository and is not bundled with Vivado. It must
be downloaded separately from the AMD member portal and placed into the
local IP repository before building:
Download the SMBus IP from https://www.xilinx.com/member/v80.html (AMD account required).
Copy the downloaded IP directory into
linker/slashkit/resources/base/common/iprepo/so that Vivado can locate it during synthesis. The directory name must begin withsmbus; a release-date suffix is permitted.
Confirm the result before starting the build:
ls -d linker/slashkit/resources/base/common/iprepo/smbus*/
If this command prints no path, the packaging script stops with an error before performing any work.
See the AVED rebuild guide for additional details.
Build the Packages
All packages — including the AMI driver package — are produced by a single script run from the repository root:
scripts/package-deb.sh
Packages are written to ./deb/.
scripts/package-rpm.sh
Packages are written to ./rpm/.
Both scripts call scripts/package-ami.sh internally, so the AMI package
is built and placed in the same output directory as the SLASH packages.
Pass --noninteractive to suppress the confirmation prompt shown when an
existing build is about to be overwritten. This is required when the build is
run detached, and is what continuous integration uses.
Note
dpkg-buildpackage writes the .dsc and source tarball to the
parent of the repository directory and cannot be configured otherwise.
The directory containing the checkout must therefore be writable.
What the build does, and how long it takes
Most of the elapsed time is spent in Vivado. The script builds the base IP, then
runs scripts/root-design-build.sh, which synthesises and implements two
static shells, the service shell and the compute shell, sequentially. Compiling
the C++ components, building the AMI package and assembling the packages take
minutes by comparison.
A reference run on a 16-core machine took 7.5 hours for the service shell and
5.5 hours for the compute shell, with approximately two further hours of
non-Vivado work, giving 17.5 hours in total. Vivado required up to 140 GB
of resident memory during implementation, so the machine must be sized for
memory as well as core count. Allow tens of gigabytes of scratch space in the
working tree. Run the build detached, under nohup, tmux or screen.
The final build step creates a Python virtual environment and builds the
slashkit wheel, downloading its build backend from PyPI. This step runs on
the machine that started the script, not on the cluster when offloading, so
that machine requires outbound network access. Without it the build fails at
the end, after the Vivado work has completed.
If a prerequisite is missing, the script reports it and stops before performing any work:
ERROR: v++ not found in PATH. Source Vitis 2025.1 before building:
source <path-to-vitis>/settings64.sh
ERROR: SMBus IP (xilinx.com:ip:smbus:1.1) not found in
linker/slashkit/resources/base/common/iprepo/.
Rebuilding packages without rebuilding the shell
Once the static shells exist, changes to the runtime, the daemon or the CLI do
not require rebuilding them. Set SLASH_PKG_SKIP_ROOT_DESIGN_BUILD to reuse
the existing shells:
SLASH_PKG_SKIP_ROOT_DESIGN_BUILD=1 scripts/package-deb.sh
This reduces the build to a few minutes. It requires
linker/slashkit/resources/static_shell/ and
linker/slashkit/resources/static_shell_compute/ to be populated already.
Setting the variable also skips the prerequisite checks described above, so a
missing shell is reported later as a packaging error rather than as a clear
diagnostic.
Building on a cluster
Where a batch scheduler is available, the Vivado work can be submitted to it
while the build is orchestrated from the machine that started it. Set
SLASH_TOOL_LAUNCHER to a submit wrapper and run the same script:
export SLASH_TOOL_LAUNCHER=/path/to/your/submit-wrapper
scripts/package-deb.sh --noninteractive
The submit host then does not require a local Vivado installation; the v++
check is skipped when a launcher is set. Everything the build uses — the
checkout, the build directory and the toolchain — must reside on storage
visible from both hosts at identical paths.
SLASH_ROOT_DESIGN_JOBS sets the Vivado job count (default 8), and
SLASH_VIVADO_BIN the name of the Vivado binary where it is not vivado.
Warning
SLASH_ROOT_DESIGN_JOBS does not size the scheduler reservation. It
sets the number of parallel jobs Vivado runs; the core count granted by the
scheduler is determined by the wrapper. Both must be set, and to the same
value. Requesting more Vivado jobs than the reservation has cores
oversubscribes the node, which some sites treat as grounds for terminating
the job.
Wall-clock limits apply per job. Each shell is submitted separately, so each limit must cover a single shell — approximately 8 hours — rather than the 17.5-hour total. Reserve approximately 150 GB of memory per job.
The two jobs are submitted sequentially and each is waited on, so the
orchestrating process remains idle for extended periods. Run it under
nohup or a terminal multiplexer. Terminating it while a job is running
leaves that job holding its reservation, and the job must then be cancelled
manually.
A reference wrapper for IBM Spectrum LSF, providing per-step reservation sizing
and a preflight check, is supplied in scripts/lsf/. The corresponding
settings are SLASH_LSF_CORES_static_shell and
SLASH_LSF_WALLTIME_static_shell, together with the matching
_static_shell_compute pair, in site.conf; copy site.conf.example and
edit it. See Offload Builds to a Cluster for the full set of requirements
a wrapper must satisfy.
Install the AMI Driver
The V80 board’s PF0 function (device ID 0x50B4) is managed by the
AMI (AVED Management Interface) kernel module. Install it before the
rest of the SLASH stack so it can bind to PF0 when the board enumerates over
PCIe.
sudo apt install ./deb/ami_<version>_amd64.deb
sudo dnf install ./rpm/ami-<version>-1.<dist>.x86_64.rpm
Warning
If AMI is already installed on this system — for example, built from source or installed from a separate vendor package — the generated AMI package may conflict with the existing installation. Either remove the existing AMI installation before proceeding, or skip this step and ensure your installed AMI version is compatible with this SLASH release.
If the board already enumerates over PCIe, verify that ami is bound to PF0:
lspci -d 10ee:50b4 -k
You should see Kernel driver in use: ami. If no PF0 is visible yet, continue
to Program the Board and boot the temporary JTAG image first.
Install Runtime Packages
When installing from local package files, list all packages explicitly so that the package manager can satisfy the inter-package dependencies in a single transaction:
sudo apt install \
./deb/slash-dkms_<version>_all.deb \
./deb/libslash_<version>_amd64.deb \
./deb/vrtd_<version>_amd64.deb \
./deb/libvrtd_<version>_amd64.deb \
./deb/libvrt_<version>_amd64.deb \
./deb/v80-smi_<version>_amd64.deb \
./deb/slashkit_<version>_amd64.deb
sudo dnf install \
./rpm/slash-dkms-<version>-1.<dist>.noarch.rpm \
./rpm/libslash-<version>-1.<dist>.x86_64.rpm \
./rpm/vrtd-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrtd-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-<version>-1.<dist>.x86_64.rpm \
./rpm/v80-smi-<version>-1.<dist>.x86_64.rpm \
./rpm/slashkit-<version>-1.<dist>.x86_64.rpm
Note
The slash metapackage and metapackage-based installs
(sudo apt install slash) only work when the packages are served
from a configured APT or DNF/YUM repository. Installing a bare
metapackage .deb or .rpm from a local file will fail because
the package manager cannot resolve its dependencies against local
files.
After installation, DKMS automatically compiles and inserts the kernel module for the running kernel. Verify it loaded:
lsmod | grep slash
Start and Enable the Daemon
The vrtd package installs a systemd service and socket. Enable it so
that it starts on boot and is running now:
sudo systemctl enable --now vrtd
Check whether the board is already reachable through the daemon:
v80-smi list
Boards that already enumerate over PCIe should show all four readiness indicators passing (PF0, PF1, PF2, VRTD). A new board will not yet be listed; see Program the Board below.
Program the Board
With the packages installed and vrtd running, the remaining step is to write
the SLASH static shell to the board. A board that has not previously run SLASH
requires a temporary image to be booted over JTAG first, so that it enumerates
over PCIe; a board already running AVED or an earlier SLASH shell can be flashed
directly.
Bring Up a V80 Board describes both procedures, together with verification of the kernel module and configuration of non-root user access.
On completion, v80-smi list reports the board with all four readiness
indicators passing.
Install Development Packages
If you are writing applications against the VRT API or compiling HLS kernels, install the development metapackage:
sudo apt install \
./deb/libslash-dev_<version>_amd64.deb \
./deb/libvrtd-dev_<version>_amd64.deb \
./deb/libvrt-dev_<version>_amd64.deb \
./deb/slashkit_<version>_amd64.deb
sudo dnf install \
./rpm/libslash-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrtd-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/slashkit-<version>-1.<dist>.x86_64.rpm
This installs:
C++ headers under
/usr/include/vrt/,/usr/include/vrtd/, and/usr/include/slash/CMake package files for
slash,vrt,vrtdandSlashTools, in the distribution’s library directory —/usr/lib/x86_64-linux-gnu/cmake/on Debian and Ubuntu,/usr/lib64/cmake/on RHEL and derivatives. Both are on CMake’s default search path, sofind_packageneeds no hintThe
slashkitlinker and theSlashToolsCMake module
CMake projects can then discover VRT with:
find_package(vrt REQUIRED CONFIG)
target_link_libraries(my_app PRIVATE vrt::vrt)
Before building HLS kernels or vrtbin files, source the Vivado and Vitis HLS environment in your shell:
source <path-to-vivado>/settings64.sh
source <path-to-vitis-hls>/settings64.sh
For csh/tcsh shells, use settings64.csh instead. SLASH has been
built and tested against Vivado/Vitis 2025.1; using other versions may
cause breakage.
See Use CMake Modules for details on using the CMake integration.
Install Emulation / Simulation Packages
To develop or run kernels in emulation or simulation without a physical
V80 board, install the slash-sim-emu subset:
sudo apt install \
./deb/libslash_<version>_amd64.deb \
./deb/libvrtd_<version>_amd64.deb \
./deb/libvrt_<version>_amd64.deb
For building emu/sim kernels, also install:
sudo apt install \
./deb/libslash-dev_<version>_amd64.deb \
./deb/libvrtd-dev_<version>_amd64.deb \
./deb/libvrt-dev_<version>_amd64.deb \
./deb/slashkit_<version>_amd64.deb
sudo dnf install \
./rpm/libslash-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrtd-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-<version>-1.<dist>.x86_64.rpm
For building emu/sim kernels, also install:
sudo dnf install \
./rpm/libslash-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrtd-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/slashkit-<version>-1.<dist>.x86_64.rpm
No board and no kernel module are required on emulation/simulation hosts.
The daemon is still needed if any component connects to vrtd, but you
can point applications at the emulation platform directly.
See Emulation and Simulation for a walkthrough.
Upgrade and Removal
Note
If the new version changes the static shell, re-program the board flash after upgrading the packages. See Program the Board above.
Re-run scripts/package-deb.sh to produce the new packages, then
reinstall with apt install — apt handles upgrades transparently
when given local .deb files:
sudo apt install \
./deb/ami_<new-version>_amd64.deb \
./deb/slash-dkms_<new-version>_all.deb \
./deb/libslash_<new-version>_amd64.deb \
./deb/vrtd_<new-version>_amd64.deb \
./deb/libvrtd_<new-version>_amd64.deb \
./deb/libvrt_<new-version>_amd64.deb \
./deb/v80-smi_<new-version>_amd64.deb \
./deb/slashkit_<new-version>_amd64.deb
Re-run scripts/package-rpm.sh, then upgrade:
sudo dnf upgrade \
./rpm/ami-<new-version>-1.<dist>.x86_64.rpm \
./rpm/slash-dkms-<new-version>-1.<dist>.noarch.rpm \
./rpm/libslash-<new-version>-1.<dist>.x86_64.rpm \
./rpm/vrtd-<new-version>-1.<dist>.x86_64.rpm \
./rpm/libvrtd-<new-version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-<new-version>-1.<dist>.x86_64.rpm \
./rpm/v80-smi-<new-version>-1.<dist>.x86_64.rpm \
./rpm/slashkit-<new-version>-1.<dist>.x86_64.rpm
Removal
scripts/uninstall-slash.sh returns the machine to an uninstalled state. It
stops vrtd, unloads the kernel modules and removes all SLASH packages, in
that order. The order is significant: removing the packages first would unload
the module while a board is still bound to it.
sudo scripts/uninstall-slash.sh
Pass --device with the board’s PCIe address to detach the board from the bus
as well, which is required before reprogramming or reseating it:
sudo scripts/uninstall-slash.sh --device 0000:21:00
--dry-run reports the actions that would be taken without performing them;
--help lists the remaining options. The script may be run repeatedly: each
step is skipped where there is nothing to do.
Note
Removing slash-dkms automatically removes the kernel module from
DKMS management and unloads it if currently loaded.
Troubleshooting
Kernel module did not load after install
DKMS compiles during package installation. If headers were missing at that point, install them and rebuild:
sudo apt install linux-headers-$(uname -r) # Debian/Ubuntu sudo dkms build slash/0.1 sudo dkms install slash/0.1
vrtd fails to start
Check the journal for errors:
sudo journalctl -u vrtd --no-pagerCommon causes: kernel module not loaded, or board not detected by the OS (check
lspci -d 10ee:).
v80-smi list shows no boards
Verify the module is loaded (
lsmod | grep slash) and that the daemon is running (systemctl status vrtd).
Permission denied
The user must be in the
vrtadmingroup:sudo usermod -aG vrtadmin <username>Log out and back in for the change to take effect.
Building Individual Components
This section covers development work on SLASH itself, and is not an alternative installation method. When iterating on the daemon or the CLI, rebuilding a single component takes seconds where a package build takes hours. To install SLASH on a machine, follow the procedure above.
Each component is a standalone CMake project:
Component |
Directory |
Notes |
|---|---|---|
|
|
Plain |
|
|
No SLASH dependencies. Build this first. |
|
|
Needs |
|
|
Needs |
|
|
Needs VRT, and a C++20 compiler — the rest of the tree is C++17.
|
Built in that order, each component finds its dependencies already installed:
cd vrt/vrtd
cmake -B build -S . -G Ninja
cmake --build build
sudo cmake --install build
The kernel module is the exception:
cd driver
make
sudo insmod slash.ko
It takes qdma_num_threads=N (default 8) and
qdma_debugfs_path=/sys/kernel/debug as module parameters.
The -DXXX_INCLUDE_YYY=ON options allow a component to be built without
installing its dependencies system-wide, which is normally preferable on a
development machine.
Warning
A component installed in this way and the packaged copy of the same
component occupy the same paths, and the most recently installed copy takes
precedence. apt and dnf hold no record of files installed by CMake,
so those files remain after the packages are removed. Use one method or the
other on a given machine. To return to packages after building manually, run
sudo scripts/uninstall-slash.sh and delete any remaining files it
reports.
Each component’s README.md documents its own options, tests and layout in
more detail.
Examples
The examples are standalone CMake projects, and can be built against the repository tree rather than against an installed SLASH:
cd examples/00_axilite
cmake -B build -S . -G Ninja -DSLASH_USE_REPO=ON
cmake --build build
Without -DSLASH_USE_REPO=ON they build against the installed packages.
Building the FPGA artefacts requires Vivado and Vitis 2025.1 to be sourced, as
described above. See Your First Kernel.