Merge pull request #869 from jordancarlin/installation

Installation and setup overhaul
This commit is contained in:
David Harris 2024-08-08 15:39:23 -07:00 committed by GitHub
commit bc70f0b933
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
88 changed files with 964 additions and 407 deletions

8
.gitmodules vendored
View File

@ -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"] [submodule "addins/riscv-dv"]
path = addins/riscv-dv path = addins/riscv-dv
url = https://github.com/google/riscv-dv url = https://github.com/google/riscv-dv
@ -29,7 +23,7 @@
url = https://github.com/ross144/branch-predictor-simulator url = https://github.com/ross144/branch-predictor-simulator
[submodule "addins/ahbsdc"] [submodule "addins/ahbsdc"]
path = addins/ahbsdc path = addins/ahbsdc
url = http://github.com/JacobPease/ahbsdc.git url = https://github.com/JacobPease/ahbsdc.git
[submodule "addins/verilog-ethernet"] [submodule "addins/verilog-ethernet"]
sparseCheckout = true sparseCheckout = true
path = addins/verilog-ethernet path = addins/verilog-ethernet

View File

@ -1,6 +1,6 @@
# core-v-wally # 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) ![Wally block diagram](wallyriscvTopAll.png)
@ -34,71 +34,103 @@ Then fork and clone the repo, source setup, make the tests and run regression
On the Linux computer where you will be working, log in On the Linux computer where you will be working, log in
Clone your fork of the repo and run the setup script. Change <yourgithubid> to your github id. Clone your fork of the repo. Change `<yourgithubid>` to your github id.
$ git clone --recurse-submodules https://github.com/<yourgithubid>/cvw $ git clone --recurse-submodules https://github.com/<yourgithubid>/cvw
$ cd cvw $ cd cvw
$ git remote add upstream https://github.com/openhwgroup/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 $ 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 if [ -f ~/cvw/setup.sh ]; then
source ~/cvw/setup.sh source ~/cvw/setup.sh
fi 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 $ 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 This section describes the open source toolchain installation.
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.
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. 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.
This allows for customization of the site specific information such as commerical licenses and PATH variables.
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 MGLS_LICENSE_FILE=.. # Change this to your Siemens license server
export SNPSLMD_LICENSE_FILE=.. # Change this to your Synopsys license server export SNPSLMD_LICENSE_FILE=.. # Change this to your Synopsys license server
export QUESTAPATH=.. # Change this for your path to Questa export QUESTA_HOME=.. # Change this for your path to Questa
export SNPSPATH=.. # Change this for your path to Design Compiler 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, # Installing EDA Tools
or to issue the commands one at a time to install on the command line.
## 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. 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 users 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 users 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 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. 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 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 Click on SynopsysInstaller_v5.4.run
Return to downloads and also get Design Compiler (synthesis) latest version, and any others you want. 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 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 move other files into /cad/synopsys/downloads and work as user cad from here on
$ cd /cad/synopsys/installer_5.4 $ cd /cad/synopsys/installer_5.4
@ -127,7 +159,7 @@ The Synopsys Installer automatically installs all downloaded product files into
/import/programs/synopsys/syn/S-2021.06-SP1 /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.
@ -136,7 +168,7 @@ If you want to implement your own version of the chip, your tool and license com
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. 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: If you want to add a cronjob you can do the following:
1) Set up the email client `mutt` for your distribution 1) Set up the email client `mutt` for your distribution

View File

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python3
################################################## ##################################################
## coremark_sweep.py ## coremark_sweep.py

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# embench_arch_sweep.py # embench_arch_sweep.py
# David_Harris@hmc.edu 16 November 2023 # David_Harris@hmc.edu 16 November 2023
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 # SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Daniel Torres 2022 # Daniel Torres 2022
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1 # SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -W #!/usr/bin/env -S perl -w
########################################### ###########################################
## derivgen.pl ## derivgen.pl

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -w #!/usr/bin/env -S perl -w
########################################### ###########################################
## exe2memfile.pl ## exe2memfile.pl

View File

@ -1,4 +1,4 @@
#!/usr/bin/bash #!/bin/bash
# #
# fparchtest.sh # fparchtest.sh
# David_Harris@hmc.edu 26 December 2023 # David_Harris@hmc.edu 26 December 2023

View File

@ -1,4 +1,4 @@
#!/bin/perl -W #!/usr/bin/env -S perl -w
########################################### ###########################################
## libppa.pl ## libppa.pl
@ -43,7 +43,7 @@ my @cr; my @cf; my @rt; my @ft;
my $libpath; my $libbase; my $cellname; my @corners; my $libpath; my $libbase; my $cellname; my @corners;
# Sky130 # 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_"; $libbase = "sky130_osu_sc_12T_ms_";
$cellname = "sky130_osu_sc_12T_ms__inv_1"; $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"); @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 # 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_"; $libbase = "scc9gena_";
$cellname = "scc9gena_inv_1"; $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"); @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");

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
""" """
Python Regression Build Automation Script Python Regression Build Automation Script

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
########################################### ###########################################
## Written: Rose Thompson ross1728@gmail.com ## Written: Rose Thompson ross1728@gmail.com

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# #
# regression-wally # regression-wally

14
bin/requirements.txt Normal file
View File

@ -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

View File

@ -1,4 +1,4 @@
#!/bin/perl -W #!/usr/bin/env -S perl -w
########################################### ###########################################
## testlist.pl ## testlist.pl

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl -w #!/usr/bin/env -S perl -w
########################################### ###########################################
## vclean.pl ## vclean.pl

92
bin/wally-distro-check.sh Executable file
View File

@ -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"

129
bin/wally-package-install.sh Executable file
View File

@ -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

View File

