diff --git a/.circleci/config.yml b/.circleci/config.yml index b708165877..7dcbc80957 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,7 +12,7 @@ parameters: executors: main-env: docker: - - image: ucbbar/chipyard-image:1.0.1 + - image: ucbbar/chipyard-ci-image:9c650dea environment: JVM_OPTS: -Xmx3200m # Customize the JVM maximum heap limit @@ -112,7 +112,7 @@ commands: default: "run-tests.sh" timeout: type: string - default: "10m" + default: "25m" steps: - setup-tools: tools-version: "<< parameters.tools-version >>" @@ -231,7 +231,7 @@ jobs: - run-tests: group-key: "group-cores" project-key: "chipyard-hetero" - timeout: "15m" + timeout: "20m" chipyard-boom-run-tests: executor: main-env steps: @@ -520,4 +520,3 @@ workflows: - prepare-chipyard-fpga: requires: - install-riscv-toolchain - diff --git a/.circleci/images/Dockerfile b/.circleci/images/Dockerfile deleted file mode 100644 index 7d03185026..0000000000 --- a/.circleci/images/Dockerfile +++ /dev/null @@ -1,216 +0,0 @@ -### Note: This DockerFile is adapted from https://github.com/CircleCI-Public/example-images/openjdk - -FROM openjdk:11.0.1-jdk-sid - -# man directory is missing in some base images -# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=863199 -RUN apt-get update \ - && mkdir -p /usr/share/man/man1 \ - && apt-get install -y \ - bzip2 \ - ca-certificates \ - curl \ - git \ - gnupg \ - gzip \ - libfl2 \ - libfl-dev \ - locales \ - mercurial \ - netcat \ - net-tools \ - openssh-client \ - parallel \ - sudo \ - tar \ - unzip \ - wget \ - xvfb \ - xxd \ - zip \ - ccache \ - libgoogle-perftools-dev \ - numactl \ - zlib1g - -# Set timezone to UTC by default -RUN ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime - -# Use unicode -RUN locale-gen C.UTF-8 || true -ENV LANG=C.UTF-8 - -# install jq -RUN JQ_URL="https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/jq-latest" \ - && curl --silent --show-error --location --fail --retry 3 --output /usr/bin/jq $JQ_URL \ - && chmod +x /usr/bin/jq \ - && jq --version - -# Install Docker - -# Docker.com returns the URL of the latest binary when you hit a directory listing -# We curl this URL and `grep` the version out. -# The output looks like this: - -#> # To install, run the following commands as root: -#> curl -fsSLO https://download.docker.com/linux/static/stable/x86_64/docker-17.05.0-ce.tgz && tar --strip-components=1 -xvzf docker-17.05.0-ce.tgz -C /usr/local/bin -#> -#> # Then start docker in daemon mode: -#> /usr/local/bin/dockerd - -RUN set -ex \ - && export DOCKER_VERSION=$(curl --silent --fail --retry 3 https://download.docker.com/linux/static/stable/x86_64/ | grep -o -e 'docker-[.0-9]*-ce\.tgz' | sort -r | head -n 1) \ - && DOCKER_URL="https://download.docker.com/linux/static/stable/x86_64/${DOCKER_VERSION}" \ - && echo Docker URL: $DOCKER_URL \ - && curl --silent --show-error --location --fail --retry 3 --output /tmp/docker.tgz "${DOCKER_URL}" \ - && ls -lha /tmp/docker.tgz \ - && tar -xz -C /tmp -f /tmp/docker.tgz \ - && mv /tmp/docker/* /usr/bin \ - && rm -rf /tmp/docker /tmp/docker.tgz \ - && which docker \ - && (docker version || true) - -# docker compose -RUN COMPOSE_URL="https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/docker-compose-latest" \ - && curl --silent --show-error --location --fail --retry 3 --output /usr/bin/docker-compose $COMPOSE_URL \ - && chmod +x /usr/bin/docker-compose \ - && docker-compose version - -# install dockerize -RUN DOCKERIZE_URL="https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/dockerize-latest.tar.gz" \ - && curl --silent --show-error --location --fail --retry 3 --output /tmp/dockerize-linux-amd64.tar.gz $DOCKERIZE_URL \ - && tar -C /usr/local/bin -xzvf /tmp/dockerize-linux-amd64.tar.gz \ - && rm -rf /tmp/dockerize-linux-amd64.tar.gz \ - && dockerize --version - -RUN groupadd --gid 3434 riscvuser \ - && useradd --uid 3434 --gid riscvuser --shell /bin/bash --create-home riscvuser \ - && echo 'riscvuser ALL=NOPASSWD: ALL' >> /etc/sudoers.d/50-riscvuser \ - && echo 'Defaults env_keep += "DEBIAN_FRONTEND"' >> /etc/sudoers.d/env_keep - -# BEGIN IMAGE CUSTOMIZATIONS - -# cacerts from OpenJDK 9-slim to workaround http://bugs.java.com/view_bug.do?bug_id=8189357 -# AND https://github.com/docker-library/openjdk/issues/145 -# -# Created by running: -# docker run --rm openjdk:9-slim cat /etc/ssl/certs/java/cacerts | # aws s3 cp - s3://circle-downloads/circleci-images/cache/linux-amd64/openjdk-9-slim-cacerts --acl public-read -RUN if java -fullversion 2>&1 | grep -q '"9.'; then curl --silent --show-error --location --fail --retry 3 --output /etc/ssl/certs/java/cacerts https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/openjdk-9-slim-cacerts; fi - -# Install Maven Version: 3.6.3 -RUN curl --silent --show-error --location --fail --retry 3 --output /tmp/apache-maven.tar.gz https://www.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz \ - && tar xf /tmp/apache-maven.tar.gz -C /opt/ \ - && rm /tmp/apache-maven.tar.gz \ - && ln -s /opt/apache-maven-* /opt/apache-maven \ - && /opt/apache-maven/bin/mvn -version - -# Install Ant Version: 1.10.5 -RUN curl --silent --show-error --location --fail --retry 3 --output /tmp/apache-ant.tar.gz https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.5-bin.tar.gz \ - && tar xf /tmp/apache-ant.tar.gz -C /opt/ \ - && ln -s /opt/apache-ant-* /opt/apache-ant \ - && rm -rf /tmp/apache-ant.tar.gz \ - && /opt/apache-ant/bin/ant -version - -ENV ANT_HOME=/opt/apache-ant - -# Install Gradle Version: 5.0 -RUN curl --silent --show-error --location --fail --retry 3 --output /tmp/gradle.zip https://services.gradle.org/distributions/gradle-5.0-bin.zip \ - && unzip -d /opt /tmp/gradle.zip \ - && rm /tmp/gradle.zip \ - && ln -s /opt/gradle-* /opt/gradle \ - && /opt/gradle/bin/gradle -version - -# Install sbt from https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/sbt-latest.tgz -RUN curl --silent --show-error --location --fail --retry 3 --output /tmp/sbt.tgz https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/sbt-latest.tgz \ - && tar -xzf /tmp/sbt.tgz -C /opt/ \ - && rm /tmp/sbt.tgz \ - && /opt/sbt/bin/sbt sbtVersion - -# Install openjfx -RUN apt-get update -RUN apt-get install -y --no-install-recommends openjfx - -# Add build-essential -RUN apt-get install -y build-essential - -# Add RISCV toolchain necessary dependencies -RUN apt-get update -RUN apt-get install -y \ - autoconf \ - automake \ - autotools-dev \ - babeltrace \ - bc \ - curl \ - device-tree-compiler \ - expat \ - flex \ - gawk \ - gperf \ - g++ \ - libexpat-dev \ - libgmp-dev \ - libmpc-dev \ - libmpfr-dev \ - libtool \ - libusb-1.0-0-dev \ - make \ - patchutils \ - pkg-config \ - python \ - python-pexpect-doc \ - python3 \ - texinfo \ - zlib1g-dev \ - rsync - -# Use specific bison version to bypass Verilator 4.034 issues -# TODO: When Verilator is bumped, use apt to get newest bison -RUN wget https://ftp.gnu.org/gnu/bison/bison-3.5.4.tar.gz \ - && tar -xvf bison-3.5.4.tar.gz \ - && cd bison-3.5.4 \ - && ./configure && make && make install - -# Check bison version is 3.5.4 -RUN bison --version - -# Add minimal QEMU dependencies -RUN apt-get install -y \ - libfdt-dev \ - libglib2.0-dev \ - libpixman-1-dev - -# Install verilator -RUN git clone http://git.veripool.org/git/verilator \ - && cd verilator \ - && git pull \ - && git checkout v4.034 \ - && autoconf && ./configure && make && make install - -# Update PATH for Java tools -ENV PATH="/opt/sbt/bin:/opt/apache-maven/bin:/opt/apache-ant/bin:/opt/gradle/bin:$PATH" - -# Add HOME environment variable -ENV HOME="/home/riscvuser" - -# Update PATH for RISCV toolchain (note: hardcoded for CircleCI) -ENV RISCV="$HOME/riscv-tools-install" -ENV LD_LIBRARY_PATH="$RISCV/lib" -ENV PATH="$RISCV/bin:$PATH" - -WORKDIR $HOME -USER riscvuser - -# smoke test with path -RUN mvn -version \ - && ant -version \ - && gradle -version \ - && sbt sbtVersion \ - && verilator --version - -# remove extra folders -RUN rm -rf project/ - -# END IMAGE CUSTOMIZATIONS - -CMD ["/bin/sh"] diff --git a/.circleci/images/README.md b/.circleci/images/README.md deleted file mode 100644 index a2172ba27f..0000000000 --- a/.circleci/images/README.md +++ /dev/null @@ -1,18 +0,0 @@ -General -------- -This DockerFile contains the necessary steps to build a Docker container that can run -projects with riscv-tools, chisel3, firrtl, and verilator. It installs the necessary -apt-get packages and sets the environment variables needed in CircleCI. - -Build and Deploy the Container ------------------------------- - - sudo docker build . # to test build before building it with a tag - sudo docker build -t :tag . # to build with tag (ex. 0.0.3) - sudo docker login # login into the account to push to - sudo docker push :tag # to push to repo with tag - -Path Names ----------- -Older docker images (when this Dockerfile was in `riscv-boom/riscv-boom`) can be found in the `riscvboom/riscvboom-images`. -Current up-to-date images are located in `ucbbar/chipyard-image` diff --git a/dockerfiles/Dockerfile b/dockerfiles/Dockerfile new file mode 100644 index 0000000000..d9fcfa0f47 --- /dev/null +++ b/dockerfiles/Dockerfile @@ -0,0 +1,67 @@ +### This is a full chipyard setup + +# BUILD BASE FOR CI + +FROM ubuntu:18.04 as base +ARG CHIPYARD_HASH + +MAINTAINER https://groups.google.com/forum/#!forum/chipyard + +# Install dependencies for ubuntu-req.sh +RUN apt-get update && \ + DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ + curl \ + git \ + sudo \ + ca-certificates \ + keyboard-configuration \ + console-setup + +# Adds a new user called riscvuser +RUN groupadd --gid 3434 riscvuser \ + && useradd --uid 3434 --gid riscvuser --shell /bin/bash --create-home riscvuser \ + && echo 'riscvuser ALL=NOPASSWD: ALL' >> /etc/sudoers.d/50-riscvuser \ + && echo 'Defaults env_keep += "DEBIAN_FRONTEND"' >> /etc/sudoers.d/env_keep + +WORKDIR /home/riscvuser +USER riscvuser + +# Update PATH for RISCV toolchain (note: hardcoded for CircleCI) +ENV RISCV="/home/riscvuser/riscv-tools-install" +ENV LD_LIBRARY_PATH="$RISCV/lib" +ENV PATH="$RISCV/bin:$PATH" + +# Install Chipyard and run ubuntu-req.sh to install necessary dependencies +RUN git clone https://github.com/ucb-bar/chipyard.git && \ + cd chipyard && \ + git checkout $CHIPYARD_HASH && \ + ./scripts/ubuntu-req.sh 1>/dev/null && \ + sudo rm -rf /var/lib/apt/lists/* + + +# BUILD IMAGE WITH TOOLCHAINS + +# Use above build as base +FROM base as base-with-tools + +# Init submodules +RUN cd chipyard && \ + export MAKEFLAGS=-"j $(nproc)" && \ + ./scripts/init-submodules-no-riscv-tools.sh 1>/dev/null + +# Install riscv-tools +RUN cd chipyard && \ + export MAKEFLAGS=-"j $(nproc)" && \ + ./scripts/build-toolchains.sh riscv-tools 1>/dev/null + +# Install esp-tools +RUN cd chipyard && \ + export MAKEFLAGS=-"j $(nproc)" && \ + ./scripts/build-toolchains.sh esp-tools 1>/dev/null + +# Run script to set environment variables on entry +ENTRYPOINT ["chipyard/scripts/entrypoint.sh"] + +# END IMAGE CUSTOMIZATIONS + +CMD ["/bin/sh"] diff --git a/dockerfiles/README.md b/dockerfiles/README.md new file mode 100644 index 0000000000..09ede71513 --- /dev/null +++ b/dockerfiles/README.md @@ -0,0 +1,22 @@ +General +------- +This DockerFile contains the necessary steps to build a Docker container that can run +projects with riscv-tools, chisel3, firrtl, and verilator. When run up to the base stage, it installs the necessary +apt-get packages and sets the environment variables needed for CircleCI. When run up to the base-with-tools stage, it initializes and installs the necessary toolchains for running simulations and testing projects. + +Build and Deploy the Container +------------------------------ + + sudo docker build --target base . # to build the image for the CI + sudo docker build --target base --build-arg CHIPYARD_HASH= . # to build the image for the CI from a specific chipyard commit + sudo docker build --target base-with-tools . # to build the full image + sudo docker tag :tag . # to tag the image after the build (ex. 0.0.3) + sudo docker login # login into the account to push to + sudo docker push :tag # to push to repo with tag + sudo docker run -it bash # to run an interactive version of the container + +Path Names +---------- +Older docker images (when this Dockerfile was in `riscv-boom/riscv-boom`) can be found in the `riscvboom/riscvboom-images`. +Current up-to-date images are located in `ucbbar/chipyard-image`. NOTE: Less recent images in this path may not have toolchains initialized +Current up-to-date CI images are located in `ucbbar/chipyard-ci-image`. diff --git a/docs/Chipyard-Basics/Initial-Repo-Setup.rst b/docs/Chipyard-Basics/Initial-Repo-Setup.rst index 78301088d8..a3de22b880 100644 --- a/docs/Chipyard-Basics/Initial-Repo-Setup.rst +++ b/docs/Chipyard-Basics/Initial-Repo-Setup.rst @@ -66,6 +66,22 @@ You can put this in your ``.bashrc`` or equivalent environment setup file to get These variables need to be set for the ``make`` system to work properly. +Pre-built Docker Image +------------------------------------------- + +An alternative to setting up the Chipyard repository locally is to pull the pre-built Docker image from Docker Hub. The image comes with all dependencies installed, Chipyard cloned, and toolchains initialized. This image sets up baseline Chipyard (not including FireMarshal, FireSim, and Hammer initializations). Each image comes with a tag that corresponds to the version of Chipyard cloned/set-up in that image. Not including a tag during the pull will pull the image with the latest version of Chipyard. +First, pull the Docker image. Run: + +.. code-block:: shell + + sudo docker pull ucbbar/chipyard-image: + +To run the Docker container in an interactive shell, run: + +.. code-block:: shell + + sudo docker run -it ucbbar/chipyard-image bash + What's Next? ------------------------------------------- diff --git a/scripts/centos-req.sh b/scripts/centos-req.sh index 89e8644c36..1a1439d1d7 100755 --- a/scripts/centos-req.sh +++ b/scripts/centos-req.sh @@ -18,6 +18,7 @@ sudo yum install -y centos-release-scl sudo yum install -y devtoolset-8-make # install DTC sudo yum install -y dtc +sudo yum install -y python # install verilator git clone http://git.veripool.org/git/verilator diff --git a/scripts/entrypoint.sh b/scripts/entrypoint.sh new file mode 100755 index 0000000000..41e5bda580 --- /dev/null +++ b/scripts/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# used with the dockerfile to set up enviroment variables by running env.sh +# adapted from https://stackoverflow.com/questions/55921914/how-to-source-a-script-with-environment-variables-in-a-docker-build-process + +. /home/riscvuser/chipyard/env.sh + +exec "$@" diff --git a/scripts/ubuntu-req.sh b/scripts/ubuntu-req.sh index 3bc22c7395..b33a6649e8 100755 --- a/scripts/ubuntu-req.sh +++ b/scripts/ubuntu-req.sh @@ -19,6 +19,7 @@ sudo apt-get install -y libgtk-3-dev gettext sudo apt-get install -y python3-pip python3.6-dev rsync libguestfs-tools expat ctags # install DTC sudo apt-get install -y device-tree-compiler +sudo apt-get install -y python # install verilator git clone http://git.veripool.org/git/verilator