cvw/docs/D-Docker-Install.md
James Stine 5a0d8aed23 Modified changes as follows
* Add docs directory for Docker including Dockerfile
* Change to synthesis script to include fpu stuff
* Add wrappers for IP (may need some cleanup but will cleanup shortly)
2023-01-28 19:33:00 -06:00

8.6 KiB
Raw Permalink Blame History

D Wally Toolchain Docker Container

Installing RISC-V tools from source gives you maximum control, but has several disadvantages:

  • Building the executables takes several hours.
  • Linux is poorly standardized, and the build steps might not work on your version
  • The source files are constantly changing, and the versions you download might not be compatible with this textbook flow.

Docker is a tools to run applications in a prepackaged container including all of the operating system support required. Wally offers a ~30GB container image with the open-source tools pre-installed from Section D.1. In particular, using the container solves the long build time for gcc and the fussy installation of sail. The container runs on any platform supporting Docker, including Windows and Mac as well as Linux. It can access files outside the container, including local installation of CAD tools such as Questa, and a local clone of the core-v-wally repository.

Docker can be run on most operating systems, including Linux, Windows, and Mac. The Wally Docker container is hosted at DockerHub (http://docker.io).

Podman is a more secure and easier-to-use variation of Docker for Linux developed by RedHat. Both Docker and Podman run the same containers.

D.3.1 Podman Installation on Linux

A system administrator must install Podman if it is not already present.

For Ubuntu 20.10 or later:

$ sudo apt-get -y install podman

For RedHat / Rocky:

$ sudo yum -y install podman

D.3.2 Pulling the Wally Container

Once Podman is installed, a user can pull the Wally container image. The user must sign up for a free account at docker.io, and will be prompted for the credentials when running podman login.

$ podman login docker.io $ podman pull docker.io/wallysoc/wally-docker:latest

D.3.3 Running the Docker Container in Podman

To activate podman with GUI support, first identify your display port in the /tmp/.X11-unix file as shown below. For example, the user ben is on port X51.

$ ls -la /tmp/.X11-unix/ drwxrwxrwt 2 root root 4096 Jan 6 05:01 . drwxrwxrwt 122 root root 40960 Jan 17 08:09 .. srwxrwxrwx 1 root root 0 Jan 5 08:48 X0 srwxrwxrwx 1 xwalter xwalter 0 Jan 5 09:21 X50 srwxrwxrwx 1 ben ben 0 Jan 6 05:01 X51

Then run podman with the display number after the X (51 in this case). The -v options also mount the users home directory (/home/ben) and cad tools (/cad) to be visible from the container. Change these as necessary based on your local system configuration.

$ podman run -it --net=host -e DISPLAY=:51 -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/ben:/home/ben -v /cad:/cad -p 8080:8080 docker.io/wallysoc/wally-docker

Podman sets up all the RISC-V software in the same location of /opt/riscv as the cad user as discussed previously. This shared directory is called $RISCV. This environmental variable should also be set up within the Docker container automatically and ready to use once the container is run. It is important to understand that Docker containers are self-contained, and any data created within your container is lost when you exit the container. Therefore, be sure to work in your mounted home directory (e.g. /home/ben) to permanently save your work outside the container.

To have permission to write to your mounted home directory, you must become root inside the Wally container. This is an acceptable practice as the security will be maintained within podman for the user that runs podman. To become root once inside your container:

$ su # when prompted for password, enter wally

D.3.4 Cleaning up a Podman Container

The Docker container image is large, so users may need to clean up a container when they arent using it anymore. The images that are loaded can be examined, once you pull the Wally container, by typing:

$ podman images

To remove individual podman images, the following Linux command will remove the specific podman image where the image name is obtained from the podman images command (this command also works equally well using the <Image_ID> instead of the <Image_name>, as well).

$ podman rmi -f <Image_name>

D.3.5 Running the Docker Container on Windows or MacOS

Docker Desktop is easiest to use for Mac OS or Windows and can be installed by downloading from http://docker.com. Once the desktop application is installed, users can log into their DockerHub account through the Docker Desktop application and manage their containers easily.

*** with Questa *** questa unavailable native on Mac

D.3.6 Regenerating the Docker File

We use the following steps to generate the Docker file. You can adapt them is you wish to make your own custom Docker image, such as one with commercial CAD tools installed in your local environment.

*** how to use this

Compliance Development Environment Image

FROM debian

UPDATE / UPGRADE

RUN apt update

INSTALL

RUN apt install -y git gawk make texinfo bison flex build-essential python libz- dev libexpat-dev autoconf device-tree-compiler ninja-build libpixman-1-dev build -essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp- dev python3-pip pkg-config libglib2.0-dev opam build-essential z3 pkg-config zl ib1g-dev verilator cpio bc vim emacs gedit nano

RUN pip3 install chardet==3.0.4 RUN pip3 install urllib3==1.22 RUN pip3 install testresources RUN pip3 install riscof --ignore-installed PyYAML RUN echo "root:wally" | chpasswd

ADD RISCV

WORKDIR /opt/riscv

Create a user group 'xyzgroup'

ARG USERNAME=cad ARG USER_UID=1000 ARG USER_GID=$USER_UID

Create the user

RUN groupadd --gid $USER_GID $USERNAME
&& useradd --uid $USER_UID --gid $USER_GID -m $USERNAME
# [Optional] Add sudo support. Omit if you don't need to install software af ter connecting. && apt-get update
&& apt-get install -y sudo
&& echo $USERNAME ALL=root NOPASSWD:ALL > /etc/sudoers.d/$USERNAME
&& chmod 0440 /etc/sudoers.d/$USERNAME

Change RISCV user

run chown -Rf cad:cad /opt

Add cad user

USER $USERNAME

SET ENVIRONMENT VARIABLES

ENV RISCV=/opt/riscv ENV PATH=$PATH:$RISCV/bin

TOOLCHAIN

RUN git clone https://github.com/riscv/riscv-gnu-toolchain &&
cd riscv-gnu-toolchain &&
./configure --prefix=${RISCV} --enable-multilib --with-multilib-generator="r v32e-ilp32e--;rv32i-ilp32--;rv32im-ilp32--;rv32iac-ilp32--;rv32imac-ilp32--;rv32 imafc-ilp32f--;rv32imafdc-ilp32d--;rv64i-lp64--;rv64ic-lp64--;rv64iac-lp64--;rv6 4imac-lp64--;rv64imafdc-lp64d--;rv64im-lp64--;" &&
make --jobs &&
make install

elf2hex

ENV PATH=$RISCV/riscv-gnu-toolchain/bin:$PATH WORKDIR /opt/riscv RUN git clone https://github.com/sifive/elf2hex.git &&
cd elf2hex &&
autoreconf -i &&
./configure --target=riscv64-unknown-elf --prefix=$RISCV &&
make &&
make install

QEMU

WORKDIR /opt/riscv RUN git clone --recurse-submodules https://github.com/qemu/qemu &&
cd qemu &&
./configure --target-list=riscv64-softmmu --prefix=$RISCV &&
make --jobs &&
make install

Spike

WORKDIR /opt/riscv RUN git clone https://github.com/riscv-software-src/riscv-isa-sim &&
mkdir riscv-isa-sim/build &&
cd riscv-isa-sim/build &&
../configure --prefix=$RISCV --enable-commitlog &&
make --jobs &&
make install &&
cd ../arch_test_target/spike/device &&
sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include &&
sed -i 's/--isa=rv64ic/--isa=rv64iac/' rv64i_m/privilege/Makefile.include

SAIL

WORKDIR /opt/riscv RUN opam init -y --disable-sandboxing RUN opam switch create ocaml-base-compiler.4.06.1 RUN opam install sail -y RUN eval $(opam config env) &&
cd $RISCV &&
git clone https://github.com/riscv/sail-riscv.git &&
cd sail-riscv &&
make &&
ARCH=RV32 make &&
ARCH=RV64 make &&
ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 $RISCV/bin/riscv_sim_RV64 &&
ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 $RISCV/bin/riscv_sim_RV32

Buildroot

WORKDIR /opt/riscv RUN git clone --recurse-submodules https://stineje:ghp_kXIHqiMSv4tFec2BCAvrhSrIh 3KNUD06IejU@github.com/davidharrishmc/riscv-wally.git ENV export WALLY=/opt/riscv/riscv-wally RUN git clone https://github.com/buildroot/buildroot.git &&
cd buildroot &&
git checkout 2021.05 &&
cp -r /opt/riscv/riscv-wally/linux/buildroot-config-src/wally ./board &&
cp ./board/wally/main.config .config &&
make --jobs

change to cad's hometown

WORKDIR /home/cad

D.3.7 Integrating Commercial CAD Tools into a Local Docker Container

RISC-V System-on-Chip Design Lecture Notes © 2023 D. Harris, J. Stine, , R. Thompson, and S. Harris These notes may be used and modified for educational and/or non-commercial purposes so long as the source is attributed.