@ -6,13 +6,14 @@
## Created: 18 January 2023 ## Created: 18 January 2023
## Modified: 22 January 2023 ## Modified: 22 January 2023
## Modified: 23 March 2023 ## Modified: 23 March 2023
## Modified: 30 June 2024, Jordan Carlin jcarlin@hmc.edu
## ##
## Purpose: Open source tool chain installation script ## Purpose: Open source tool chain installation script
## ##
## A component of the CORE-V-WALLY configurable RISC-V project. ## A component of the CORE-V-WALLY configurable RISC-V project.
## https://github.com/openhwgroup/cvw ## 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 ## SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
## ##
@ -28,165 +29,418 @@
## and limitations under the License. ## and limitations under the License.
################################################################################################ ################################################################################################
# Use /opt/riscv for installation - may require running script with sudo # Increasing NUM_THREADS will speed up parallel compilation of the tools
export RISCV="${1:-/opt/riscv}" NUM_THREADS=$(nproc --ignore 1) # One less than the total number of threads
export PATH=$PATH:$RISCV/bin:/usr/bin
# 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 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 # Check for clean flag
# Increasing NUM_THREADS will speed up parallel compilation of the tools if [ "$1" == "--clean" ]; then
#NUM_THREADS=2 # for low memory machines > 16GiB clean=true
NUM_THREADS=8 # for >= 32GiB shift
#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
fi fi
# gcc cross-compiler (https://github.com/riscv-collab/riscv-gnu-toolchain) # 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. # To install GCC from source can take hours to compile.
# This configuration enables multilib to target many flavors of RISC-V. # This configuration enables multilib to target many flavors of RISC-V.
# This book is tested with GCC 13.2.0 # 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: section_header "Installing/Updating RISC-V GNU Toolchain"
# cvw/addins/riscv-arch-test/riscv-test-suite/rv32i_m/I/src/jalr-01.S:72: Error: illegal operands `la x0,5b' STATUS="RISC-V GNU Toolchain"
# PR *** submitted to fix riscv-arch-test to be compatible with latest GCC by modifying test_macros.h for TEST_JALR_OP cd "$RISCV"
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
git clone https://github.com/riscv/riscv-gnu-toolchain cd riscv-gnu-toolchain
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--;" ./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 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) # elf2hex (https://github.com/sifive/elf2hex)
#The elf2hex utility to converts executable files into hexadecimal files for Verilog simulation. # The elf2hex utility to converts executable files into hexadecimal files for Verilog simulation.
# Note: The exe2hex utility that comes with Spike doesnt work for our purposes because it doesnt # Note: The exe2hex utility that comes with Spike doesnt work for our purposes because it doesnt
# handle programs that start at 0x80000000. The SiFive version above is touchy to install. # 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 wont install correctly. # For example, if Python version 2.x is in your path, it wont install correctly.
# Also, be sure riscv64-unknown-elf-objcopy shows up in your path in $RISCV/riscv-gnu-toolchain/bin # 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 wont work properly. # at the time of compilation, or elf2hex wont work properly.
cd $RISCV section_header "Installing/Updating elf2hex"
STATUS="elf2hex"
cd "$RISCV"
export PATH=$RISCV/bin:$PATH export PATH=$RISCV/bin:$PATH
git clone https://github.com/sifive/elf2hex.git if git_check "elf2hex" "https://github.com/sifive/elf2hex.git" "$RISCV/bin/riscv64-unknown-elf-elf2bin"; then
cd elf2hex cd elf2hex
autoreconf -i git reset --hard && git clean -f && git checkout master && git pull
./configure --target=riscv64-unknown-elf --prefix=$RISCV autoreconf -i
make ./configure --target=riscv64-unknown-elf --prefix="$RISCV"
make install 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) # QEMU (https://www.qemu.org/docs/master/system/target-riscv.html)
cd $RISCV # QEMU is an open source machine emulator and virtualizer capable of emulating RISC-V
git clone --recurse-submodules https://github.com/qemu/qemu section_header "Installing/Updating QEMU"
cd qemu STATUS="QEMU"
./configure --target-list=riscv64-softmmu --prefix=$RISCV cd "$RISCV"
make -j 8 if git_check "qemu" "https://github.com/qemu/qemu" "$RISCV/include/qemu-plugin.h"; then
make install 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 (https://github.com/riscv-software-src/riscv-isa-sim)
# Spike also takes a while to install and compile, but this can be done concurrently # Spike is a reference model for RISC-V. It is a functional simulator that can be used to run RISC-V programs.
# with the GCC installation. section_header "Installing/Updating SPIKE"
cd $RISCV STATUS="SPIKE"
git clone https://github.com/riscv-software-src/riscv-isa-sim cd "$RISCV"
mkdir -p riscv-isa-sim/build 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/build cd riscv-isa-sim
../configure --prefix=$RISCV git reset --hard && git clean -f && git checkout master && git pull
make -j 8 mkdir -p build
make install 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 (https://github.com/verilator/verilator)
# Verilator needs to be built from scratch to get the latest version # Verilator is a fast open-source Verilog simulator that compiles synthesizable Verilog code into C++ code.
# apt-get install verilator installs version 4.028 as of 6/8/23 # It is used for linting and simulation of Wally.
sudo apt-get install -y perl g++ ccache help2man libgoogle-perftools-dev numactl perl-doc zlib1g # Verilator needs to be built from source to get the latest version (Wally needs 5.021 or later).
cd $RISCV section_header "Installing/Updating Verilator"
git clone https://github.com/verilator/verilator # Only first time STATUS="Verilator"
# unsetenv VERILATOR_ROOT # For csh; ignore error if on bash cd "$RISCV"
unset VERILATOR_ROOT # For bash if git_check "verilator" "https://github.com/verilator/verilator" "$RISCV/share/pkgconfig/verilator.pc"; then
cd verilator unset VERILATOR_ROOT
git pull # Make sure git repository is up-to-date cd verilator
git checkout master git reset --hard && git clean -f && git checkout master && git pull
autoconf # Create ./configure script autoconf
./configure # Configure and create Makefile ./configure --prefix="$RISCV"
make -j 8 # Build Verilator itself (if error, try just 'make') make -j "${NUM_THREADS}" 2>&1 | logger verilator; [ "${PIPESTATUS[0]}" == 0 ]
sudo make install make install 2>&1 | logger verilator; [ "${PIPESTATUS[0]}" == 0 ]
if [ "$clean" ]; then
# Sail (https://github.com/riscv/sail-riscv) cd "$RISCV"
# Sail is the new golden reference model for RISC-V. Sail is written in OCaml, which rm -rf verilator
# is an object-oriented extension of ML, which in turn is a functional programming fi
# language suited to formal verification. OCaml is installed with the opam OCcaml echo -e "${SUCCESS_COLOR}Verilator successfully installed/updated!${ENDC}"
# package manager. Sail has so many dependencies that it can be difficult to install. else
# This script works for Ubuntu. echo -e "${SUCCESS_COLOR}Verilator already up to date.${ENDC}"
fi
# 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/.
# This was an earlier attemp to prepare to install Sail on RedHat 8 # Install opam from binary disribution on rhel as it is not available from dnf
# Do these commands only for RedHat / Rocky 8 to build from source. # Opam is needed to install the sail compiler
#cd $RISCV if [ "$FAMILY" == rhel ]; then
#git clone https://github.com/Z3Prover/z3.git section_header "Installing/Updating Opam"
#cd z3 STATUS="Opam"
#python scripts/mk_make.py export OPAMROOTISOK=1 # Silence warnings about running opam as root
#cd build cd "$RISCV"
#make -j 8 mkdir -p opam
#make install cd opam
#cd ../.. wget https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh
#pip3 install chardet==3.0.4 printf '%s\n' "$RISCV"/bin Y | sh install.sh # the print command provides $RISCV/bin as the installation path when prompted
#pip3 install urllib3==1.22 cd "$RISCV"
rm -rf opam
echo -e "${SUCCESS_COLOR}Opam successfully installed/updated!${ENDC}"
fi
cd $RISCV # Sail Compiler (https://github.com/rems-project/sail)
opam init -y --disable-sandboxing # Sail is a formal specification language designed for describing the semantics of an ISA.
opam update # It is used to generate the RISC-V Sail Model, which is the golden reference model for RISC-V.
opam upgrade # The Sail Compiler is written in OCaml, which is an object-oriented extension of ML, which in turn
opam switch create 5.1.0 # 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 opam install sail -y
echo -e "${SUCCESS_COLOR}Sail Compiler successfully installed/updated!${ENDC}"
eval $(opam config env) # RISC-V Sail Model (https://github.com/riscv/sail-riscv)
git clone https://github.com/riscv/sail-riscv.git # The RISC-V Sail Model is the golden reference model for RISC-V. It is written in Sail (described above)
cd sail-riscv section_header "Installing/Updating RISC-V Sail Model"
# For now, use checkout that is stable for Wally STATUS="RISC-V Sail Model"
#git checkout 72b2516d10d472ac77482fd959a9401ce3487f60 # not new enough for Zicboz? if git_check "sail-riscv" "https://github.com/riscv/sail-riscv.git" "$RISCV/bin/riscv_sim_RV32"; then
export OPAMCLI=2.0 # Sail is not compatible with opam 2.1 as of 4/16/24 cd sail-riscv
ARCH=RV64 make -j 8 c_emulator/riscv_sim_RV64 git reset --hard && git clean -f && git checkout master && git pull
ARCH=RV32 make -j 8 c_emulator/riscv_sim_RV32 export OPAMCLI=2.0 # Sail is not compatible with opam 2.1 as of 4/16/24
sudo ln -sf $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 ARCH=RV64 make -j "${NUM_THREADS}" c_emulator/riscv_sim_RV64 2>&1 | logger sailModel; [ "${PIPESTATUS[0]}" == 0 ]
sudo ln -sf $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 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 # OSU Skywater 130 cell library (https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12)
sudo mkdir -p $RISCV/cad/lib # The OSU Skywater 130 cell library is a standard cell library that is used to synthesize Wally.
cd $RISCV/cad/lib section_header "Installing/Updating OSU Skywater 130 cell library"
sudo git clone https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12 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}"

View File

@ -17,5 +17,5 @@ source ./setup.sh
cd $PYTHON_SCRIPT cd $PYTHON_SCRIPT
pwd pwd
echo "Running python file" echo "Running python file"
python nightly_build.py $RISCV/riscv-python/bin/python nightly_build.py
echo "Finished" echo "Finished"

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# #
# wsim # wsim
# David_Harris@hmc.edu 5 April 2024 # David_Harris@hmc.edu 5 April 2024

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
########################################### ###########################################
## fpgaTop.sv ## fpgaTop.sv
## ##

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
########################################### ###########################################
## probe.sh ## probe.sh
## ##

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
########################################### ###########################################
## proberange.sh ## proberange.sh
## ##

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
########################################### ###########################################
## probe.sh ## probe.sh
## ##

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
import sys import sys
import re import re

View File

@ -1,10 +1,10 @@
all: rvvidaemon all: rvvidaemon
rvvidaemon: rvvidaemon.o 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 %.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: clean:
rm *.o rvvidaemon rm *.o rvvidaemon

View File

@ -1,4 +1,3 @@
#BUILDROOT := ${RISCV}/buildroot-test
BUILDROOT := buildroot BUILDROOT := buildroot
IMAGES := ${BUILDROOT}/output/images IMAGES := ${BUILDROOT}/output/images
WALLY := $(shell dirname $(shell pwd)) WALLY := $(shell dirname $(shell pwd))
@ -7,6 +6,13 @@ DIS := ${IMAGES}/disassembly
BRPACKAGES := $(WALLYLINUX)/buildroot-packages BRPACKAGES := $(WALLYLINUX)/buildroot-packages
BR2023 := $(WALLYLINUX)/buildroot-config-src/buildroot-2023.05.1 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 # Buildroot Config Stuff
WALLYBOARDSRC := $(WALLYLINUX)/buildroot-config-src/wally WALLYBOARDSRC := $(WALLYLINUX)/buildroot-config-src/wally
WALLYBOARD := $(BUILDROOT)/board/wally WALLYBOARD := $(BUILDROOT)/board/wally
@ -27,35 +33,34 @@ BINARIES := fw_jump.elf vmlinux busybox
OBJDUMPS := $(foreach name, $(BINARIES), $(basename $(name) .elf)) OBJDUMPS := $(foreach name, $(BINARIES), $(basename $(name) .elf))
OBJDUMPS := $(foreach name, $(OBJDUMPS), $(DIS)/$(name).objdump) 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: Image:
bash -c "unset LD_LIBRARY_PATH; make -C $(BUILDROOT) --jobs;" bash -c "unset LD_LIBRARY_PATH; $(MAKE) -C $(BUILDROOT)"
$(MAKE) generate $(MAKE) generate
@echo "Buildroot Image successfully generated."
install: install: check_write_permissions
sudo rm -rf $(RISCV)/$(BUILDROOT) $(SUDO) rm -rf $(RISCV)/$(BUILDROOT)
sudo mv $(BUILDROOT) $(RISCV)/$(BUILDROOT) $(SUDO) mv $(BUILDROOT) $(RISCV)/$(BUILDROOT)
@echo "Buildroot successfully installed."
install_nosudo: dumptvs: check_write_permissions
rm -rf $(RISCV)/$(BUILDROOT) $(SUDO) mkdir -p $(RISCV)/linux-testvectors
mv $(BUILDROOT) $(RISCV)/$(BUILDROOT)
dumptvs:
sudo mkdir -p $(RISCV)/linux-testvectors
cd testvector-generation; sudo ./genInitMem.sh
dumptvs_nosudo:
mkdir -p $(RISCV)/linux-testvectors
cd testvector-generation; ./genInitMem.sh cd testvector-generation; ./genInitMem.sh
@echo "Testvectors successfully generated."
# Temp rule for debugging
test:
echo $(shell find $(BUILDROOT)/output/build -maxdepth 2 -type d -regex ".*/linux-[0-9]+\.[0-9]+\.[0-9]+$$")
generate: $(DTB) $(IMAGES) generate: $(DTB) $(IMAGES)
@ -68,28 +73,27 @@ $(IMAGES):
$(RISCV): $(RISCV):
@ echo "ERROR: No $(RISCV) directory. Make sure you have installed the Wally Toolchain." @ echo "ERROR: No $(RISCV) directory. Make sure you have installed the Wally Toolchain."
@ echo "this can be done with <WALLY>/bin/wally-tool-chain-install.sh" @ echo "and sourced setup.sh"
# Disassembly rules --------------------------------------------------- # Disassembly rules ---------------------------------------------------
disassemble: disassemble:
rm -rf $(BUILDROOT)/output/images/disassembly rm -rf $(BUILDROOT)/output/images/disassembly
find $(BUILDROOT)/output/build/linux-* -maxdepth 1 -name "vmlinux" | xargs cp -t $(BUILDROOT)/output/images/ find $(BUILDROOT)/output/build/linux-* -maxdepth 1 -name "vmlinux" | xargs cp -t $(BUILDROOT)/output/images/
mkdir -p $(DIS) mkdir -p $(DIS)
make -j $(OBJDUMPS) $(MAKE) $(OBJDUMPS)
# extract rootfs # extract rootfs
mkdir -p $(BUILDROOT)/output/images/disassembly/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 -cpio -i -D $(BUILDROOT)/output/images/disassembly/rootfs < $(BUILDROOT)/output/images/rootfs.cpio
@echo "Disassembly successfully completed."
$(DIS)/%.objdump: $(IMAGES)/%.elf $(DIS)/%.objdump: $(IMAGES)/%.elf
riscv64-unknown-elf-objdump -DS $< >> $@ riscv64-unknown-elf-objdump -DS $< >> $@
extractFunctionRadix.sh $@ $(WALLY)/bin/extractFunctionRadix.sh $@
$(DIS)/%.objdump: $(IMAGES)/% $(DIS)/%.objdump: $(IMAGES)/%
riscv64-unknown-elf-objdump -S $< >> $@ riscv64-unknown-elf-objdump -S $< >> $@
extractFunctionRadix.sh $@ $(WALLY)/bin/extractFunctionRadix.sh $@
$(IMAGES)/vmlinux: $(IMAGES)/vmlinux:
linuxDir=$$(find $(BUILDROOT)/output/build -maxdepth 2 -type d -regex ".*/linux-[0-9]+\.[0-9]+\.[0-9]+$$") ;\ 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 $@ ;\ cp $$busyboxDir/busybox $@ ;\
# Generating new Buildroot directories -------------------------------- # Generating new Buildroot directories --------------------------------
# This directive should be run as: make install BUILDROOT=path/to/buildroot
download: $(WALLYBOARD) download: $(WALLYBOARD)
cp $(WALLYBOARD)/main.config $(BUILDROOT)/.config cp $(WALLYBOARD)/main.config $(BUILDROOT)/.config
@echo "Buildroot successfully download."
# CONFIG DEPENDENCIES 2023.05.1 --------------------------------------- # CONFIG DEPENDENCIES 2023.05.1 ---------------------------------------
$(WALLYBOARD): $(BUILDROOT) $(WALLYBOARD): $(BUILDROOT)

View File

@ -5,35 +5,30 @@
1. [Setting up Buildroot](#buildroot) 1. [Setting up Buildroot](#buildroot)
2. [Generating Device Tree Binaries](#devicetree) 2. [Generating Device Tree Binaries](#devicetree)
3. [Disassembling the Binaries for Debugging](#disassembly) 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 <a name="buildroot"></a> ## Setting up Buildroot <a name="buildroot"></a>
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.
$ make install BUILDROOT=path/to/buildroot 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:
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 $ 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 `<BUILDROOT>/output/images`. 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
## Generating Device Tree Binaries <a name="devicetree"></a> ## Generating Device Tree Binaries <a name="devicetree"></a>
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.
$ make generate BUILDROOT=path/to/buildroot 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:
Or for the default buildroot location: $ make generate #optionally override BUILDROOT
$ make generate
The .dts files will end up in the `<BUILDROOT>/output/images` folder of your chosen buildroot directory. The .dts files will end up in the `<BUILDROOT>/output/images` folder of your chosen buildroot directory.
@ -41,21 +36,25 @@ The .dts files will end up in the `<BUILDROOT>/output/images` folder of your cho
By using the `riscv64-unknown-elf-objdump` utility, we can disassemble the binaries in `<BUILDROOT>/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. By using the `riscv64-unknown-elf-objdump` utility, we can disassemble the binaries in `<BUILDROOT>/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 BUILDROOT=path/to/buildroot $ make disassemble #optionally override BUILDROOT
You'll find the resulting disassembled files in `<BUILDROOT>/output/images/disassembly`. You'll find the resulting disassembled files in `<BUILDROOT>/output/images/disassembly`.
## Generate Memory Files for Linux Boot <a name="testvectors"></a>
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 <a name="sdcard"></a> ## Creating a Bootable SD Card <a name="sdcard"></a>
To flash a bootable sd card for Wally's bootloader, use the `flash-sd.sh` script located in `<WALLY>/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 `<WALLY>/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 $ cd sdcard
$ ./flash-sd.sh -b <path/to/buildroot> -d <device tree name> <DEVICE> $ ./flash-sd.sh -b <path/to/buildroot> -d <device tree name> <DEVICE>
for example for example
$ ./flash-sd.sh -b ~/repos/buildroot -d wally-vcu118.dtb /dev/sdb $ ./flash-sd.sh -b ~/repos/buildroot -d wally-vcu118.dtb /dev/sdb

View File

@ -1,5 +1,3 @@
RISCV := /opt/riscv
.PHONY: all clean .PHONY: all clean
all: all:

View File

@ -25,7 +25,6 @@ ERRORTEXT="$BOLDRED"ERROR:"$NC"
WARNINGTEXT="$BOLDYELLOW"Warning:"$NC" WARNINGTEXT="$BOLDYELLOW"Warning:"$NC"
# Default values for buildroot and device tree # Default values for buildroot and device tree
RISCV=/opt/riscv
BUILDROOT=$RISCV/buildroot BUILDROOT=$RISCV/buildroot
DEVICE_TREE=wally-vcu108.dtb DEVICE_TREE=wally-vcu108.dtb
MNT_DIR=wallyimg MNT_DIR=wallyimg

View File

@ -9,7 +9,6 @@ NC='\033[0m'
NAME="$GREEN"${0:2}"$NC" NAME="$GREEN"${0:2}"$NC"
# File location variables # File location variables
RISCV=/opt/riscv
IMAGES=$RISCV/buildroot/output/images IMAGES=$RISCV/buildroot/output/images
FW_JUMP=$IMAGES/fw_jump.bin FW_JUMP=$IMAGES/fw_jump.bin
LINUX_KERNEL=$IMAGES/Image LINUX_KERNEL=$IMAGES/Image

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# #
# disassembleBootTrace.py # disassembleBootTrace.py
# David_Harris@hmc.edu 22 November 2023 # David_Harris@hmc.edu 22 November 2023

View File

@ -1,4 +1,4 @@
#! /usr/bin/python3 #!/usr/bin/env python3
import sys, os import sys, os
from functools import reduce from functools import reduce

View File

@ -1,4 +1,5 @@
#!/bin/bash #!/bin/bash
set -e
tcpPort=1235 tcpPort=1235
imageDir=$RISCV/buildroot/output/images imageDir=$RISCV/buildroot/output/images
tvDir=$RISCV/linux-testvectors tvDir=$RISCV/linux-testvectors
@ -7,28 +8,28 @@ ramFile="$tvDir/ram.bin"
rawBootmemFile="$tvDir/bootmemGDB.bin" rawBootmemFile="$tvDir/bootmemGDB.bin"
bootmemFile="$tvDir/bootmem.bin" bootmemFile="$tvDir/bootmem.bin"
rawUntrimmedBootmemFile="$tvDir/untrimmedBootmemFileGDB.bin" rawUntrimmedBootmemFile="$tvDir/untrimmedBootmemFileGDB.bin"
untrimmedBootmemFile="$tvDir/untrimmedBootmemFile.bin"
DEVICE_TREE=${imageDir}/wally-virt.dtb DEVICE_TREE=${imageDir}/wally-virt.dtb
if [ ! -d "$tvDir" ]; then if ! mkdir -p "$tvDir"; then
echo "Error: linux testvector directory $tvDir not found!">&2 echo "Error: unable to create linux testvector directory $tvDir!">&2
echo "Please create it. For example:">&2 echo "Please try running as sudo.">&2
echo " sudo mkdir -p $tvDir">&2
exit 1 exit 1
fi fi
test -w $tvDir if ! test -w "$tvDir"; then
if [ ! $? -eq 0 ]; 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 "Error: insuffcient write privileges for linux testvector directory $tvDir !">&2
echo "Please chmod it. For example:">&2 echo "Please chmod it. For example:">&2
echo " sudo chmod -R a+rw $tvDir">&2 echo " sudo chmod -R a+rw $tvDir">&2
exit 1 exit 1
fi
fi fi
echo "Launching QEMU in replay mode!" echo "Launching QEMU in replay mode!"
(qemu-system-riscv64 \ (qemu-system-riscv64 \
-M virt -m 256M -dtb $DEVICE_TREE \ -M virt -m 256M -dtb "$DEVICE_TREE" \
-nographic \ -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) \ -gdb tcp::$tcpPort -S) \
& riscv64-unknown-elf-gdb --quiet \ & riscv64-unknown-elf-gdb --quiet \
-ex "set pagination off" \ -ex "set pagination off" \
@ -44,15 +45,10 @@ echo "Launching QEMU in replay mode!"
-ex "kill" \ -ex "kill" \
-ex "q" -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" echo "Changing Endianness"
make fixBinMem make fixBinMem
./fixBinMem "$rawRamFile" "$ramFile" ./fixBinMem "$rawRamFile" "$ramFile"
./fixBinMem "$rawBootmemFile" "$bootmemFile" ./fixBinMem "$rawBootmemFile" "$bootmemFile"
#./fixBinMem "$rawUntrimmedBootmemFile" "$untrimmedBootmemFile" # doesn't seem to be used for anything
rm -f "$rawRamFile" "$rawBootmemFile" "$rawUntrimmedBootmemFile" rm -f "$rawRamFile" "$rawBootmemFile" "$rawUntrimmedBootmemFile"
echo "genInitMem.sh completed!" 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 "Run the following:"
echo " sudo chown -R cad:cad $tvDir" echo " sudo chown -R cad:cad $tvDir"
echo " sudo chmod -R go-w $tvDir" echo " sudo chmod -R go-w $tvDir"

View File

@ -1,4 +1,4 @@
#! /usr/bin/python3 #!/usr/bin/env python3
import sys, fileinput, re import sys, fileinput, re
# Ross Thompson # Ross Thompson

View File

@ -1,4 +1,4 @@
#! /usr/bin/python3 #!/usr/bin/env python3
import sys, os import sys, os
from functools import reduce from functools import reduce

View File

@ -1,4 +1,4 @@
#! /usr/bin/python3 #!/usr/bin/env python3
import fileinput, sys import fileinput, sys
parseState = "idle" parseState = "idle"

View File

@ -1,4 +1,4 @@
#! /usr/bin/python3 #!/usr/bin/env python3
import sys, os import sys, os
################ ################

View File

@ -1,4 +1,4 @@
#! /usr/bin/python3 #!/usr/bin/env python3
import sys, os import sys, os
################ ################

View File

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/csh
# setup.csh # setup.csh
# james.stine@okstate.edu 18 February 2023 # 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' alias prepend 'if (-d \!:2) if ("$\!:1" \!~ *"\!:2"*) setenv \!:1 "\!:2":${\!:1};echo Added \!:2 to \!:1'
# Path to RISC-V Tools # 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 # Path to Wally repository
setenv WALLY $PWD setenv WALLY $PWD
@ -19,6 +29,14 @@ echo '$WALLY set to ' ${WALLY}
# utility functions in Wally repository # utility functions in Wally repository
extend PATH $WALLY/bin 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" echo "setup done"

View File

@ -14,23 +14,33 @@
echo "Executing Wally setup.sh" echo "Executing Wally setup.sh"
# Path to RISC-V Tools # 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 # Path to Wally repository
WALLY=$(dirname ${BASH_SOURCE[0]:-$0}) WALLY=$(dirname "${BASH_SOURCE[0]:-$0}")
export WALLY=$(cd "$WALLY" && pwd) export WALLY=$(cd "$WALLY" && pwd)
echo \$WALLY set to ${WALLY} echo \$WALLY set to "${WALLY}"
# utility functions in Wally repository # 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 # Verilator needs a larger core file size to simulate CORE-V Wally
ulimit -c 234613 ulimit -c 300000
# load site licenses and tool locations # load site licenses and tool locations
if [ -f ${RISCV}/site-setup.sh ]; then if [ -e "${RISCV}"/site-setup.sh ]; then
source ${RISCV}/site-setup.sh source "${RISCV}"/site-setup.sh
else 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 fi
echo "setup done" echo "setup done"

View File

@ -41,9 +41,9 @@ QuestaFunctCoverage: ${SIM}/questa/fcov_ucdb/rv64gc_WALLY-COV-add.elf.ucdb
imperasdv_cov: imperasdv_cov:
touch ${SIM}/seed0.txt touch ${SIM}/seed0.txt
echo "0" > ${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 # ${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 # ${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 --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 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 vcover report -details -html ${SIM}/questa/riscv.ucdb

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# #
# regression-wally # regression-wally

View File

@ -1,10 +1,11 @@
#!/usr/bin/python3 #!/usr/bin/env python3
import sys, os, subprocess import sys, os, subprocess
def main(): def main():
RISCV = os.environ.get("RISCV")
maxGoodCount = 400e6 # num instrs that execute sucessfully starting from 0 maxGoodCount = 400e6 # num instrs that execute sucessfully starting from 0
currInstrCount = maxGoodCount currInstrCount = maxGoodCount
linuxTestvectors = "/opt/riscv/linux-testvectors" linuxTestvectors = RISCV+"/linux-testvectors"
if not os.path.exists(linuxTestvectors): if not os.path.exists(linuxTestvectors):
sys.stderr.write("Error: Linux testvectors not found at "+linuxTestvectors+"\n") sys.stderr.write("Error: Linux testvectors not found at "+linuxTestvectors+"\n")
exit(1) exit(1)
@ -22,7 +23,7 @@ def main():
break break
checkpoint = checkpointList[0] checkpoint = checkpointList[0]
logFile = logDir+"checkpoint"+str(checkpoint)+".log" logFile = logDir+"checkpoint"+str(checkpoint)+".log"
runCommand="{\nvsim -c <<!\ndo wally-batch.do buildroot buildroot /opt/riscv 0 "+str(checkpoint+1)+" "+str(checkpoint)+"\n!\n} | tee "+logFile runCommand="{\nvsim -c <<!\ndo wally-batch.do buildroot buildroot "+RISCV+" 0 "+str(checkpoint+1)+" "+str(checkpoint)+"\n!\n} | tee "+logFile
print(runCommand) print(runCommand)
os.system(runCommand) os.system(runCommand)
try: try:

View File

@ -1,4 +1,4 @@
#!/usr/bin/bash #!/bin/bash
# sim-testfloat-verilator # sim-testfloat-verilator
# David_Harris@hmc.edu 3 April 2024 # David_Harris@hmc.edu 3 April 2024

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
import os,sys,subprocess import os,sys,subprocess
from datetime import datetime, timezone, timedelta from datetime import datetime, timezone, timedelta

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# run_vcs # run_vcs
# David_Harris@hmc.edu 2 July 2024 # David_Harris@hmc.edu 2 July 2024

View File

@ -8,26 +8,39 @@ setenv MGLS_LICENSE_FILE 27002@zircon.eng.hmc.edu # Change this
setenv SNPSLMD_LICENSE_FILE 27020@zircon.eng.hmc.edu # Change this to your Synopsys license server setenv SNPSLMD_LICENSE_FILE 27020@zircon.eng.hmc.edu # Change this to your Synopsys license server
setenv QUESTAPATH /cad/mentor/questa_sim-2022.4_2/questasim/bin # Change this for your path to Questa setenv QUESTAPATH /cad/mentor/questa_sim-2022.4_2/questasim/bin # Change this for your path to Questa
setenv SNPSPATH /cad/synopsys/SYN/bin # Change this for your path to Design Compiler setenv SNPSPATH /cad/synopsys/SYN/bin # Change this for your path to Design Compiler
setenv VCSPATH /cad/synopsys/vcs/U-2023.03-SP2-4/bin # Change this for your path to Synopsys VCS
# Tools # Tools
# Questa and Synopsys # Questa and Synopsys
extend PATH $QUESTAPATH extend PATH $QUESTAPATH
extend PATH $SNPSPATH extend PATH $SNPSPATH
extend PATH $VCSPATH
# GCC # GCC
prepend LD_LIBRARY_PATH $RISCV/riscv-gnu-toolchain/lib if ( ! $?LD_LIBRARY_PATH ) then
prepend LD_LIBRARY_PATH $RISCV/riscv-gnu-toolchain/riscv64-unknown-elf/lib setenv LD_LIBRARY_PATH $RISCV/riscv64-unknown-elf/lib
extend PATH $RISCV/riscv-gnu-toolchain/bin # GCC tools else
extend PATH $RISCV/riscv-gnu-toolchain/riscv64-unknown-elf/bin # GCC tools extend LD_LIBRARY_PATH $RISCV/riscv64-unknown-elf/lib
endif
# Spike # RISC-V Tools
extend LD_LIBRARY_PATH $RISCV/lib extend LD_LIBRARY_PATH $RISCV/lib
extend LD_LIBRARY_PATH $RISCV/lib64
extend LD_LIBRARY_PATH $RISCV/lib/x86_64-linux-gnu/
extend PATH $RISCV/bin extend PATH $RISCV/bin
# Verilator # Activate riscv-python Virtual Environment
extend PATH /usr/local/bin/verilator # Change this for your path to Verilator if ( -e "$RISCV"/riscv-python/bin/activate ) then
# Verilator needs a larger stack to simulate CORE-V Wally source "$RISCV"/riscv-python/bin/activate.csh
limit stacksize unlimited else
echo "Python virtual environment not found. Rerun wally-toolchain-install.sh to automatically create it."
exit 1
endif
# environment variables needed for RISCV-DV
setenv RISCV_GCC `which riscv64-unknown-elf-gcc` # Copy this as it is
setenv RISCV_OBJCOPY `which riscv64-unknown-elf-objcopy` # Copy this as it is
setenv SPIKE_PATH $RISCV/bin # Change this for your path to riscv-isa-sim (spike)
# Imperas; put this in if you are using it # Imperas; put this in if you are using it
#set path = ($RISCV/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64 $path) #set path = ($RISCV/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64 $path)
@ -35,12 +48,11 @@ limit stacksize unlimited
setenv IDV $RISCV/ImperasDV-OpenHW setenv IDV $RISCV/ImperasDV-OpenHW
if ($?IDV) then if ($?IDV) then
# echo "Imperas exists" # echo "Imperas exists"
setenv IMPERAS_HOME $IDV/Imperas setenv IMPERAS_HOME $IDV/Imperas
setenv IMPERAS_PERSONALITY CPUMAN_DV_ASYNC setenv IMPERAS_PERSONALITY CPUMAN_DV_ASYNC
setenv ROOTDIR ~/ setenv ROOTDIR ~/
source ${IMPERAS_HOME}/bin/setup.sh source ${IMPERAS_HOME}/bin/setup.sh
setupImperas ${IMPERAS_HOME} setupImperas ${IMPERAS_HOME}
extend PATH $IDV/scripts/cvw extend PATH $IDV/scripts/cvw
endfi endif

View File

@ -10,43 +10,51 @@
# license servers and commercial CAD tool paths # license servers and commercial CAD tool paths
# Must edit these based on your local environment. # Must edit these based on your local environment.
export MGLS_LICENSE_FILE=27002@zircon.eng.hmc.edu # Change this to your Siemens license server for Questa export MGLS_LICENSE_FILE=27002@zircon.eng.hmc.edu # Change this to your Siemens license server for Questa
export SNPSLMD_LICENSE_FILE=27020@zircon.eng.hmc.edu # Change this to your Synopsys license server for Design Compiler export SNPSLMD_LICENSE_FILE=27020@zircon.eng.hmc.edu # Change this to your Synopsys license server
export QUESTA_HOME=/cad/mentor/questa_sim-2023.4/questasim # Change this for your path to Questa, excluding bin export QUESTA_HOME=/cad/mentor/questa_sim-2023.4/questasim # Change this for your path to Questa, excluding bin
export DC_HOME=/cad/synopsys/SYN # Change this for your path to Synopsys Design Compiler, excluding bin export DC_HOME=/cad/synopsys/SYN # Change this for your path to Synopsys Design Compiler, excluding bin
export VCS_HOME=/cad/synopsys/vcs/U-2023.03-SP2-4 # Change this for your path to Synopsys VCS, exccluding bin export VCS_HOME=/cad/synopsys/vcs/U-2023.03-SP2-4 # Change this for your path to Synopsys VCS, excluding bin
# Tools # Tools
# Questa and Synopsys # Questa and Synopsys
export PATH=$QUESTA_HOME/bin:$DC_HOME/bin:$VCS_HOME/bin:$PATH export PATH=$QUESTA_HOME/bin:$DC_HOME/bin:$VCS_HOME/bin:$PATH
# GCC # GCC
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$RISCV/riscv-gnu-toolchain/lib:$RISCV/riscv-gnu-toolchain/riscv64-unknown-elf/lib if [ -z "$LD_LIBRARY_PATH" ]; then
export LD_LIBRARY_PATH=$RISCV/riscv64-unknown-elf/lib
else
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$RISCV/riscv64-unknown-elf/lib
fi
# Spike # RISC-V Tools
export LD_LIBRARY_PATH=$RISCV/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$RISCV/lib:$RISCV/lib64:$LD_LIBRARY_PATH:$RISCV/lib/x86_64-linux-gnu/
export PATH=$PATH:$RISCV/bin export PATH=$PATH:$RISCV/bin
# Verilator # Activate riscv-python Virtual Environment
export PATH=/usr/local/bin/verilator:$PATH # Change this for your path to Verilator if [ -e "$RISCV"/riscv-python/bin/activate ]; then
source "$RISCV"/riscv-python/bin/activate
else
echo "Python virtual environment not found. Rerun wally-toolchain-install.sh to automatically create it."
exit 1
fi
# environment variables needed for RISCV-DV # Environment variables needed for RISCV-DV
export RISCV_GCC=`which riscv64-unknown-elf-gcc` # Copy this as it is export RISCV_GCC=$(which riscv64-unknown-elf-gcc) # Copy this as it is
export RISCV_OBJCOPY=`which riscv64-unknown-elf-objcopy` # Copy this as it is export RISCV_OBJCOPY=$(which riscv64-unknown-elf-objcopy) # Copy this as it is
export SPIKE_PATH=/usr/bin # Change this for your path to riscv-isa-sim (spike) export SPIKE_PATH=$RISCV/bin # Copy this as it is
# Imperas OVPsim; put this in if you are using it # Imperas OVPsim; put this in if you are using it
#export PATH=$RISCV/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64:$PATH #export PATH=$RISCV/imperas-riscv-tests/riscv-ovpsim-plus/bin/Linux64:$PATH
#export LD_LIBRARY_PATH=$RISCV/imperas_riscv_tests/riscv-ovpsim-plus/bin/Linux64:$LD_LIBRARY_PATH #export LD_LIBRARY_PATH=$RISCV/imperas_riscv_tests/riscv-ovpsim-plus/bin/Linux64:$LD_LIBRARY_PATH
# Imperas DV setup
export IDV=$RISCV/ImperasDV-OpenHW export IDV=$RISCV/ImperasDV-OpenHW
if [ -e "$IDV" ]; then if [ -e "$IDV" ]; then
# echo "Imperas exists" # echo "Imperas exists"
export IMPERAS_HOME=$IDV/Imperas export IMPERAS_HOME=$IDV/Imperas
export IMPERAS_PERSONALITY=CPUMAN_DV_ASYNC export IMPERAS_PERSONALITY=CPUMAN_DV_ASYNC
export ROOTDIR=~/ export ROOTDIR=~/
source ${IMPERAS_HOME}/bin/setup.sh source "${IMPERAS_HOME}"/bin/setup.sh
setupImperas ${IMPERAS_HOME} setupImperas "${IMPERAS_HOME}"
export PATH=$IDV/scripts/cvw:$PATH export PATH=$IDV/scripts/cvw:$PATH
fi fi

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py # testgen-ADD-SUB-SLT-SLTU-XOR-OR-AND.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-ADD-SUB.py # testgen-ADD-SUB.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-ADDIW-SLLIW-SRLIW-SRAIW.py # testgen-ADDIW-SLLIW-SRLIW-SRAIW.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py # testgen-ADDW-SUBW-SLLW-SRLW-SRAW.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-branch.py # testgen-branch.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-ADD-SUB.py # testgen-ADD-SUB.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-JAL.py # testgen-JAL.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-LOAD.py # testgen-LOAD.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python3
################################################################################################### ###################################################################################################
# testgen-PIPELINE.py # testgen-PIPELINE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-SLL-SRL-SRA.py # testgen-SLL-SRL-SRA.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-ADD-SUB.py # testgen-ADD-SUB.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-ADD-SUB.py # testgen-ADD-SUB.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-STORE.py # testgen-STORE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-VIRTUALMEMORY.py # testgen-VIRTUALMEMORY.py
# #

View File

@ -1,4 +1,4 @@
#!/bin/perl -W #!/usr/bin/env -S perl -w
########################################### ###########################################
## extractArea.pl ## extractArea.pl

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# Madeleine Masser-Frye (mmmasserfrye@hmc.edu) 06/2022 # Madeleine Masser-Frye (mmmasserfrye@hmc.edu) 06/2022
from collections import namedtuple from collections import namedtuple
import re import re

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# #
# Python regression test for DC # Python regression test for DC
# Madeleine Masser-Frye mmasserfrye@hmc.edu 5/22 # Madeleine Masser-Frye mmasserfrye@hmc.edu 5/22

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# #
# Python regression test for DC # Python regression test for DC
# Madeleine Masser-Frye mmasserfrye@hmc.edu 5/22 # Madeleine Masser-Frye mmasserfrye@hmc.edu 5/22

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
""" """
wrapperGen.py wrapperGen.py

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
# Madeleine Masser-Frye mmasserfrye@hmc.edu 1/2023 # Madeleine Masser-Frye mmasserfrye@hmc.edu 1/2023
import subprocess import subprocess

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
import sys, fileinput import sys, fileinput

View File

@ -59,14 +59,14 @@ module testbench;
`ifdef VERILATOR `ifdef VERILATOR
import "DPI-C" function string getenvval(input string env_name); import "DPI-C" function string getenvval(input string env_name);
string RISCV_DIR = getenvval("RISCV"); // "/opt/riscv"; string RISCV_DIR = getenvval("RISCV");
string WALLY_DIR = getenvval("WALLY"); // ~/cvw typical string WALLY_DIR = getenvval("WALLY"); // ~/cvw typical
`elsif VCS `elsif VCS
import "DPI-C" function string getenv(input string env_name); import "DPI-C" function string getenv(input string env_name);
string RISCV_DIR = getenv("RISCV"); // "/opt/riscv"; string RISCV_DIR = getenv("RISCV");
string WALLY_DIR = getenv("WALLY"); string WALLY_DIR = getenv("WALLY");
`else `else
string RISCV_DIR = "$RISCV"; // "/opt/riscv"; string RISCV_DIR = "$RISCV";
string WALLY_DIR = "$WALLY"; string WALLY_DIR = "$WALLY";
`endif `endif

View File

@ -1,4 +1,4 @@
#! /usr/bin/python3 #!/usr/bin/env python3
# author: Alessandro Maiuolo, Kevin Kim # author: Alessandro Maiuolo, Kevin Kim
# contact: amaiuolo@g.hmc.edu, kekim@hmc.edu # contact: amaiuolo@g.hmc.edu, kekim@hmc.edu

View File

@ -1,4 +1,4 @@
#! /usr/bin/python3 #!/usr/bin/env python3
# extract sqrt and float div testfloat vectors # extract sqrt and float div testfloat vectors
# author: Alessandro Maiuolo # author: Alessandro Maiuolo

View File

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python3
from fp_dataset import * from fp_dataset import *
#coverpoints=ibm_b1(128, 128, 'fadd.q', 2) #ibm_b1(flen, iflen, opcode, ops) #coverpoints=ibm_b1(128, 128, 'fadd.q', 2) #ibm_b1(flen, iflen, opcode, ops)

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# PIPELINE.py # PIPELINE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# covergen.py # covergen.py
# #

View File

@ -12,7 +12,7 @@ printf "\n\n#####\nStarting tests for $1\n#####\n\n"
if [[ "$2" != "-simonly" ]] if [[ "$2" != "-simonly" ]]
then then
cd $WALLY/testgen/privileged cd $WALLY/testgen/privileged
python3 "testgen-$1.py" $RISCV/riscv-python/bin/python3 "testgen-$1.py"
printf "\n\n#####\nRan testgen-$1.py Making...\n#####\n\n\n" printf "\n\n#####\nRan testgen-$1.py Making...\n#####\n\n\n"
if [[ "$2" == "-c" ]] if [[ "$2" == "-c" ]]

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-CAUSE.py (new) # testgen-CAUSE.py (new)
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-CSR-PERMISSIONS.py # testgen-CSR-PERMISSIONS.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-CAUSE.py # testgen-CAUSE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-CAUSE.py # testgen-CAUSE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-IE.py # testgen-IE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-IE.py # testgen-IE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-CAUSE.py # testgen-CAUSE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-CAUSE.py # testgen-CAUSE.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-TVAL.py # testgen-TVAL.py
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen-TVEC.py (new) # testgen-TVEC.py (new)
# #

View File

@ -1,4 +1,4 @@
#!/usr/bin/python3 #!/usr/bin/env python3
################################## ##################################
# testgen.py # testgen.py
# #