diff --git a/.gitmodules b/.gitmodules index f95a898bb..54ed892d3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,3 @@ -[submodule "sky130/sky130_osu_sc_t12"] - path = sky130/sky130_osu_sc_t12 - url = https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12/ -[submodule "addins/imperas-riscv-tests"] - path = addins/imperas-riscv-tests - url = https://github.com/riscv-ovpsim/imperas-riscv-tests [submodule "addins/riscv-dv"] path = addins/riscv-dv url = https://github.com/google/riscv-dv @@ -29,7 +23,7 @@ url = https://github.com/ross144/branch-predictor-simulator [submodule "addins/ahbsdc"] path = addins/ahbsdc - url = http://github.com/JacobPease/ahbsdc.git + url = https://github.com/JacobPease/ahbsdc.git [submodule "addins/verilog-ethernet"] sparseCheckout = true path = addins/verilog-ethernet diff --git a/README.md b/README.md index 084741107..39b5c6780 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # core-v-wally -Wally is a 5-stage pipelined processor configurable to support all the standard RISC-V options, incluidng RV32/64, A, C, F, D, Q, M, and Zb* extensions, virtual memory, PMP, and the various privileged modes and CSRs. It provides optional caches, branch prediction, and standard RISC-V peripherals (CLINT, PLIC, UART, GPIO). Wally is written in SystemVerilog. It passes the RISC-V Arch Tests and boots Linux on an FPGA. Configurations range from a minimal RV32E core to a fully featured RV64GC application processor. +Wally is a 5-stage pipelined processor configurable to support all the standard RISC-V options, including RV32/64, A, B, C, D, F, M, Q, and Zk* extensions, virtual memory, PMP, and the various privileged modes and CSRs. It provides optional caches, branch prediction, and standard RISC-V peripherals (CLINT, PLIC, UART, GPIO). Wally is written in SystemVerilog. It passes the [RISC-V Arch Tests](https://github.com/riscv-non-isa/riscv-arch-test) and boots Linux on an FPGA. Configurations range from a minimal RV32E core to a fully featured RV64GC application processor. ![Wally block diagram](wallyriscvTopAll.png) @@ -29,76 +29,108 @@ Then fork and clone the repo, source setup, make the tests and run regression If you don't already have a Github account, create one In a web browser, visit https://github.com/openhwgroup/cvw In the upper right part of the screen, click on Fork - Create a fork, choosing the owner as your github account + Create a fork, choosing the owner as your github account and the repository as cvw. - + On the Linux computer where you will be working, log in -Clone your fork of the repo and run the setup script. Change to your github id. +Clone your fork of the repo. Change `` to your github id. $ git clone --recurse-submodules https://github.com//cvw $ cd cvw $ git remote add upstream https://github.com/openhwgroup/cvw + +If you are installing on a new system without any tools installed, please jump to the next section, Toolchain Installation then come back here. + +Run the setup script to update your `PATH` and activate the python virtual environment. + $ source ./setup.sh -If you are installing on a new system without any tools installed please jump to the next section, Toolchain Installation then come back here. - -Add the following lines to your .bashrc or .bash_profile to run the setup script each time you log in. +Add the following lines to your `.bashrc` or `.bash_profile` to run the setup script each time you log in. if [ -f ~/cvw/setup.sh ]; then source ~/cvw/setup.sh fi -If the tools are not yet installed on your server, follow the Toolchain Installation instructions in the section below. -Build the tests and run a regression simulation with Questa to prove everything is installed. Building tests will take a while. +Build the tests and run a regression simulation to prove everything is installed. Building tests will take a while. $ make - $ regression-wally (depends on having Questa installed) + $ regression-wally -# Toolchain Installation (Sys Admin) +# Toolchain Installation and Configuration (Sys Admin) -This section describes the open source toolchain installation. The -current version of the toolchain has been tested on Ubuntu and partly on Red -Hat/Rocky 8 Linux. Ubuntu works more smoothly and is recommended -unless you have a compelling need for RedHat. However, Ubuntu 22.04LTS -is incompatible with Synopsys Design Compiler. +This section describes the open source toolchain installation. -Ubuntu users can install the tools by running +### Compatibility +The current version of the toolchain has been tested on Ubuntu (versions 20.04 LTS, 22.04 LTS, and 24.04 LTS) and on Red Hat/Rocky/AlmaLinux (versions 8 and 9). - $ sudo $WALLY/bin/wally-tool-chain-install.sh +NOTE: Ubuntu 22.04LTS is incompatible with Synopsys Design Compiler. -The default installation directory is /opt/riscv defined by the environment variable RISCV. You must copy and edit ~/cvw/site-setup.sh to $RISCV/site-setup.sh. +### Overview +The toolchain installation script installs the following tools: +- [RISC-V GNU Toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain): GCC and accompanying compiler tools +- [elf2hex](https://github.com/sifive/elf2hex): executable file to hexadecimal converter +- [QEMU](https://www.qemu.org/docs/master/system/target-riscv.html): emulator +- [Spike](https://github.com/riscv-software-src/riscv-isa-sim): functional RISC-V model +- [Verilator](https://github.com/verilator/verilator): open-source Verilog simulator + - NOTE: Verilator does not currently work reliably for simulating Wally on Ubuntu 20.04 LTS and Red Hat 8 +- [RISC-V Sail Model](https://github.com/riscv/sail-riscv): golden reference model for RISC-V +- [OSU Skywater 130 cell library](https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12): standard cell library +- [RISCOF](https://github.com/riscv-software-src/riscof.git): RISC-V compliance test framework -~/cvw/setup.sh sources $RISCV/site-setup.sh. -This allows for customization of the site specific information such as commerical licenses and PATH variables. +Additionally, Buildroot Linux is built for Wally and linux test-vectors are generated for simulation. See the [Linux README](linux/README.md) for more details. -Change the following lines to point to the path and license server for your Siemens Questa and Synopsys Design Compiler installation and license server. If you only have Questa, you can still simulate but cannot run logic synthesis. If Questa or Design Compiler are already setup on this system then don't set these variables. +### Installation + +The tools can be installed by running + + $ $WALLY/bin/wally-tool-chain-install.sh + +If this script is run as root or using `sudo`, it will also install all of the prerequisite packages using the system package manager. The default installation directory when run in this manner is `/opt/riscv`. + +If a user-level installation is desired, the script can instead be run by any user without `sudo` and the installation directory will be `~/riscv`. In this case, the prerequisite packages must first be installed by running + + $ sudo $WALLY/bin/wally-package-install.sh + +In either case, the installation directory can be overridden by passing the desired directory as the last argument to the installation script. For example, + + $ sudo $WALLY/bin/wally-tool-chain-install.sh /home/riscv + +See `wally-tool-chain-install.sh` for a detailed description of each component, or to issue the commands one at a time to install on the command line. + +**NOTE:** The complete installation process requires ~55 GB of free space. If the `--clean` flag is passed as the first argument to the installation script then the final consumed space is only ~26 GB, but upgrading the tools requires reinstalling from scratch. + +### Configuration +`$WALLY/setup.sh` sources `$RISCV/site-setup.sh`. If the toolchain was installed in either of the default locations (`/opt/riscv` or `~/riscv`), `$RISCV` will automatically be set to the correct path when `setup.sh` is run. If a custom installation directory was used, then `$WALLY/setup.sh` must be modified to set the correct path. + +`$RISCV/site-setup.sh` allows for customization of the site specific information such as commercial licenses and PATH variables. It is automatically copied into your `$RISCV` folder when the installation script is run. + +Change the following lines to point to the path and license server for your Siemens Questa and Synopsys Design Compiler and VCS installations and license servers. If you only have Questa or VCS, you can still simulate but cannot run logic synthesis. If Questa, VSC, or Design Compiler are already setup on this system then don't set these variables. export MGLS_LICENSE_FILE=.. # Change this to your Siemens license server export SNPSLMD_LICENSE_FILE=.. # Change this to your Synopsys license server - export QUESTAPATH=.. # Change this for your path to Questa - export SNPSPATH=.. # Change this for your path to Design Compiler + export QUESTA_HOME=.. # Change this for your path to Questa + export DC_HOME=.. # Change this for your path to Synopsys Design Compiler + export VCS_HOME=.. # Change this for your path to Synopsys VCS -See wally-tool-chain-install.sh for a detailed description of each component, -or to issue the commands one at a time to install on the command line. -## Installing EDA Tools +# Installing EDA Tools Electronic Design Automation (EDA) tools are vital to implementations of System on Chip architectures as well as validating different designs. Open-source and commercial tools exist for multiple strategies and although the one can spend a lifetime using combinations of different tools, only a small subset of tools is utilized for this text. The tools are chosen because of their ease in access as well as their repeatability for accomplishing many of the tasks utilized to design Wally. It is anticipated that additional tools may be documented later after this is text is published to improve use and access. -Siemens Quest is the primary tool utilized for simulating and validating Wally. For logic synthesis, you will need Synopsys Design Compiler. Questa and Design Compiler are commercial tools that require an educational or commercial license. +Siemens Questa is the primary tool utilized for simulating and validating Wally. For logic synthesis, you will need Synopsys Design Compiler. Questa and Design Compiler are commercial tools that require an educational or commercial license. -Note: Some EDA tools utilize LM_LICENSE_FILE for their environmental variable to point to their license server. Some operating systems may also utilize MGLS_LICENSE_FILE instead, therefore, it is important to read the user manual on the preferred environmental variable required to point to a user’s license file. Although there are different mechanisms to allow licenses to work, many companies commonly utilize the FlexLM (i.e., Flex-enabled) license server manager that runs off a node locked license. +Note: Some EDA tools utilize `LM_LICENSE_FILE` for their environmental variable to point to their license server. Some operating systems may also utilize `MGLS_LICENSE_FILE` instead, therefore, it is important to read the user manual on the preferred environmental variable required to point to a user’s license file. Although there are different mechanisms to allow licenses to work, many companies commonly utilize the FlexLM (i.e., Flex-enabled) license server manager that runs off a node locked license. -Although most EDA tools are Linux-friendly, they tend to have issues when not installed on recommended OS flavors. Both Red Hat Enterprise Linux and SUSE Linux products typically tend to be recommended for installing commercial-based EDA tools and are recommended for utilizing complex simulation and architecture exploration. Questa can also be installed on Microsoft Windows as well as Mac OS with a Virtual Machine such as Parallels. +Although most EDA tools are Linux-friendly, they tend to have issues when not installed on recommended OS flavors. Both Red Hat Enterprise Linux and SUSE Linux products typically tend to be recommended for installing commercial-based EDA tools and are recommended for utilizing complex simulation and architecture exploration. Questa can also be installed on Microsoft Windows as well as Mac OS with a Virtual Machine such as Parallels. -Siemens Questa +### Siemens Questa -Siemens Questa simulates behavioral, RTL and gate-level HDL. To install Siemens Questa first go to a web browser and navigate to -https://eda.sw.siemens.com/en-US/ic/questa/simulation/advanced-simulator/. Click Sign In and log in with your credentials and the product can easily be downloaded and installed. Some Windows-based installations also require gcc libraries that are typically provided as a compressed zip download through Siemens. +Siemens Questa simulates behavioral, RTL and gate-level HDL. To install Siemens Questa first go to a web browser and navigate to +https://eda.sw.siemens.com/en-US/ic/questa/simulation/advanced-simulator/. Click Sign In and log in with your credentials and the product can easily be downloaded and installed. Some Windows-based installations also require gcc libraries that are typically provided as a compressed zip download through Siemens. -Synopsys Design Compiler (DC) +### Synopsys Design Compiler (DC) Many commercial synthesis and place and route tools require a common installer. These installers are provided by the EDA vendor and Synopsys has one called Synopsys Installer. To use Synopsys Installer, you will need to acquire a license through Synopsys that is typically Called Synopsys Common Licensing (SCL). Both the Synopsys Installer, license key file, and Design Compiler can all be downloaded through Synopsys Solvnet. First open a web browser, log into Synsopsy Solvnet, and download the installer and Design Compiler installation files. Then, install the Installer @@ -110,7 +142,7 @@ Select the latest version (currently 5.4). Click Download Here, agree, Click on SynopsysInstaller_v5.4.run Return to downloads and also get Design Compiler (synthesis) latest version, and any others you want. Click on all parts and the .spf file, then click Download Files near the top -move the SynopsysIntaller into /cad/synopsys/Installer_5.4 with 755 permission for cad, +move the SynopsysInstaller into /cad/synopsys/Installer_5.4 with 755 permission for cad, move other files into /cad/synopsys/downloads and work as user cad from here on $ cd /cad/synopsys/installer_5.4 @@ -121,22 +153,22 @@ move other files into /cad/synopsys/downloads and work as user cad from here on When prompted, enter your site ID Follow prompts -Installer can be utilized in graphical or text-based modes. It is far easier to use the text-based installation tool. To install DC, navigate to the location where your downloaded DC files are and type installer. You should be prompted with questions related to where you wish to have your files installed. +Installer can be utilized in graphical or text-based modes. It is far easier to use the text-based installation tool. To install DC, navigate to the location where your downloaded DC files are and type installer. You should be prompted with questions related to where you wish to have your files installed. The Synopsys Installer automatically installs all downloaded product files into a single top-level target directory. You do not need to specify the installation directory for each product. For example, if you specify /import/programs/synopsys as the target directory, your installation directory structure might look like this after installation: /import/programs/synopsys/syn/S-2021.06-SP1 -Note: Although most parts of Wally, including the software used in this chapter and Questa simulation, will work on most modern Linux platforms, as of 2022, the Synopsys CAD tools for SoC design are only supported on RedHat Enterprise Linux 7.4 or 8 or SUSE Linux Enterprise Server (SLES) 12 or 15. Moreover, the RISC-V formal specification (sail-riscv) does not build gracefully on RHEL7. +Note: Although most parts of Wally, including the Questa simulator, will work on most modern Linux platforms, as of 2022, the Synopsys CAD tools for SoC design are only supported on RedHat Enterprise Linux 7.4 or 8 or SUSE Linux Enterprise Server (SLES) 12 or 15. Moreover, the RISC-V formal specification (sail-riscv) does not build gracefully on RHEL7. -The Verilog simulation has been tested with Siemens Questa/ModelSim. This package is available to universities worldwide as part of the Design Verification Bundle through the Siemens Academic Partner Program members for $990/year. +The Verilog simulation has been tested with Siemens Questa/ModelSim. This package is available to universities worldwide as part of the Design Verification Bundle through the Siemens Academic Partner Program members for $990/year. -If you want to implement your own version of the chip, your tool and license complexity rises significantly. Logic synthesis uses Synopsys Design Compiler. Placement and routing uses Cadence Innovus. Both Synopsys and Cadence offer their tools at a steep discount to their university program members, but the cost is still several thousand dollars per year. Most research universities with integrated circuit design programs have Siemens, Synopsys, and Cadence licenses. You also need a process design kit (PDK) for a specific integrated circuit technology and its libraries. The open-source Google Skywater 130 nm PDK is sufficient to synthesize the core but lacks memories. Google presently funds some fabrication runs for universities. IMEC and Muse Semiconductor offers full access to multiproject wafer fabrication on the TSMC 28 nm process including logic, I/O, and memory libraries; this involves three non-disclosure agreements. Fabrication costs on the order of $10,000 for a batch of 1 mm2 chips. +If you want to implement your own version of the chip, your tool and license complexity rises significantly. Logic synthesis uses Synopsys Design Compiler. Placement and routing uses Cadence Innovus. Both Synopsys and Cadence offer their tools at a steep discount to their university program members, but the cost is still several thousand dollars per year. Most research universities with integrated circuit design programs have Siemens, Synopsys, and Cadence licenses. You also need a process design kit (PDK) for a specific integrated circuit technology and its libraries. The open-source Google Skywater 130 nm PDK is sufficient to synthesize the core but lacks memories. Google presently funds some fabrication runs for universities. IMEC and Muse Semiconductor offers full access to multiproject wafer fabrication on the TSMC 28 nm process including logic, I/O, and memory libraries; this involves three non-disclosure agreements. Fabrication costs on the order of $10,000 for a batch of 1 mm2 chips. Startups can expect to spend more than $1 million on CAD tools to get a chip to market. Commercial CAD tools are not realistically available to individuals without a university or company connection. -## Adding Cron Job for nightly builds +# Adding Cron Job for nightly builds If you want to add a cronjob you can do the following: 1) Set up the email client `mutt` for your distribution @@ -183,7 +215,7 @@ Run lockstep against ImperasDV with a single elf file. Compute coverage. wsim rv64gc ../../tests/riscof/work/riscv-arch-test/rv64i_m/I/src/add-01.S/ref/ref.elf --lockstep --coverage -Run lockstep against ImperasDV with directory file. +Run lockstep against ImperasDV with directory file. wsim rv64gc ../../tests/riscof/work/riscv-arch-test/rv64i_m/I/src/ --lockstep diff --git a/benchmarks/coremark/coremark_sweep.py b/benchmarks/coremark/coremark_sweep.py index d912349dc..8cfce025d 100755 --- a/benchmarks/coremark/coremark_sweep.py +++ b/benchmarks/coremark/coremark_sweep.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 ################################################## ## coremark_sweep.py diff --git a/benchmarks/embench/embench_arch_sweep.py b/benchmarks/embench/embench_arch_sweep.py index 14b1f1b0c..99d49e7be 100755 --- a/benchmarks/embench/embench_arch_sweep.py +++ b/benchmarks/embench/embench_arch_sweep.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # embench_arch_sweep.py # David_Harris@hmc.edu 16 November 2023 # SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 diff --git a/benchmarks/graphGen.py b/benchmarks/graphGen.py index dd7b3a204..95e48db6e 100755 --- a/benchmarks/graphGen.py +++ b/benchmarks/graphGen.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Daniel Torres 2022 # SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 diff --git a/bin/derivgen.pl b/bin/derivgen.pl index 88b9be04a..58991faae 100755 --- a/bin/derivgen.pl +++ b/bin/derivgen.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl -W +#!/usr/bin/env -S perl -w ########################################### ## derivgen.pl diff --git a/bin/exe2memfile.pl b/bin/exe2memfile.pl index 4f04ff512..2d09c1fdb 100755 --- a/bin/exe2memfile.pl +++ b/bin/exe2memfile.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/env -S perl -w ########################################### ## exe2memfile.pl diff --git a/bin/fparchtest.sh b/bin/fparchtest.sh index 7ea690e96..7c5b0d28f 100755 --- a/bin/fparchtest.sh +++ b/bin/fparchtest.sh @@ -1,4 +1,4 @@ -#!/usr/bin/bash +#!/bin/bash # # fparchtest.sh # David_Harris@hmc.edu 26 December 2023 diff --git a/bin/libppa.pl b/bin/libppa.pl index 9f1e8515d..eddfc3686 100755 --- a/bin/libppa.pl +++ b/bin/libppa.pl @@ -1,4 +1,4 @@ -#!/bin/perl -W +#!/usr/bin/env -S perl -w ########################################### ## libppa.pl @@ -43,7 +43,7 @@ my @cr; my @cf; my @rt; my @ft; my $libpath; my $libbase; my $cellname; my @corners; # Sky130 -$libpath ="/opt/riscv/cad/lib/sky130_osu_sc_t12/12T_ms/lib"; +$libpath ="$ENV{RISCV}/cad/lib/sky130_osu_sc_t12/12T_ms/lib"; $libbase = "sky130_osu_sc_12T_ms_"; $cellname = "sky130_osu_sc_12T_ms__inv_1"; @corners = ("TT_1P8_25C.ccs", "tt_1P80_25C.ccs", "tt_1P62_25C.ccs", "tt_1P89_25C.ccs", "ss_1P60_-40C.ccs", "ss_1P60_100C.ccs", "ss_1P60_150C.ccs", "ff_1P95_-40C.ccs", "ff_1P95_100C.ccs", "ff_1P95_150C.ccs"); @@ -53,7 +53,7 @@ foreach my $corner (@corners) { } # Sky90 -$libpath ="/opt/riscv/cad/lib/sky90/sky90_sc/V1.7.4/lib"; +$libpath ="$ENV{RISCV}/cad/lib/sky90/sky90_sc/V1.7.4/lib"; $libbase = "scc9gena_"; $cellname = "scc9gena_inv_1"; @corners = ("tt_1.2v_25C", "tt_1.08v_25C", "tt_1.32v_25C", "tt_1.2v_-40C", "tt_1.2v_85C", "tt_1.2v_125C", "ss_1.2v_25C", "ss_1.08v_-40C", "ss_1.08v_25C", "ss_1.08v_125C", "ff_1.2v_25C", "ff_1.32v_-40C", "ff_1.32v_25C", "ff_1.32v_125C"); diff --git a/bin/nightly_build.py b/bin/nightly_build.py index 08052ffe1..629da074e 100755 --- a/bin/nightly_build.py +++ b/bin/nightly_build.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 """ Python Regression Build Automation Script diff --git a/bin/parseHPMC.py b/bin/parseHPMC.py index fd4efe20e..4408f2211 100755 --- a/bin/parseHPMC.py +++ b/bin/parseHPMC.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 ########################################### ## Written: Rose Thompson ross1728@gmail.com diff --git a/bin/regression-wally b/bin/regression-wally index e83c3b5fa..95c3a7c99 100755 --- a/bin/regression-wally +++ b/bin/regression-wally @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 ################################## # # regression-wally diff --git a/bin/requirements.txt b/bin/requirements.txt new file mode 100644 index 000000000..0f72b5af1 --- /dev/null +++ b/bin/requirements.txt @@ -0,0 +1,14 @@ +adjustText>=1.2 +lief>=0.14.1 +Markdown>=3.6 +matplotlib>=3.9.0 +PyYAML>=5.2 +riscv-isac @ git+https://github.com/riscv-software-src/riscv-isac@dev +riscof @ git+https://github.com/riscv/riscof.git +riscv-config>=3.18.3 +riscv-isac>=0.18.0 +scikit-learn>=1.5.0 +scipy>=1.13.0 +Sphinx>=7.3.7 +sphinx-rtd-theme>=2.0.0 +testresources>=2.0.1 diff --git a/bin/testlist.pl b/bin/testlist.pl index c72b96961..50b77eb78 100755 --- a/bin/testlist.pl +++ b/bin/testlist.pl @@ -1,4 +1,4 @@ -#!/bin/perl -W +#!/usr/bin/env -S perl -w ########################################### ## testlist.pl diff --git a/bin/vclean.pl b/bin/vclean.pl index 294d1d435..94a14c54c 100755 --- a/bin/vclean.pl +++ b/bin/vclean.pl @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/env -S perl -w ########################################### ## vclean.pl diff --git a/bin/wally-distro-check.sh b/bin/wally-distro-check.sh new file mode 100755 index 000000000..92d284b05 --- /dev/null +++ b/bin/wally-distro-check.sh @@ -0,0 +1,92 @@ +#!/bin/bash +########################################### +## Get Linux distro information +## +## Written: Jordan Carlin, jcarlin@hmc.edu +## Created: 30 June 2024 +## Modified: +## +## Purpose: Check for compatible Linux distibution and set variables accordingly +## +## A component of the CORE-V-WALLY configurable RISC-V project. +## https://github.com/openhwgroup/cvw +## +## Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University +## +## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +## +## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file +## except in compliance with the License, or, at your option, the Apache License version 2.0. You +## may obtain a copy of the License at +## +## https:##solderpad.org/licenses/SHL-2.1/ +## +## Unless required by applicable law or agreed to in writing, any work distributed under the +## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +## either express or implied. See the License for the specific language governing permissions +## and limitations under the License. +################################################################################################ + +set -e # break on error + +# Colors +BOLD='\033[1m' +UNDERLINE='\033[4m' +SECTION_COLOR='\033[95m'$BOLD +OK_COLOR='\033[94m' +WARNING_COLOR='\033[93m' +FAIL_COLOR='\033[91m' +ENDC='\033[0m' # Reset to default color + +# Print section header +section_header() { + if tput cols > /dev/null 2>&1; then + printf "${SECTION_COLOR}%$(tput cols)s" | tr ' ' '#' + printf "%$(tput cols)s" | tr ' ' '#' + echo -e "$1" + printf "%$(tput cols)s" | tr ' ' '#' + printf "%$(tput cols)s${ENDC}" | tr ' ' '#' + else + echo -e "${SECTION_COLOR}$1${ENDC}" + fi +} + +section_header "Checking System Requirements and Configuring Installation" + +# Get distribution information +test -e /etc/os-release && os_release="/etc/os-release" || os_release="/usr/lib/os-release" +source "$os_release" + +# Check for compatible distro +if [[ "$ID" == rhel || "$ID_LIKE" == *rhel* ]]; then + export FAMILY=rhel + if [ "$ID" != rhel ] && [ "$ID" != rocky ] && [ "$ID" != almalinux ]; then + printf "${WARNING_COLOR}%s\n${ENDC}" "For Red Hat family distros, the Wally install script has only been tested on RHEL, Rocky Linux," \ + " and AlmaLinux. Your distro is $PRETTY_NAME. The regular Red Hat install will be attempted, but there may be issues." + fi + export RHEL_VERSION="${VERSION_ID:0:1}" + if (( RHEL_VERSION < 8 )); then + echo "${FAIL_COLOR}The Wally install script is only compatible with versions 8 and 9 of RHEL, Rocky Linux, and AlmaLinux. You have version $VERSION.${ENDC}" + exit 1 + fi +elif [[ "$ID" == ubuntu || "$ID_LIKE" == *ubuntu* ]]; then + export FAMILY=ubuntu + if [ "$ID" != ubuntu ]; then + printf "${WARNING_COLOR}%s\n${ENDC}" "For Ubuntu family distros, the Wally install script has only been tested on standard Ubuntu. Your distro " \ + "is $PRETTY_NAME. The regular Ubuntu install will be attempted, but there may be issues." + fi + export UBUNTU_VERSION="${VERSION_ID:0:2}" + if (( UBUNTU_VERSION < 20 )); then + echo "${FAIL_COLOR}The Wally install script has only been tested with versions 20.04 LTS, 22.04 LTS, and 24.04 LTS of Ubuntu. You have version $VERSION.${ENDC}" + exit 1 + fi +else + printf "${FAIL_COLOR}%s\n${ENDC}" "The Wally install script is currently only compatible with Ubuntu and Red Hat family " \ + "(RHEL, Rocky Linux, or AlmaLinux) distros. Your detected distro is $PRETTY_NAME. You may try manually running the " \ + "commands in this script, but it is likely that some will need to be altered." + exit 1 +fi + +echo -e "${OK_COLOR}${UNDERLINE}Detected information${ENDC}" +echo "Distribution: $PRETTY_NAME" +echo "Version: $VERSION" diff --git a/bin/wally-package-install.sh b/bin/wally-package-install.sh new file mode 100755 index 000000000..8fea2d27b --- /dev/null +++ b/bin/wally-package-install.sh @@ -0,0 +1,129 @@ +#!/bin/bash +########################################### +## Package installation +## +## Written: Jordan Carlin, jcarlin@hmc.edu +## Created: 30 June 2024 +## Modified: +## +## Purpose: Package manager installation for open source tool chain installation script +## +## A component of the CORE-V-WALLY configurable RISC-V project. +## https://github.com/openhwgroup/cvw +## +## Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University +## +## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 +## +## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file +## except in compliance with the License, or, at your option, the Apache License version 2.0. You +## may obtain a copy of the License at +## +## https:##solderpad.org/licenses/SHL-2.1/ +## +## Unless required by applicable law or agreed to in writing, any work distributed under the +## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +## either express or implied. See the License for the specific language governing permissions +## and limitations under the License. +################################################################################################ + +set -e # break on error + +# Colors +BOLD='\033[1m' +SECTION_COLOR='\033[95m'$BOLD +SUCCESS_COLOR='\033[92m' +FAIL_COLOR='\033[91m' +ENDC='\033[0m' # Reset to default color + +# If run standalone, determine distro information. Otherwise, use info from main install script +if [ -z "$FAMILY" ]; then + dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + source "${dir}"/wally-distro-check.sh +fi + + +# Generate list of packages to install and package manager commands based on distro +# Packages are grouped by which tool requires them. If multiple tools need a package, it is included in the first tool only +if [ "$FAMILY" == rhel ]; then + PYTHON_VERSION=python3.12 + PACKAGE_MANAGER="dnf" + UPDATE_COMMAND="sudo $PACKAGE_MANAGER update -y" + GENERAL_PACKAGES+=(which rsync git make cmake "$PYTHON_VERSION" "$PYTHON_VERSION"-pip curl wget tar pkgconf-pkg-config dialog mutt ssmtp) + GNU_PACKAGES+=(autoconf automake libmpc-devel mpfr-devel gmp-devel gawk bison flex texinfo gperf libtool patchutils bc gcc gcc-c++ zlib-devel expat-devel libslirp-devel) + QEMU_PACKAGES+=(glib2-devel libfdt-devel pixman-devel bzip2 ninja-build) + SPIKE_PACKAGES+=(dtc boost-regex boost-system) + VERILATOR_PACKAGES+=(help2man perl clang ccache gperftools numactl mold) + BUILDROOT_PACKAGES+=(ncurses-base ncurses ncurses-libs ncurses-devel gcc-gfortran cpio) # gcc-gfortran is only needed for compiling spec benchmarks on buildroot linux + # Extra packages not availale in rhel8, nice for Verilator and needed for sail respectively + if (( RHEL_VERSION >= 9 )); then + VERILATOR_PACKAGES+=(perl-doc) + SAIL_PACKAGES=(z3) + fi + # A newer version of gcc is required for qemu + OTHER_PACKAGES=(gcc-toolset-13) +elif [ "$FAMILY" == ubuntu ]; then + if (( UBUNTU_VERSION >= 24 )); then + PYTHON_VERSION=python3.12 + VERILATOR_PACKAGES+=(mold) # Not availale in Ubuntu 20.04, nice for Verilator + elif (( UBUNTU_VERSION >= 22 )); then + PYTHON_VERSION=python3.11 + VERILATOR_PACKAGES+=(mold) # Not availale in Ubuntu 20.04, nice for Verilator + elif (( UBUNTU_VERSION >= 20 )); then + PYTHON_VERSION=python3.9 + OTHER_PACKAGES+=(gcc-10 g++-10 cpp-10) # Newer version of gcc needed for Verilator + fi + PACKAGE_MANAGER="DEBIAN_FRONTEND=noninteractive apt-get" + UPDATE_COMMAND="sudo $PACKAGE_MANAGER update -y && sudo $PACKAGE_MANAGER upgrade -y --with-new-pkgs" + GENERAL_PACKAGES+=(rsync git make cmake "$PYTHON_VERSION" python3-pip "$PYTHON_VERSION"-venv curl wget tar pkg-config dialog mutt ssmtp) + GNU_PACKAGES+=(autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat1-dev ninja-build libglib2.0-dev libslirp-dev) + QEMU_PACKAGES+=(libfdt-dev libpixman-1-dev) + SPIKE_PACKAGES+=(device-tree-compiler libboost-regex-dev libboost-system-dev) + VERILATOR_PACKAGES+=(help2man perl g++ clang ccache libunwind-dev libgoogle-perftools-dev numactl perl-doc libfl2 libfl-dev zlib1g) + SAIL_PACKAGES+=(opam z3) + BUILDROOT_PACKAGES+=(ncurses-base ncurses-bin libncurses-dev gfortran cpio) # gfortran is only needed for compiling spec benchmarks on buildroot linux + VIVADO_PACKAGES+=(libncurses*) # Vivado hangs on the third stage of installation without this +fi + + +# Check if required packages are installed or install/update them depending on passed flag. +if [ "${1}" == "--check" ]; then + section_header "Checking Dependencies from Package Manager" + if [ "$FAMILY" == rhel ]; then + for pack in "${GENERAL_PACKAGES[@]}" "${GNU_PACKAGES[@]}" "${QEMU_PACKAGES[@]}" "${SPIKE_PACKAGES[@]}" "${VERILATOR_PACKAGES[@]}" "${SAIL_PACKAGES[@]}" "${BUILDROOT_PACKAGES[@]}" "${OTHER_PACKAGES[@]}"; do + rpm -q "$pack" > /dev/null || (echo -e "${FAIL_COLOR}Missing packages detected (${WARNING_COLOR}$pack${FAIL_COLOR}). Run as root to auto-install or run wally-package-install.sh first.${ENDC}" && exit 1) + done + elif [ "$FAMILY" == ubuntu ]; then + for pack in "${GENERAL_PACKAGES[@]}" "${GNU_PACKAGES[@]}" "${QEMU_PACKAGES[@]}" "${SPIKE_PACKAGES[@]}" "${VERILATOR_PACKAGES[@]}" "${SAIL_PACKAGES[@]}" "${BUILDROOT_PACKAGES[@]}" "${OTHER_PACKAGES[@]}"; do + dpkg -l "$pack" | grep "ii" > /dev/null || (echo -e "${FAIL_COLOR}Missing packages detected (${WARNING_COLOR}$pack${FAIL_COLOR}). Run as root to auto-install or run wally-package-install.sh first." && exit 1) + done + fi + echo -e "${OK_COLOR}All required packages detected.${ENDC}" +else + # Check if root, otherwise exit with error message + [ "${EUID:=$(id -u)}" -ne 0 ] && echo -e "\n${FAIL_COLOR}Must be run as root${ENDC}" && exit 1 + + section_header "Installing/Updating Dependencies from Package Manager" + # Enable extra repos necessary for rhel + if [ "$FAMILY" == rhel ]; then + sudo dnf install -y dnf-plugins-core + sudo dnf group install -y "Development Tools" + if [ "$ID" == rhel ]; then + sudo subscription-manager repos --enable "codeready-builder-for-rhel-$RHEL_VERSION-$(arch)-rpms" + sudo dnf install -y "https://dl.fedoraproject.org/pub/epel/epel-release-latest-$RHEL_VERSION.noarch.rpm" + else # RHEL clone + if (( RHEL_VERSION == 8 )); then + sudo dnf config-manager -y --set-enabled powertools + else # Version 9 + sudo dnf config-manager -y --set-enabled crb + fi + sudo dnf install -y epel-release + fi + fi + + # Update and Upgrade tools + eval "$UPDATE_COMMAND" + # Install packages listed above using appropriate package manager + sudo $PACKAGE_MANAGER install -y "${GENERAL_PACKAGES[@]}" "${GNU_PACKAGES[@]}" "${QEMU_PACKAGES[@]}" "${SPIKE_PACKAGES[@]}" "${VERILATOR_PACKAGES[@]}" "${SAIL_PACKAGES[@]}" "${BUILDROOT_PACKAGES[@]}" "${OTHER_PACKAGES[@]}" "${VIVADO_PACKAGES[@]}" + echo -e "${SUCCESS_COLOR}Packages successfully installed.${ENDC}" +fi diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index 88df8cedd..dfda570bc 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -6,187 +6,441 @@ ## Created: 18 January 2023 ## Modified: 22 January 2023 ## Modified: 23 March 2023 +## Modified: 30 June 2024, Jordan Carlin jcarlin@hmc.edu ## ## Purpose: Open source tool chain installation script ## ## A component of the CORE-V-WALLY configurable RISC-V project. ## https://github.com/openhwgroup/cvw ## -## Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University +## Copyright (C) 2021-24 Harvey Mudd College & Oklahoma State University ## ## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 ## -## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file -## except in compliance with the License, or, at your option, the Apache License version 2.0. You +## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file +## except in compliance with the License, or, at your option, the Apache License version 2.0. You ## may obtain a copy of the License at ## ## https:##solderpad.org/licenses/SHL-2.1/ ## -## Unless required by applicable law or agreed to in writing, any work distributed under the -## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -## either express or implied. See the License for the specific language governing permissions +## Unless required by applicable law or agreed to in writing, any work distributed under the +## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +## either express or implied. See the License for the specific language governing permissions ## and limitations under the License. ################################################################################################ -# Use /opt/riscv for installation - may require running script with sudo -export RISCV="${1:-/opt/riscv}" -export PATH=$PATH:$RISCV/bin:/usr/bin +# Increasing NUM_THREADS will speed up parallel compilation of the tools +NUM_THREADS=$(nproc --ignore 1) # One less than the total number of threads + +# Colors +BOLD='\033[1m' +UNDERLINE='\033[4m' +SECTION_COLOR='\033[95m'$BOLD +OK_COLOR='\033[94m' +SUCCESS_COLOR='\033[92m' +WARNING_COLOR='\033[93m' +FAIL_COLOR='\033[91m' +ENDC='\033[0m' # Reset to default color + +## Helper functions +# Error handler +error() { + echo -e "${FAIL_COLOR}Error: $STATUS installation failed" + echo -e "Error on line ${BASH_LINENO[0]} with command $BASH_COMMAND${ENDC}" + exit 1 +} + +# Check if a git repository exists, is up to date, and has been installed +# Clones the repository if it doesn't exist +git_check() { + local repo=$1 + local url=$2 + local check=$3 + local branch="${4:-master}" + if [[ ((! -e $repo) && ($(git clone "$url") || true)) || ($(cd "$repo"; git fetch; git rev-parse HEAD) != $(cd "$repo"; git rev-parse origin/"$branch")) || (! -e $check) ]]; then + return 0 + else + return 1 + fi +} + +# Log output to a file and only print lines with keywords +logger() { + local log="$RISCV/logs/$1.log" + cat < /dev/stdin | tee -a "$log" | (grep -iE --color=never "(\bwarning|\berror|\bfail|\bsuccess|\bstamp)" || true) | (grep -viE --color=never "(Wno-error)" || true) +} set -e # break on error +trap error ERR # run error handler on error +STATUS="setup" # keep track of what part of the installation is running for error messages -# Modify accordingly for your machine -# Increasing NUM_THREADS will speed up parallel compilation of the tools -#NUM_THREADS=2 # for low memory machines > 16GiB -NUM_THREADS=8 # for >= 32GiB -#NUM_THREADS=16 # for >= 64GiB - -sudo mkdir -p $RISCV -# *** need to update permissions to local user - -# Update and Upgrade tools (see https://itsfoss.com/apt-update-vs-upgrade/) -sudo apt update -y -sudo apt upgrade -y -sudo apt install -y git gawk make texinfo bison flex build-essential python3 libz-dev libexpat-dev autoconf device-tree-compiler ninja-build libpixman-1-dev ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev libglib2.0-dev python3-pip pkg-config opam z3 zlib1g-dev automake autotools-dev libmpc-dev libmpfr-dev gperf libtool patchutils bc mutt ssmtp gfortran cmake libboost-all-dev -# Other python libraries used through the book. -sudo -H pip3 install sphinx sphinx_rtd_theme matplotlib scipy scikit-learn adjustText lief markdown pyyaml -sudo -H pip3 install riscv_isac # to generate new tests, such as quads with fp_dataset.py - -# needed for Ubuntu 22.04, gcc cross compiler expects python not python2 or python3. -if ! command -v python &> /dev/null -then - echo "WARNING: python3 was installed as python3 rather than python. Creating symlink." - sudo ln -sf /usr/bin/python3 /usr/bin/python +# Check for clean flag +if [ "$1" == "--clean" ]; then + clean=true + shift fi -# gcc cross-compiler (https://github.com/riscv-collab/riscv-gnu-toolchain) -# To install GCC from source can take hours to compile. -# This configuration enables multilib to target many flavors of RISC-V. +# Determine script directory to locate related scripts +dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Get Linux distro and version +source "${dir}"/wally-distro-check.sh + +# Check if root +ROOT=$( [ "${EUID:=$(id -u)}" == 0 ] && echo true || echo false); + +# Set installation directory based on execution privileges +# If the script is run as root, the default installation path is /opt/riscv +# If the script is run as a user, the default installation path is ~/riscv +# The installation path can be overridden with an argument passed to the script. +if [ "$ROOT" == true ]; then + export RISCV="${1:-/opt/riscv}" +else + export RISCV="${1:-$HOME/riscv}" +fi + +# Set environment variables +export PATH=$PATH:$RISCV/bin:/usr/bin +export PKG_CONFIG_PATH=$RISCV/lib64/pkgconfig:$RISCV/lib/pkgconfig:$RISCV/share/pkgconfig:$RISCV/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH + +# Create installation directory +mkdir -p "$RISCV"/logs +echo "Running as root: $ROOT" +echo "Installation path: $RISCV" + + +# Install/update system packages if root. Otherwise, check that packages are already installed. +STATUS="system packages" +if [ "$ROOT" == true ]; then + source "${dir}"/wally-package-install.sh +else + source "${dir}"/wally-package-install.sh --check +fi + +# Enable newer version of gcc for older distros (required for QEMU/Verilator) +if [ "$FAMILY" == rhel ]; then + source /opt/rh/gcc-toolset-13/enable +elif (( UBUNTU_VERSION == 20 )); then + mkdir -p "$RISCV"/gcc-10/bin + for f in gcc cpp g++ gcc-ar gcc-nm gcc-ranlib gcov gcov-dump gcov-tool lto-dump; do + ln -vsf /usr/bin/$f-10 "$RISCV"/gcc-10/bin/$f + done + export PATH="$RISCV"/gcc-10/bin:$PATH +fi + + +# Create python virtual environment so the python command targets desired version of python +# and installed packages are isolated from the rest of the system. +section_header "Setting up Python Environment" +STATUS="python virtual environment" +cd "$RISCV" +if [ ! -e "$RISCV"/riscv-python/bin/activate ]; then + "$PYTHON_VERSION" -m venv riscv-python + echo -e "${OK_COLOR}Python virtual environment created!\nInstalling pip packages.${ENDC}" +else + echo -e "${OK_COLOR}Python virtual environment already exists.\nUpdating pip packages.${ENDC}" +fi + +source "$RISCV"/riscv-python/bin/activate # activate python virtual environment + +# Install python packages, including RISCOF (https://github.com/riscv-software-src/riscof.git) +# RISCOF is a RISC-V compliance test framework that is used to run the RISC-V Arch Tests. +STATUS="python packages" +pip install --upgrade pip && pip install -r "$dir"/requirements.txt + +# z3 is needed for sail and not availabe from dnf for rhel 8 +if (( RHEL_VERSION == 8 )); then + pip install -U z3-solver +fi + +source "$RISCV"/riscv-python/bin/activate # reload python virtual environment +echo -e "${SUCCESS_COLOR}Python environment successfully configured!${ENDC}" + + +# Extra dependecies needed for older distros that don't have new enough versions available from package manager +if (( RHEL_VERSION == 8 )) || (( UBUNTU_VERSION == 20 )); then + # Newer versin of glib required for QEMU. + # Anything newer than this won't build on red hat 8 + STATUS="glib" + if [ ! -e "$RISCV"/include/glib-2.0 ]; then + section_header "Installing glib" + pip install -U meson # Meson is needed to build glib + cd "$RISCV" + wget https://download.gnome.org/sources/glib/2.70/glib-2.70.5.tar.xz + tar -xJf glib-2.70.5.tar.xz + rm glib-2.70.5.tar.xz + cd glib-2.70.5 + meson setup _build --prefix="$RISCV" + meson compile -C _build + meson install -C _build + cd "$RISCV" + rm -rf glib-2.70.5 + echo -e "${SUCCESS_COLOR}glib successfully installed!${ENDC}" + fi +fi + +# Newer version of gmp needed for sail-riscv model +if (( RHEL_VERSION == 8 )); then + STATUS="gmp" + if [ ! -e "$RISCV"/include/gmp.h ]; then + section_header "Installing gmp" + cd "$RISCV" + wget https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz + tar -xJf gmp-6.3.0.tar.xz + rm gmp-6.3.0.tar.xz + cd gmp-6.3.0 + ./configure --prefix="$RISCV" + make -j "${NUM_THREADS}" + make install + cd "$RISCV" + rm -rf gmp-6.3.0 + echo -e "${SUCCESS_COLOR}gmp successfully installed!${ENDC}" + fi +fi + + +# RISC-V GNU Toolchain (https://github.com/riscv-collab/riscv-gnu-toolchain) +# The RISC-V GNU Toolchain includes the GNU Compiler Collection (gcc), GNU Binutils, Newlib, +# and the GNU Debugger Project (gdb). It is a collection of tools used to compile RISC-V programs. +# To install GCC from source can take hours to compile. +# This configuration enables multilib to target many flavors of RISC-V. # This book is tested with GCC 13.2.0 -# Versions newer than 2023-12-20 fail to compile the RISC-V arch test with an error: -# cvw/addins/riscv-arch-test/riscv-test-suite/rv32i_m/I/src/jalr-01.S:72: Error: illegal operands `la x0,5b' -# PR *** submitted to fix riscv-arch-test to be compatible with latest GCC by modifying test_macros.h for TEST_JALR_OP -cd $RISCV -git clone https://github.com/riscv/riscv-gnu-toolchain -cd riscv-gnu-toolchain -./configure --prefix=${RISCV} --with-multilib-generator="rv32e-ilp32e--;rv32i-ilp32--;rv32im-ilp32--;rv32iac-ilp32--;rv32imac-ilp32--;rv32imafc-ilp32f--;rv32imafdc-ilp32d--;rv64i-lp64--;rv64ic-lp64--;rv64iac-lp64--;rv64imac-lp64--;rv64imafdc-lp64d--;rv64im-lp64--;" -make -j 8 +section_header "Installing/Updating RISC-V GNU Toolchain" +STATUS="RISC-V GNU Toolchain" +cd "$RISCV" +if git_check "riscv-gnu-toolchain" "https://github.com/riscv/riscv-gnu-toolchain" "$RISCV/riscv-gnu-toolchain/stamps/build-gcc-newlib-stage2"; then + cd riscv-gnu-toolchain + git reset --hard && git clean -f && git checkout master && git pull + ./configure --prefix="${RISCV}" --with-multilib-generator="rv32e-ilp32e--;rv32i-ilp32--;rv32im-ilp32--;rv32iac-ilp32--;rv32imac-ilp32--;rv32imafc-ilp32f--;rv32imafdc-ilp32d--;rv64i-lp64--;rv64ic-lp64--;rv64iac-lp64--;rv64imac-lp64--;rv64imafdc-lp64d--;rv64im-lp64--;" + make -j "${NUM_THREADS}" 2>&1 | logger riscv-gnu-toolchain; [ "${PIPESTATUS[0]}" == 0 ] + if [ "$clean" ]; then + cd "$RISCV" + rm -rf riscv-gnu-toolchain + fi + echo -e "${SUCCESS_COLOR}RISC-V GNU Toolchain successfully installed/updated!${ENDC}" +else + echo -e "${SUCCESS_COLOR}RISC-V GNU Toolchain already up to date.${ENDC}" +fi + # elf2hex (https://github.com/sifive/elf2hex) -#The elf2hex utility to converts executable files into hexadecimal files for Verilog simulation. -# Note: The exe2hex utility that comes with Spike doesn’t work for our purposes because it doesn’t -# handle programs that start at 0x80000000. The SiFive version above is touchy to install. -# For example, if Python version 2.x is in your path, it won’t install correctly. -# Also, be sure riscv64-unknown-elf-objcopy shows up in your path in $RISCV/riscv-gnu-toolchain/bin +# The elf2hex utility to converts executable files into hexadecimal files for Verilog simulation. +# Note: The exe2hex utility that comes with Spike doesn’t work for our purposes because it doesn’t +# handle programs that start at 0x80000000. The SiFive version above is touchy to install. +# For example, if Python version 2.x is in your path, it won’t install correctly. +# Also, be sure riscv64-unknown-elf-objcopy shows up in your path in $RISCV/riscv-gnu-toolchain/bin # at the time of compilation, or elf2hex won’t work properly. -cd $RISCV +section_header "Installing/Updating elf2hex" +STATUS="elf2hex" +cd "$RISCV" export PATH=$RISCV/bin:$PATH -git clone https://github.com/sifive/elf2hex.git -cd elf2hex -autoreconf -i -./configure --target=riscv64-unknown-elf --prefix=$RISCV -make -make install +if git_check "elf2hex" "https://github.com/sifive/elf2hex.git" "$RISCV/bin/riscv64-unknown-elf-elf2bin"; then + cd elf2hex + git reset --hard && git clean -f && git checkout master && git pull + autoreconf -i + ./configure --target=riscv64-unknown-elf --prefix="$RISCV" + make 2>&1 | logger elf2hex; [ "${PIPESTATUS[0]}" == 0 ] + make install 2>&1 | logger elf2hex; [ "${PIPESTATUS[0]}" == 0 ] + if [ "$clean" ]; then + cd "$RISCV" + rm -rf elf2hex + fi + echo -e "${SUCCESS_COLOR}elf2hex successfully installed/updated!${ENDC}" +else + echo -e "${SUCCESS_COLOR}elf2hex already up to date.${ENDC}" +fi # QEMU (https://www.qemu.org/docs/master/system/target-riscv.html) -cd $RISCV -git clone --recurse-submodules https://github.com/qemu/qemu -cd qemu -./configure --target-list=riscv64-softmmu --prefix=$RISCV -make -j 8 -make install +# QEMU is an open source machine emulator and virtualizer capable of emulating RISC-V +section_header "Installing/Updating QEMU" +STATUS="QEMU" +cd "$RISCV" +if git_check "qemu" "https://github.com/qemu/qemu" "$RISCV/include/qemu-plugin.h"; then + cd qemu + git reset --hard && git clean -f && git checkout master && git pull --recurse-submodules -j "${NUM_THREADS}" + git submodule update --init --recursive + ./configure --target-list=riscv64-softmmu --prefix="$RISCV" + make -j "${NUM_THREADS}" 2>&1 | logger qemu; [ "${PIPESTATUS[0]}" == 0 ] + make install 2>&1 | logger qemu; [ "${PIPESTATUS[0]}" == 0 ] + if [ "$clean" ]; then + cd "$RISCV" + rm -rf qemu + fi + echo -e "${SUCCESS_COLOR}QEMU successfully installed/updated!${ENDC}" +else + echo -e "${SUCCESS_COLOR}QEMU already up to date.${ENDC}" +fi + # Spike (https://github.com/riscv-software-src/riscv-isa-sim) -# Spike also takes a while to install and compile, but this can be done concurrently -# with the GCC installation. -cd $RISCV -git clone https://github.com/riscv-software-src/riscv-isa-sim -mkdir -p riscv-isa-sim/build -cd riscv-isa-sim/build -../configure --prefix=$RISCV -make -j 8 -make install +# Spike is a reference model for RISC-V. It is a functional simulator that can be used to run RISC-V programs. +section_header "Installing/Updating SPIKE" +STATUS="SPIKE" +cd "$RISCV" +if git_check "riscv-isa-sim" "https://github.com/riscv-software-src/riscv-isa-sim" "$RISCV/lib/pkgconfig/riscv-riscv.pc"; then + cd riscv-isa-sim + git reset --hard && git clean -f && git checkout master && git pull + mkdir -p build + cd build + ../configure --prefix="$RISCV" + make -j "${NUM_THREADS}" 2>&1 | logger spike; [ "${PIPESTATUS[0]}" == 0 ] + make install 2>&1 | logger spike; [ "${PIPESTATUS[0]}" == 0 ] + if [ "$clean" ]; then + cd "$RISCV" + rm -rf riscv-isa-sim + fi + echo -e "${SUCCESS_COLOR}Spike successfully installed/updated!${ENDC}" +else + echo -e "${SUCCESS_COLOR}Spike already up to date.${ENDC}" +fi -# Wally needs Verilator 5.021 or later. -# Verilator needs to be built from scratch to get the latest version -# apt-get install verilator installs version 4.028 as of 6/8/23 -sudo apt-get install -y perl g++ ccache help2man libgoogle-perftools-dev numactl perl-doc zlib1g -cd $RISCV -git clone https://github.com/verilator/verilator # Only first time -# unsetenv VERILATOR_ROOT # For csh; ignore error if on bash -unset VERILATOR_ROOT # For bash -cd verilator -git pull # Make sure git repository is up-to-date -git checkout master -autoconf # Create ./configure script -./configure # Configure and create Makefile -make -j 8 # Build Verilator itself (if error, try just 'make') -sudo make install - -# Sail (https://github.com/riscv/sail-riscv) -# Sail is the new golden reference model for RISC-V. Sail is written in OCaml, which -# is an object-oriented extension of ML, which in turn is a functional programming -# language suited to formal verification. OCaml is installed with the opam OCcaml -# package manager. Sail has so many dependencies that it can be difficult to install. -# This script works for Ubuntu. - -# Alex Solomatnikov found these commands worked to build Sail for Centos 8 on 1/12/24 -#sudo su - -#dnf install ocaml.x86_64 -#pip3 install z3-solver -#wget https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh -#sh install.sh -#opam init -#exit -#ocaml -version -#opam switch create 5.1.0 -#eval $(opam config env) -#git clone --recurse-submodules git@github.com:riscv/sail-riscv.git -#cd sail-riscv -#make -#ARCH=RV32 make -#ARCH=RV64 make -#git log -1 -#cp -p c_emulator/riscv_sim_RV* /tools/sail-riscv/d7a3d8012fd579f40e53a29569141d72dd5e0c32/bin/. +# Verilator (https://github.com/verilator/verilator) +# Verilator is a fast open-source Verilog simulator that compiles synthesizable Verilog code into C++ code. +# It is used for linting and simulation of Wally. +# Verilator needs to be built from source to get the latest version (Wally needs 5.021 or later). +section_header "Installing/Updating Verilator" +STATUS="Verilator" +cd "$RISCV" +if git_check "verilator" "https://github.com/verilator/verilator" "$RISCV/share/pkgconfig/verilator.pc"; then + unset VERILATOR_ROOT + cd verilator + git reset --hard && git clean -f && git checkout master && git pull + autoconf + ./configure --prefix="$RISCV" + make -j "${NUM_THREADS}" 2>&1 | logger verilator; [ "${PIPESTATUS[0]}" == 0 ] + make install 2>&1 | logger verilator; [ "${PIPESTATUS[0]}" == 0 ] + if [ "$clean" ]; then + cd "$RISCV" + rm -rf verilator + fi + echo -e "${SUCCESS_COLOR}Verilator successfully installed/updated!${ENDC}" +else + echo -e "${SUCCESS_COLOR}Verilator already up to date.${ENDC}" +fi -# This was an earlier attemp to prepare to install Sail on RedHat 8 -# Do these commands only for RedHat / Rocky 8 to build from source. -#cd $RISCV -#git clone https://github.com/Z3Prover/z3.git -#cd z3 -#python scripts/mk_make.py -#cd build -#make -j 8 -#make install -#cd ../.. -#pip3 install chardet==3.0.4 -#pip3 install urllib3==1.22 +# Install opam from binary disribution on rhel as it is not available from dnf +# Opam is needed to install the sail compiler +if [ "$FAMILY" == rhel ]; then + section_header "Installing/Updating Opam" + STATUS="Opam" + export OPAMROOTISOK=1 # Silence warnings about running opam as root + cd "$RISCV" + mkdir -p opam + cd opam + wget https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh + printf '%s\n' "$RISCV"/bin Y | sh install.sh # the print command provides $RISCV/bin as the installation path when prompted + cd "$RISCV" + rm -rf opam + echo -e "${SUCCESS_COLOR}Opam successfully installed/updated!${ENDC}" +fi -cd $RISCV -opam init -y --disable-sandboxing -opam update -opam upgrade -opam switch create 5.1.0 -opam install sail -y +# Sail Compiler (https://github.com/rems-project/sail) +# Sail is a formal specification language designed for describing the semantics of an ISA. +# It is used to generate the RISC-V Sail Model, which is the golden reference model for RISC-V. +# The Sail Compiler is written in OCaml, which is an object-oriented extension of ML, which in turn +# is a functional programming language suited to formal verification. The Sail compiler is installed +# with the opam OCaml package manager. It has so many dependencies that it can be difficult to install, +# but a binary release of it should be available soon, removing the need to use opam. +section_header "Installing/Updating Sail Compiler" +STATUS="Sail Compiler" +export OPAMROOTISOK=1 # Silence warnings about running opam as root +export OPAMROOT="$RISCV"/opam +cd "$RISCV" +opam init -y --disable-sandboxing --no-setup --compiler=5.1.0 +eval "$(opam config env)" +opam update -y +opam upgrade -y +opam install sail -y +echo -e "${SUCCESS_COLOR}Sail Compiler successfully installed/updated!${ENDC}" -eval $(opam config env) -git clone https://github.com/riscv/sail-riscv.git -cd sail-riscv -# For now, use checkout that is stable for Wally -#git checkout 72b2516d10d472ac77482fd959a9401ce3487f60 # not new enough for Zicboz? -export OPAMCLI=2.0 # Sail is not compatible with opam 2.1 as of 4/16/24 -ARCH=RV64 make -j 8 c_emulator/riscv_sim_RV64 -ARCH=RV32 make -j 8 c_emulator/riscv_sim_RV32 -sudo ln -sf $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 -sudo ln -sf $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 +# RISC-V Sail Model (https://github.com/riscv/sail-riscv) +# The RISC-V Sail Model is the golden reference model for RISC-V. It is written in Sail (described above) +section_header "Installing/Updating RISC-V Sail Model" +STATUS="RISC-V Sail Model" +if git_check "sail-riscv" "https://github.com/riscv/sail-riscv.git" "$RISCV/bin/riscv_sim_RV32"; then + cd sail-riscv + git reset --hard && git clean -f && git checkout master && git pull + export OPAMCLI=2.0 # Sail is not compatible with opam 2.1 as of 4/16/24 + ARCH=RV64 make -j "${NUM_THREADS}" c_emulator/riscv_sim_RV64 2>&1 | logger sailModel; [ "${PIPESTATUS[0]}" == 0 ] + ARCH=RV32 make -j "${NUM_THREADS}" c_emulator/riscv_sim_RV32 2>&1 | logger sailModel; [ "${PIPESTATUS[0]}" == 0 ] + cp -f c_emulator/riscv_sim_RV64 "$RISCV"/bin/riscv_sim_RV64 + cp -f c_emulator/riscv_sim_RV32 "$RISCV"/bin/riscv_sim_RV32 + if [ "$clean" ]; then + cd "$RISCV" + rm -rf sail-riscv + rm -rf opam + fi + echo -e "${SUCCESS_COLOR}RISC-V Sail Model successfully installed/updated!${ENDC}" +else + echo -e "${SUCCESS_COLOR}RISC-V Sail Model already up to date.${ENDC}" +fi -# riscof -sudo -H pip3 install -U testresources riscv_config -sudo -H pip3 install git+https://github.com/riscv/riscof.git -# Download OSU Skywater 130 cell library -sudo mkdir -p $RISCV/cad/lib -cd $RISCV/cad/lib -sudo git clone https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12 +# OSU Skywater 130 cell library (https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12) +# The OSU Skywater 130 cell library is a standard cell library that is used to synthesize Wally. +section_header "Installing/Updating OSU Skywater 130 cell library" +STATUS="OSU Skywater 130 cell library" +mkdir -p "$RISCV"/cad/lib +cd "$RISCV"/cad/lib +if git_check "sky130_osu_sc_t12" "https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12" "$RISCV/cad/lib/sky130_osu_sc_t12" "main"; then + cd sky130_osu_sc_t12 + git reset --hard && git clean -f && git checkout main && git pull + echo -e "${SUCCESS_COLOR}OSU Skywater library successfully installed!${ENDC}" +else + echo -e "${SUCCESS_COLOR}OSU Skywater library already up to date.${ENDC}" +fi + + +# Buildroot and Linux testvectors +# Buildroot is used to boot a minimal versio of Linux on Wally. +# Testvectors are generated using QEMU. +section_header "Installing Buildroot and Creating Linux testvectors" +STATUS="Buildroot" +if [ -z "$LD_LIBRARY_PATH" ]; then + export LD_LIBRARY_PATH=$RISCV/lib:$RISCV/lib64:$RISCV/riscv64-unknown-elf/lib:$RISCV/lib/x86_64-linux-gnu/ +else + export LD_LIBRARY_PATH=$RISCV/lib:$RISCV/lib64:$LD_LIBRARY_PATH:$RISCV/riscv64-unknown-elf/lib:$RISCV/lib/x86_64-linux-gnu/ +fi +cd "$dir"/../linux +if [ ! -e "$RISCV"/buildroot ]; then + make 2>&1 | logger buildroot; [ "${PIPESTATUS[0]}" == 0 ] + echo -e "${SUCCESS_COLOR}Buildroot successfully installed and Linux testvectors created!${ENDC}" +elif [ ! -e "$RISCV"/linux-testvectors ]; then + echo -e "${OK_COLOR}Buildroot already exists, but Linux testvectors are missing. Generating them now.${ENDC}" + make dumptvs 2>&1 | logger buildroot; [ "${PIPESTATUS[0]}" == 0 ] + echo -e "${SUCCESS_COLOR}Linux testvectors successfully generated!${ENDC}" +else + echo -e "${OK_COLOR}Buildroot and Linux testvectors already exist.${ENDC}" +fi + + +# Download site-setup scripts +# The site-setup script is used to set up the environment for the RISC-V tools and EDA tools by setting +# the PATH and other environment variables. It also sources the Python virtual environment. +section_header "Downloading Site Setup Script" +STATUS="site-setup scripts" +cd "$RISCV" +if [ ! -e "${RISCV}"/site-setup.sh ]; then + wget https://raw.githubusercontent.com/openhwgroup/cvw/main/site-setup.sh + wget https://raw.githubusercontent.com/openhwgroup/cvw/main/site-setup.csh + # Add necessary lines to site-setup script to activate newer version of gcc for older distros + if [ "$FAMILY" == rhel ]; then + echo "# Activate newer gcc version" >> site-setup.sh + echo "source /opt/rh/gcc-toolset-13/enable" >> site-setup.sh + elif (( UBUNTU_VERSION == 20 )); then + echo "# Activate newer gcc version" >> site-setup.sh + echo "export PATH=\$RISCV/gcc-10/bin:\$PATH" >> site-setup.sh + echo "# Activate newer gcc version" >> site-setup.csh + echo "prepend PATH \$RISCV/gcc-10/bin" >> site-setup.csh + fi + echo -e "${SUCCESS_COLOR}Site setup script successfully downloaded!${ENDC}" + echo -e "${WARNING_COLOR}Make sure to edit the environment variables in $RISCV/site-setup.sh (or .csh) to point to your installation of EDA tools and licensce files.${ENDC}" +else + echo -e "${OK_COLOR}Site setup script already exists. Not checking for updates to avoid overwritng modifications." + echo -e "You may need to manually update it if there were changes upstream.${ENDC}" +fi + +echo -e "${SUCCESS_COLOR}${BOLD}\n\nINSTALLATION SUCCESSFUL!!!\n\n${ENDC}" diff --git a/bin/wrapper_nightly_runs.sh b/bin/wrapper_nightly_runs.sh index 982132792..88a1e094a 100755 --- a/bin/wrapper_nightly_runs.sh +++ b/bin/wrapper_nightly_runs.sh @@ -17,5 +17,5 @@ source ./setup.sh cd $PYTHON_SCRIPT pwd echo "Running python file" -python nightly_build.py +$RISCV/riscv-python/bin/python nightly_build.py echo "Finished" diff --git a/bin/wsim b/bin/wsim index d837bca85..e35ec6841 100755 --- a/bin/wsim +++ b/bin/wsim @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # wsim # David_Harris@hmc.edu 5 April 2024 diff --git a/fpga/generator/probe b/fpga/generator/probe index d3142e0f2..cb2b95b23 100755 --- a/fpga/generator/probe +++ b/fpga/generator/probe @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 ########################################### ## fpgaTop.sv ## diff --git a/fpga/probe b/fpga/probe index 1cf1104c1..fa60dc658 100755 --- a/fpga/probe +++ b/fpga/probe @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 ########################################### ## probe.sh ## diff --git a/fpga/proberange b/fpga/proberange index 73bfc3383..44885a0eb 100755 --- a/fpga/proberange +++ b/fpga/proberange @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 ########################################### ## proberange.sh ## @@ -13,15 +13,15 @@ ## ## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 ## -## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file -## except in compliance with the License, or, at your option, the Apache License version 2.0. You +## Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file +## except in compliance with the License, or, at your option, the Apache License version 2.0. You ## may obtain a copy of the License at ## ## https:##solderpad.org#licenses#SHL-2.1# ## -## Unless required by applicable law or agreed to in writing, any work distributed under the -## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, -## either express or implied. See the License for the specific language governing permissions +## Unless required by applicable law or agreed to in writing, any work distributed under the +## License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +## either express or implied. See the License for the specific language governing permissions ## and limitations under the License. ################################################################################################ @@ -41,7 +41,7 @@ set_property C_INPUT_PIPE_STAGES 0 [get_debug_cores u_ila_0] set_property C_EN_STRG_QUAL false [get_debug_cores u_ila_0] set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0] set_property ALL_PROBE_SAME_MU_CNT 1 [get_debug_cores u_ila_0] -startgroup +startgroup set_property C_EN_STRG_QUAL true [get_debug_cores u_ila_0 ] set_property C_ADV_TRIGGER true [get_debug_cores u_ila_0 ] set_property ALL_PROBE_SAME_MU true [get_debug_cores u_ila_0 ] diff --git a/fpga/probes b/fpga/probes index 1ea571057..8d220c62f 100755 --- a/fpga/probes +++ b/fpga/probes @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 ########################################### ## probe.sh ## diff --git a/fpga/renumber.py b/fpga/renumber.py index adf625920..84a2543d7 100755 --- a/fpga/renumber.py +++ b/fpga/renumber.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 import sys import re diff --git a/fpga/rvvidaemon/Makefile b/fpga/rvvidaemon/Makefile index 26f705a20..e7a40df63 100644 --- a/fpga/rvvidaemon/Makefile +++ b/fpga/rvvidaemon/Makefile @@ -1,10 +1,10 @@ all: rvvidaemon rvvidaemon: rvvidaemon.o - gcc $^ /opt/riscv/ImperasDV-OpenHW/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model.so -o rvvidaemon + gcc $^ $(RISCV)/ImperasDV-OpenHW/lib/Linux64/ImperasLib/imperas.com/verification/riscv/1.0/model.so -o rvvidaemon %.o:%.c - gcc -I/opt/riscv/ImperasDV-OpenHW/ImpProprietary/include/host -I/opt/riscv/ImperasDV-OpenHW/ImpPublic/include/host/rvvi/ -c $^ -o $@ + gcc -I$(RISCV)/ImperasDV-OpenHW/ImpProprietary/include/host -I$(RISCV)/ImperasDV-OpenHW/ImpPublic/include/host/rvvi/ -c $^ -o $@ clean: rm *.o rvvidaemon diff --git a/linux/Makefile b/linux/Makefile index b0b15ce7b..033629255 100644 --- a/linux/Makefile +++ b/linux/Makefile @@ -1,4 +1,3 @@ -#BUILDROOT := ${RISCV}/buildroot-test BUILDROOT := buildroot IMAGES := ${BUILDROOT}/output/images WALLY := $(shell dirname $(shell pwd)) @@ -7,6 +6,13 @@ DIS := ${IMAGES}/disassembly BRPACKAGES := $(WALLYLINUX)/buildroot-packages BR2023 := $(WALLYLINUX)/buildroot-config-src/buildroot-2023.05.1 +# set sudo if needed depending on $RISCV +ifeq ($(shell mkdir -p $(RISCV)/.test > /dev/null 2>&1 ; echo $$?), 0) + SUDO := +else + SUDO := sudo +endif + # Buildroot Config Stuff WALLYBOARDSRC := $(WALLYLINUX)/buildroot-config-src/wally WALLYBOARD := $(BUILDROOT)/board/wally @@ -17,7 +23,7 @@ FPGA_AXI_SDC := ${WALLYLINUX}/buildroot-packages/fpga-axi-sdc DRIVER := ${PACKAGE_SOURCE}/fpga-axi-sdc.c PATCHFILE := $(BRPACKAGES)/package-2023.05.1.patch -# Device tree files +# Device tree files DTS ?= $(shell find devicetree -type f -regex ".*\.dts" | sort) DTB := $(DTS:%.dts=%.dtb) DTB := $(foreach name, $(DTB), $(IMAGES)/$(shell basename $(name))) @@ -27,35 +33,34 @@ BINARIES := fw_jump.elf vmlinux busybox OBJDUMPS := $(foreach name, $(BINARIES), $(basename $(name) .elf)) OBJDUMPS := $(foreach name, $(OBJDUMPS), $(DIS)/$(name).objdump) -.PHONY: all generate disassemble install clean cleanDTB cleanDriver test +.PHONY: all generate disassemble install clean cleanDTB cleanDriver check_write_permissions -all: clean download Image disassemble install +all: check_write_permissions clean download Image disassemble install dumptvs -all_nosudo: clean download Image disassemble install_nosudo +check_write_permissions: +ifeq ($(SUDO), sudo) + @echo "Cannot write to '$(RISCV)'." \ + "Using sudo (you may be prompted for your password several times throughout the install)" +endif + @$(SUDO) mkdir -p $(RISCV)/.test || \ + (echo "ERROR: Still unable to write to '$(RISCV)'." >&2 \ + && exit 1) + @$(SUDO) rm -r $(RISCV)/.test Image: - bash -c "unset LD_LIBRARY_PATH; make -C $(BUILDROOT) --jobs;" + bash -c "unset LD_LIBRARY_PATH; $(MAKE) -C $(BUILDROOT)" $(MAKE) generate + @echo "Buildroot Image successfully generated." -install: - sudo rm -rf $(RISCV)/$(BUILDROOT) - sudo mv $(BUILDROOT) $(RISCV)/$(BUILDROOT) +install: check_write_permissions + $(SUDO) rm -rf $(RISCV)/$(BUILDROOT) + $(SUDO) mv $(BUILDROOT) $(RISCV)/$(BUILDROOT) + @echo "Buildroot successfully installed." -install_nosudo: - rm -rf $(RISCV)/$(BUILDROOT) - mv $(BUILDROOT) $(RISCV)/$(BUILDROOT) - -dumptvs: - sudo mkdir -p $(RISCV)/linux-testvectors - cd testvector-generation; sudo ./genInitMem.sh - -dumptvs_nosudo: - mkdir -p $(RISCV)/linux-testvectors +dumptvs: check_write_permissions + $(SUDO) mkdir -p $(RISCV)/linux-testvectors cd testvector-generation; ./genInitMem.sh - -# Temp rule for debugging -test: - echo $(shell find $(BUILDROOT)/output/build -maxdepth 2 -type d -regex ".*/linux-[0-9]+\.[0-9]+\.[0-9]+$$") + @echo "Testvectors successfully generated." generate: $(DTB) $(IMAGES) @@ -68,28 +73,27 @@ $(IMAGES): $(RISCV): @ echo "ERROR: No $(RISCV) directory. Make sure you have installed the Wally Toolchain." - @ echo "this can be done with /bin/wally-tool-chain-install.sh" + @ echo "and sourced setup.sh" # Disassembly rules --------------------------------------------------- - - disassemble: rm -rf $(BUILDROOT)/output/images/disassembly find $(BUILDROOT)/output/build/linux-* -maxdepth 1 -name "vmlinux" | xargs cp -t $(BUILDROOT)/output/images/ mkdir -p $(DIS) - make -j $(OBJDUMPS) + $(MAKE) $(OBJDUMPS) # extract rootfs mkdir -p $(BUILDROOT)/output/images/disassembly/rootfs - echo "Ignore error about dev/console when extracting rootfs from rootfs.cpio" + @echo "Ignore error about dev/console when extracting rootfs from rootfs.cpio" -cpio -i -D $(BUILDROOT)/output/images/disassembly/rootfs < $(BUILDROOT)/output/images/rootfs.cpio + @echo "Disassembly successfully completed." $(DIS)/%.objdump: $(IMAGES)/%.elf riscv64-unknown-elf-objdump -DS $< >> $@ - extractFunctionRadix.sh $@ + $(WALLY)/bin/extractFunctionRadix.sh $@ $(DIS)/%.objdump: $(IMAGES)/% riscv64-unknown-elf-objdump -S $< >> $@ - extractFunctionRadix.sh $@ + $(WALLY)/bin/extractFunctionRadix.sh $@ $(IMAGES)/vmlinux: linuxDir=$$(find $(BUILDROOT)/output/build -maxdepth 2 -type d -regex ".*/linux-[0-9]+\.[0-9]+\.[0-9]+$$") ;\ @@ -100,10 +104,9 @@ $(IMAGES)/busybox: cp $$busyboxDir/busybox $@ ;\ # Generating new Buildroot directories -------------------------------- - -# This directive should be run as: make install BUILDROOT=path/to/buildroot download: $(WALLYBOARD) cp $(WALLYBOARD)/main.config $(BUILDROOT)/.config + @echo "Buildroot successfully download." # CONFIG DEPENDENCIES 2023.05.1 --------------------------------------- $(WALLYBOARD): $(BUILDROOT) diff --git a/linux/README.MD b/linux/README.MD index 2b9ec3ab3..ba7fb8dd4 100644 --- a/linux/README.MD +++ b/linux/README.MD @@ -5,57 +5,56 @@ 1. [Setting up Buildroot](#buildroot) 2. [Generating Device Tree Binaries](#devicetree) 3. [Disassembling the Binaries for Debugging](#disassembly) -4. [Creating a Bootable SD Card](#sdcard) +4. [Generating test-vectors for regression](#testvectors) +5. [Creating a Bootable SD Card](#sdcard) ## Setting up Buildroot -In order to generate the Linux and boot stage binaries compatible with Wally, Buildroot is used for cross-compilation. To set up a Buildroot directory, configuration files for Buildroot, Linux, and Busybox must be copied into the correct locations inside the main Buildroot directory. This can be done automatically using the Makefile inside Wally's Linux subdirectory (this one). To install and patch a fresh Buildroot directory, type: +In order to generate the Linux and boot stage binaries compatible with Wally, Buildroot is used for cross-compilation. + +To set up a Buildroot directory, configuration files for Buildroot, Linux, and Busybox must be copied into the correct locations inside the main Buildroot directory. Buildroot and device tree binaries must be generated as well. This can all be done automatically using the Makefile inside Wally's Linux subdirectory (this one). To install a new buildroot directory, build the Buildroot binaries, generate the device tree binaries, generate test-vectors for simulation, and install the buildroot package needed to build the SD card driver for Linux, run: + + $ make + +This installs to the `$RISCV` directory. Buildroot itself is installed to `$RISCV/buildroot` and the test-vectors are installed to `$RISCV/linux-testvectors`. + +Optionally, you can override the `BUILDROOT` variable to install a different buildroot source directory. $ make install BUILDROOT=path/to/buildroot -You can override the `BUILDROOT` variable to place buildroot where you want it. By default it will be placed at `/opt/riscv/buildroot`. In addition to copying the configuration files, it will install the buildroot package needed to build the SD card driver for Linux. - -To install a new buildroot directory, build the binaries, and generate the device tree binaries in one command, use: - - $ make BUILDROOT=path/to/buildroot - -Or simply use the default buildroot location in `/opt/riscv`: - - $ make - -Note that the `$RISCV` variable cannot be set prior to building in buildroot or the build will fail. It is best to run `source ./setup.sh` to alter your `$PATH` and set the `$RISCV` variable after buildroot has succesfully built the binaries. If you're new to buildroot, you can find the binaries in `/output/images`. - ## Generating Device Tree Binaries -The device tree files for the various FPGA's Wally supports, as well as QEMU's device tree for the virt machine, are located in the `./devicetree` subdirectory. These device tree files are necessary for the boot process. In order to build the device tree binaries (.dtb) from the device tree sources (.dts), we can build all of them at once using: +The device tree files for the various FPGA's Wally supports, as well as QEMU's device tree for the virt machine, are located in the `./devicetree` subdirectory. These device tree files are necessary for the boot process. + +They are built automatically using the main `make` command. To build the device tree binaries (.dtb) from the device tree sources (.dts) separately, we can build all of them at once using: + + $ make generate #optionally override BUILDROOT - $ make generate BUILDROOT=path/to/buildroot - - Or for the default buildroot location: - - $ make generate - The .dts files will end up in the `/output/images` folder of your chosen buildroot directory. ## Disassembling the Binaries for Debugging By using the `riscv64-unknown-elf-objdump` utility, we can disassemble the binaries in `/output/images` so that we can explore the resulting machine code instructions and see what assembly or C code the instructions came from, along with the corresponding addresses. This is useful during debugging in order to trace how code is being executed. -To create the disassembled binaries, run: +The disassembled binaries are built automatically using the main `make` command. To create the disassembled binaries separately, run: + + $ make disassemble #optionally override BUILDROOT - $ make disassemble BUILDROOT=path/to/buildroot - You'll find the resulting disassembled files in `/output/images/disassembly`. +## Generate Memory Files for Linux Boot + +Running a linux boot simulation uses a preloaded bootrom and ram memory. We use QEMU to generate these preloaded memory files. The files are output to $RISCV/linux-testvectors. The memory files are generated automatically when using the main `make` command. Alternatively, they can be generated by running + + make dumptvs + ## Creating a Bootable SD Card -To flash a bootable sd card for Wally's bootloader, use the `flash-sd.sh` script located in `/linux/sdcard`. The script allows you to specify which buildroot directory you would like to use and to specify the device tree. By default it is set up for the default location of buildroot in `/opt/riscv` and uses the vcu108 device tree. To use the script with your own buildroot directory and device tree, type: +To flash a bootable sd card for Wally's bootloader, use the `flash-sd.sh` script located in `/linux/sdcard`. The script allows you to specify which buildroot directory you would like to use and to specify the device tree. By default it is set up for the default location of buildroot in `$RISCV` and uses the vcu108 device tree. To use the script with your own buildroot directory and device tree, type: $ cd sdcard $ ./flash-sd.sh -b -d - - for example - - $ ./flash-sd.sh -b ~/repos/buildroot -d wally-vcu118.dtb /dev/sdb - +for example + + $ ./flash-sd.sh -b ~/repos/buildroot -d wally-vcu118.dtb /dev/sdb diff --git a/linux/sdcard/Makefile b/linux/sdcard/Makefile index 7c6c012f9..643514815 100644 --- a/linux/sdcard/Makefile +++ b/linux/sdcard/Makefile @@ -1,5 +1,3 @@ -RISCV := /opt/riscv - .PHONY: all clean all: diff --git a/linux/sdcard/flash-sd.sh b/linux/sdcard/flash-sd.sh index 7019611a9..7a2c58d42 100755 --- a/linux/sdcard/flash-sd.sh +++ b/linux/sdcard/flash-sd.sh @@ -25,7 +25,6 @@ ERRORTEXT="$BOLDRED"ERROR:"$NC" WARNINGTEXT="$BOLDYELLOW"Warning:"$NC" # Default values for buildroot and device tree -RISCV=/opt/riscv BUILDROOT=$RISCV/buildroot DEVICE_TREE=wally-vcu108.dtb MNT_DIR=wallyimg diff --git a/linux/sdcard/make-img.sh b/linux/sdcard/make-img.sh index 12a9084d4..df6193f16 100755 --- a/linux/sdcard/make-img.sh +++ b/linux/sdcard/make-img.sh @@ -9,7 +9,6 @@ NC='\033[0m' NAME="$GREEN"${0:2}"$NC" # File location variables -RISCV=/opt/riscv IMAGES=$RISCV/buildroot/output/images FW_JUMP=$IMAGES/fw_jump.bin LINUX_KERNEL=$IMAGES/Image diff --git a/linux/testvector-generation/disassembleBootTrace.py b/linux/testvector-generation/disassembleBootTrace.py index 12e2202cb..ac36fd36e 100755 --- a/linux/testvector-generation/disassembleBootTrace.py +++ b/linux/testvector-generation/disassembleBootTrace.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # # disassembleBootTrace.py # David_Harris@hmc.edu 22 November 2023 diff --git a/linux/testvector-generation/filterTrapsToInterrupts.py b/linux/testvector-generation/filterTrapsToInterrupts.py index de0553098..7476e110f 100755 --- a/linux/testvector-generation/filterTrapsToInterrupts.py +++ b/linux/testvector-generation/filterTrapsToInterrupts.py @@ -1,4 +1,4 @@ -#! /usr/bin/python3 +#!/usr/bin/env python3 import sys, os from functools import reduce diff --git a/linux/testvector-generation/genInitMem.sh b/linux/testvector-generation/genInitMem.sh index b9c1d8c41..1274a4240 100755 --- a/linux/testvector-generation/genInitMem.sh +++ b/linux/testvector-generation/genInitMem.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -e tcpPort=1235 imageDir=$RISCV/buildroot/output/images tvDir=$RISCV/linux-testvectors @@ -7,28 +8,28 @@ ramFile="$tvDir/ram.bin" rawBootmemFile="$tvDir/bootmemGDB.bin" bootmemFile="$tvDir/bootmem.bin" rawUntrimmedBootmemFile="$tvDir/untrimmedBootmemFileGDB.bin" -untrimmedBootmemFile="$tvDir/untrimmedBootmemFile.bin" DEVICE_TREE=${imageDir}/wally-virt.dtb -if [ ! -d "$tvDir" ]; then - echo "Error: linux testvector directory $tvDir not found!">&2 - echo "Please create it. For example:">&2 - echo " sudo mkdir -p $tvDir">&2 +if ! mkdir -p "$tvDir"; then + echo "Error: unable to create linux testvector directory $tvDir!">&2 + echo "Please try running as sudo.">&2 exit 1 fi -test -w $tvDir -if [ ! $? -eq 0 ]; then - echo "Error: insuffcient write privileges for linux testvector directory $tvDir !">&2 - echo "Please chmod it. For example:">&2 - echo " sudo chmod -R a+rw $tvDir">&2 - exit 1 +if ! test -w "$tvDir"; then + echo "Using sudo to gain access to $tvDir" + if ! sudo chmod -R a+rw "$tvDir"; then + echo "Error: insuffcient write privileges for linux testvector directory $tvDir !">&2 + echo "Please chmod it. For example:">&2 + echo " sudo chmod -R a+rw $tvDir">&2 + exit 1 + fi fi echo "Launching QEMU in replay mode!" (qemu-system-riscv64 \ --M virt -m 256M -dtb $DEVICE_TREE \ +-M virt -m 256M -dtb "$DEVICE_TREE" \ -nographic \ --bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ +-bios "$imageDir"/fw_jump.elf -kernel "$imageDir"/Image -append "root=/dev/vda ro" -initrd "$imageDir"/rootfs.cpio \ -gdb tcp::$tcpPort -S) \ & riscv64-unknown-elf-gdb --quiet \ -ex "set pagination off" \ @@ -44,15 +45,10 @@ echo "Launching QEMU in replay mode!" -ex "kill" \ -ex "q" -#-ex "printf \"Warning - please verify that the second half of $rawUntrimmedBootmemFile is all 0s\n\"" \ -#-ex "printf \"Creating $rawUntrimmedBootmemFile\n\"" \ -#-ex "dump binary memory $rawUntrimmedBootmemFile 0x1000 0x2fff" \ - echo "Changing Endianness" make fixBinMem ./fixBinMem "$rawRamFile" "$ramFile" ./fixBinMem "$rawBootmemFile" "$bootmemFile" -#./fixBinMem "$rawUntrimmedBootmemFile" "$untrimmedBootmemFile" # doesn't seem to be used for anything rm -f "$rawRamFile" "$rawBootmemFile" "$rawUntrimmedBootmemFile" echo "genInitMem.sh completed!" @@ -60,4 +56,3 @@ echo "You may want to restrict write access to $tvDir now and give cad ownership echo "Run the following:" echo " sudo chown -R cad:cad $tvDir" echo " sudo chmod -R go-w $tvDir" - diff --git a/linux/testvector-generation/parseGDBtoTrace.py b/linux/testvector-generation/parseGDBtoTrace.py index 9a467e3e2..a5ace11b0 100755 --- a/linux/testvector-generation/parseGDBtoTrace.py +++ b/linux/testvector-generation/parseGDBtoTrace.py @@ -1,4 +1,4 @@ -#! /usr/bin/python3 +#!/usr/bin/env python3 import sys, fileinput, re # Ross Thompson diff --git a/linux/testvector-generation/parsePlicState.py b/linux/testvector-generation/parsePlicState.py index 49f2a558e..5fb2b4eac 100755 --- a/linux/testvector-generation/parsePlicState.py +++ b/linux/testvector-generation/parsePlicState.py @@ -1,4 +1,4 @@ -#! /usr/bin/python3 +#!/usr/bin/env python3 import sys, os from functools import reduce diff --git a/linux/testvector-generation/parseQEMUtoGDB.py b/linux/testvector-generation/parseQEMUtoGDB.py index aea5e057e..457085a1b 100755 --- a/linux/testvector-generation/parseQEMUtoGDB.py +++ b/linux/testvector-generation/parseQEMUtoGDB.py @@ -1,4 +1,4 @@ -#! /usr/bin/python3 +#!/usr/bin/env python3 import fileinput, sys parseState = "idle" diff --git a/linux/testvector-generation/parseState.py b/linux/testvector-generation/parseState.py index 1f7e93c09..f54ba0f78 100755 --- a/linux/testvector-generation/parseState.py +++ b/linux/testvector-generation/parseState.py @@ -1,4 +1,4 @@ -#! /usr/bin/python3 +#!/usr/bin/env python3 import sys, os ################ diff --git a/linux/testvector-generation/parseUartState.py b/linux/testvector-generation/parseUartState.py index 611937054..82028d528 100755 --- a/linux/testvector-generation/parseUartState.py +++ b/linux/testvector-generation/parseUartState.py @@ -1,4 +1,4 @@ -#! /usr/bin/python3 +#!/usr/bin/env python3 import sys, os ################ diff --git a/setup.csh b/setup.csh index 62a99f376..6b9fa6020 100755 --- a/setup.csh +++ b/setup.csh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/csh # setup.csh # james.stine@okstate.edu 18 February 2023 @@ -11,7 +11,17 @@ alias extend 'if (-d \!:2) if ("$\!:1" \!~ *"\!:2"*) setenv \!:1 ${\!:1}:\!:2;ec alias prepend 'if (-d \!:2) if ("$\!:1" \!~ *"\!:2"*) setenv \!:1 "\!:2":${\!:1};echo Added \!:2 to \!:1' # Path to RISC-V Tools -setenv RISCV /opt/riscv # change this if you installed the tools in a different location +if ( -d /opt/riscv ) then + setenv RISCV /opt/riscv +else if ( -d ~/riscv ) then + setenv RISCV ~/riscv +else + # set the $RISCV directory here and remove the subsequent two lines + # setenv RISCV + echo "\$RISCV directory not found. Checked /opt/riscv and ~/riscv. Edit setup.csh to point to your custom \$RISCV directory." + exit 1; +endif +echo \$RISCV set to "${RISCV}" # Path to Wally repository setenv WALLY $PWD @@ -19,6 +29,14 @@ echo '$WALLY set to ' ${WALLY} # utility functions in Wally repository extend PATH $WALLY/bin -source $RISCV/site-setup.csh +# Verilator needs a larger stack to simulate CORE-V Wally +limit stacksize unlimited + +# load site licenses and tool locations +if ( -e "${RISCV}"/site-setup.csh ) then + source $RISCV/site-setup.csh +else + echo "site-setup.csh not found in \$RISCV directory. Rerun wally-toolchain-install.sh to automatically download it." +fi echo "setup done" diff --git a/setup.sh b/setup.sh index 656fed5a6..9f0fca993 100644 --- a/setup.sh +++ b/setup.sh @@ -14,23 +14,33 @@ echo "Executing Wally setup.sh" # Path to RISC-V Tools -export RISCV=/opt/riscv # change this if you installed the tools in a different location +if [ -d /opt/riscv ]; then + export RISCV=/opt/riscv +elif [ -d ~/riscv ]; then + export RISCV=~/riscv +else + # set the $RISCV directory here and remove the subsequent two lines + # export RISCV= + echo "\$RISCV directory not found. Checked /opt/riscv and ~/riscv. Edit setup.sh to point to your custom \$RISCV directory." + exit 1 +fi +echo \$RISCV set to "${RISCV}" # Path to Wally repository -WALLY=$(dirname ${BASH_SOURCE[0]:-$0}) +WALLY=$(dirname "${BASH_SOURCE[0]:-$0}") export WALLY=$(cd "$WALLY" && pwd) -echo \$WALLY set to ${WALLY} +echo \$WALLY set to "${WALLY}" # utility functions in Wally repository -export PATH=$WALLY/bin:$PATH +export PATH=$WALLY/bin:$PATH -# Verilator needs a larger stack to simulate CORE-V Wally -ulimit -c 234613 +# Verilator needs a larger core file size to simulate CORE-V Wally +ulimit -c 300000 # load site licenses and tool locations -if [ -f ${RISCV}/site-setup.sh ]; then - source ${RISCV}/site-setup.sh +if [ -e "${RISCV}"/site-setup.sh ]; then + source "${RISCV}"/site-setup.sh else - source ${WALLY}/site-setup.sh + echo "site-setup.sh not found in \$RISCV directory. Rerun wally-toolchain-install.sh to automatically download it." fi echo "setup done" diff --git a/sim/Makefile b/sim/Makefile index 1197dfc2e..b420acab4 100644 --- a/sim/Makefile +++ b/sim/Makefile @@ -41,9 +41,9 @@ QuestaFunctCoverage: ${SIM}/questa/fcov_ucdb/rv64gc_WALLY-COV-add.elf.ucdb imperasdv_cov: touch ${SIM}/seed0.txt echo "0" > ${SIM}/seed0.txt -# /opt/riscv/ImperasDV-OpenHW/scripts/cvw/run-elf-cov.bash --verbose --seed 0 --search ${WALLY}/tests/riscof/work/wally-riscv-arch-test/rv64i_m -# /opt/riscv/ImperasDV-OpenHW/scripts/cvw/run-elf-cov.bash --elf ${WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/I/src/add-01.S/dut/my.elf --seed ${SIM}/seed0.txt --coverdb ${SIM}/cov/rv64gc_arch64i.ucdb --verbose -# /opt/riscv/ImperasDV-OpenHW/scripts/cvw/run-elf-cov.bash --elf ${WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/I/src/add-01.S/dut/my.elf --seed ${SIM}/seed0.txt --coverdb ${SIM}/questa/riscv.ucdb --verbose +# ${RISCV}/ImperasDV-OpenHW/scripts/cvw/run-elf-cov.bash --verbose --seed 0 --search ${WALLY}/tests/riscof/work/wally-riscv-arch-test/rv64i_m +# ${RISCV}/ImperasDV-OpenHW/scripts/cvw/run-elf-cov.bash --elf ${WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/I/src/add-01.S/dut/my.elf --seed ${SIM}/seed0.txt --coverdb ${SIM}/cov/rv64gc_arch64i.ucdb --verbose +# ${RISCV}/ImperasDV-OpenHW/scripts/cvw/run-elf-cov.bash --elf ${WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/I/src/add-01.S/dut/my.elf --seed ${SIM}/seed0.txt --coverdb ${SIM}/questa/riscv.ucdb --verbose run-elf-cov.bash --elf ${WALLY}/tests/riscvdv/asm_test/riscv_arithmetic_basic_test_0.elf --seed ${SIM}/questa/seed0.txt --coverdb ${SIM}/questa/riscv.ucdb --verbose vcover report -details -html ${SIM}/questa/riscv.ucdb diff --git a/sim/bpred-sim.py b/sim/bpred-sim.py index c04b9bd51..45c0965a1 100755 --- a/sim/bpred-sim.py +++ b/sim/bpred-sim.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 ################################## # # regression-wally diff --git a/sim/buildrootBugFinder.py b/sim/buildrootBugFinder.py index af6324596..ee9fe0603 100755 --- a/sim/buildrootBugFinder.py +++ b/sim/buildrootBugFinder.py @@ -1,10 +1,11 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 import sys, os, subprocess def main(): + RISCV = os.environ.get("RISCV") maxGoodCount = 400e6 # num instrs that execute sucessfully starting from 0 currInstrCount = maxGoodCount - linuxTestvectors = "/opt/riscv/linux-testvectors" + linuxTestvectors = RISCV+"/linux-testvectors" if not os.path.exists(linuxTestvectors): sys.stderr.write("Error: Linux testvectors not found at "+linuxTestvectors+"\n") exit(1) @@ -22,7 +23,7 @@ def main(): break checkpoint = checkpointList[0] logFile = logDir+"checkpoint"+str(checkpoint)+".log" - runCommand="{\nvsim -c <