1. Setup
There are two ways of setting up X-HEEP. You can either use the provided Docker image or install and configure the environment manually.
Docker setup
A Docker image containing all the required software dependencies is available on github-packages.
It is only required to install Docker, pull the image and run the container. The pull and run steps are wrapped in dedicated makefile targets that you can access from the top-level directory as:
make -C util/docker docker-pull # pull the latest available X-HEEP image
make -C util/docker docker-run # mount the current X-HEEP clone to '/workspace/x-heep'
In particular, the docker-pull target tries to infer your X-HEEP revision using git describe and pull the corresponding image. If it fails, it defaults to the latest image available, that is the one used by the upstream main branch.
The Docker image provides built-in shortcuts (as Bash functions) to select among the available software compilation flows, as an alternative to providing the COMPILER, COMPILER_PREFIX, and ARCH variable when compiling an application with make app. Here is a brief description of the shortcut defined in util/docker/env.sh:
Shortcut |
Description |
Configuration |
|---|---|---|
|
Use the Embecosm CORE-V toolchain with PULP extension |
|
|
Use the GCC toolchain |
|
|
Use the LLVM/Clang toolchain |
|
For example, if you want to compile and link the hello_world application using LLVM/Clang:
init_clang
make app PROJECT=hello_world
The Docker setup has certain limitations. For example, the following are not supported:
Simulation with Questasim and VCS, synthesis with Design Compiler. Licenses are required to use these tools, so they are not installed in the container.
OpenRoad flow is not installed in the container, so it is not possible to run the related make commands.
Synthesis with Vivado could be possible, but currently is untested.
Manual setup
1. OS requirements
To use X-HEEP, first you will need to install some OS dependencies. We recommend Ubuntu 24.04 or Ubuntu 22.04.
The following command apt command should install every required package:
sudo apt install autoconf automake autotools-dev curl python3 python3-pip python3-tomli libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev libslirp-dev help2man perl make g++ libfl2 libfl-dev zlibc zlib1g zlib1g-dev ccache mold libgoogle-perftools-dev numactl libelf-dev
Errors occurring when installing the following packages may be ignored:
libfl2 libfl-dev zlibc zlib1g zlib1g-dev
Links for the packages relative to each software can also be found under the corresponding section of this guide. In general, make sure to have a look at the Check system requirements section of the OpenTitan documentation.
2. Python
We rely on either (a) miniconda, or (b) virtual environment environment.
Choose between 2.a or 2.b to setup your environment.
2.a Miniconda
Install Miniconda Python 3.8 version by downloading an older version and selecting the latest py38 version here. Then, create the Conda environment from inside the x-heep folder:
make conda
You need to do it only the first time, then just activate the environment every time you work with X-HEEP as
conda activate core-v-mini-mcu
or put the command directly in the ~/.bashrc file.
2.b Virtual Environment
Note
The Python environment has only been tested on Python 3.8.
Install the Python virtual environment just as:
make venv
You need to do it only the first time, then just activate the environment every time you work with X-HEEP as
source .venv/bin/activate
3. Install the RISC-V Compiler:
Warning
The RISC-V toolchain environment variable name has changed. Use RISCV_XHEEP instead of RISCV to avoid conflicts with other projects. If you previously exported RISCV for X-HEEP, update your shell initialization files (e.g., ~/.bashrc, ~/.zshrc) or environment modules to export RISCV_XHEEP and remove or adjust any old RISCV definitions accordingly.
X-HEEP supports the CORE-V toolchain from Embecosm, but you can also use the standard RISC-V GCC or CLANG toolchains.
You can download and install the CORE-V toolchain by following the instructions on the Embecosm download page. This is the recommended option since it includes support for the PULP extensions that can be enabled in X-HEEP and is the default toolchain for the provided compilation flow.
Optionally, you can also build and install the standard RISC-V GCC toolchain from source.
The RISC-V compiler requires the following packages to be installed (Check OS requirements for Ubuntu distribution). The GitHub page contains instructions for other linux distributions.
Then the installation can proceed with the following commands :
git clone https://github.com/riscv/riscv-gnu-toolchain
cd riscv-gnu-toolchain
git checkout 2023.01.03
./configure --prefix=/home/$USER/tools/riscv --with-abi=ilp32 --with-arch=rv32imc --with-cmodel=medlow
make -j $(nproc)
If you target RVE systems (i.e. using only RISC-V registers from x0-x15), then use instead:
./configure --prefix=/home/$USER/tools/riscv --with-abi=ilp32e --with-arch=rv32emc --with-cmodel=medlow
make newlib
where the abi flag has changed to ilp32e and arc to rv32emc.
This has been tested with a different compiler version (4e7952b5f6c106c01b2e1c056476687e1390105d, which is why make newlib instead of just make.)
You need to set the RISCV_XHEEP environment variable like this:
export RISCV_XHEEP=/home/$USER/tools/riscv
Also consider adding it to your ~/.bashrc or equivalent so that it’s set automatically in the future.
Optionally you can also compile and link with Clang/LLVM instead of GCC. For that you must install the Clang compiler (and the LLVM LLD linker) into the same RISCV_XHEEP path. The binaries of GCC and Clang do not collide so you can have both residing in the same RISCV_XHEEP directory. For this you can set the -DCMAKE_INSTALL_PREFIX cmake variable to $RISCV_XHEEP when building LLVM. This can be accomplished by doing the following:
INSTALL_DIR=${RISCV_XHEEP}
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
git checkout llvmorg-19.1.4
cmake -S llvm -B build -G "Ninja" -DLLVM_ENABLE_PROJECTS="clang;lld" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DLLVM_TARGETS_TO_BUILD="RISCV" -DLLVM_USE_LINKER=lld
cmake --build build --target install # or ninja -C build install
By default, when compiling an application with Clang, X-HEEP will link with the LLD linker.
If you want to use the GCC linker, you will need to pass to the make app target the
CLANG_LINKER_USE_LD=1 option.
4. Install Verilator:
X-HEEP supports Verilator version 5.040, which requires the following packages to be installed (Check OS requirements for Ubuntu distribution). The documentation page contains instructions for other linux distributions. You should use at least g++ 13 when installing verilator to avoid potential issues when running your verilated designs.
Warning
Backward compatibility with Verilator 4.210 is currently maintained, yet this is very likely to change in future releases, so we strongly suggest against using it. Also, Verilator 4.210 requires GCC older than 12.0, so make sure to configure your environment accordingly if you choose to use it anyway.
To proceed with the installation, use the following command:
export VERILATOR_VERSION=5.040
git clone https://github.com/verilator/verilator.git
cd verilator
git checkout v$VERILATOR_VERSION
autoconf
./configure --prefix=/home/$USER/tools/verilator/$VERILATOR_VERSION
make
make install
After installation you need to add /home/$USER/tools/verilator/$VERILATOR_VERSION/bin to your PATH environment variable. Also consider adding it to your ~/.bashrc or equivalent environment initialization script so that it’s on the PATH in the future, like this:
export VERILATOR_VERSION=5.040
export PATH=/home/$USER/tools/verilator/$VERILATOR_VERSION/bin:$PATH
In general, have a look at the Install Verilator section of the OpenTitan documentation.
If you want to see the waveforms generated by the Verilator simulation (FST format), install GTKWAVE:
sudo apt install libcanberra-gtk-module libcanberra-gtk3-module
sudo apt-get install -y gtkwave
5. Install Verible
Files are formatted with Verible. We use version v0.0-4023-gc1271a00
export VERIBLE_VERSION=v0.0-4023-gc1271a00
wget https://github.com/chipsalliance/verible/releases/download/${VERIBLE_VERSION}/verible-${VERIBLE_VERSION}-linux-static-x86_64.tar.gz
tar -xf verible-${VERIBLE_VERSION}-linux-static-x86_64.tar.gz
mkdir -p /home/$USER/tools/verible/${VERIBLE_VERSION}/
mv verible-${VERIBLE_VERSION}/* /home/$USER/tools/verible/${VERIBLE_VERSION}/
rm verible-${VERIBLE_VERSION}-linux-static-x86_64.tar.gz
rm -r verible-${VERIBLE_VERSION}
After installation you need to add /home/$USER/tools/verible/${VERIBLE_VERSION}/bin to your PATH environment variable. Also consider adding it to your ~/.bashrc or equivalent so that it’s on the PATH in the future, like this:
export VERIBLE_VERSION=v0.0-4023-gc1271a00
export PATH=/home/$USER/tools/verible/${VERIBLE_VERSION}/bin:$PATH
In general, have a look at the Install Verible section of the OpenTitan documentation (the version referenced there is not the one we use in X-HEEP).