From b28895b6628f5c9926453d8aaa12edd74716cf6f Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 14:03:30 -0600 Subject: [PATCH 01/16] Created a tool chain install script for ubuntu 22.04. --- bin/wally-tool-chain-install.sh | 81 +++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 bin/wally-tool-chain-install.sh diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh new file mode 100644 index 00000000..b66e01da --- /dev/null +++ b/bin/wally-tool-chain-install.sh @@ -0,0 +1,81 @@ +export RISCV=/opt/riscv +export PATH=$PATH:$RISCV/bin + +NUM_THREADS=4 + +# UPDATE / UPGRADE +apt update + +# INSTALL +apt install -y git gawk make texinfo bison flex build-essential python libz-dev libexpat-dev autoconf device-tree-compiler ninja-build libpixman-1-dev build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev + +# gcc cross-compiler +git clone https://github.com/riscv/riscv-gnu-toolchain && \ + cd riscv-gnu-toolchain && \ + ./configure --prefix=${RISCV} --enable-multilib --with-multilib-generator="rv32e-ilp32e--;rv32i-ilp32--;rv32im-ilp32--;rv32iac-ilp32--;rv32imac-ilp32--;rv32imafc-ilp32f--;rv32imafdc-ilp32d--;rv64i-lp64--;rv64ic-lp64--;rv64iac-lp64--;rv64imac-lp64--;rv64imafdc-lp64d--;rv64im-lp64--;" && \ + make -j $(NUM_THREADS) && \ + make install + +# elf2hex +export PATH=$RISCV/riscv-gnu-toolchain/bin:$PATH +git clone https://github.com/sifive/elf2hex.git && \ + cd elf2hex && \ + autoreconf -i && \ + ./configure --target=riscv64-unknown-elf --prefix=$RISCV && \ + make && \ + make install + +# Update Python3.6 for QEMU +apt-get -y update +apt-get -y install python3-pip +apt-get -y install pkg-config +apt-get -y install libglib2.0-dev + +# QEMU +git clone --recurse-submodules https://github.com/qemu/qemu && \ + cd qemu && \ + ./configure --target-list=riscv64-softmmu --prefix=$RISCV && \ + make -j $(NUM_THREADS) && \ + make install + +# Spike +git clone https://github.com/riscv-software-src/riscv-isa-sim && \ + mkdir riscv-isa-sim/build && \ + cd riscv-isa-sim/build && \ + ../configure --prefix=$RISCV --enable-commitlog && \ + make -j $(NUM_THREADS) && \ + make install && \ + cd ../arch_test_target/spike/device && \ + sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include && \ + sed -i 's/--isa=rv64ic/--isa=rv64iac/' rv64i_m/privilege/Makefile.include + +# SAIL +apt-get install -y opam build-essential libgmp-dev z3 pkg-config zlib1g-dev && \ + git clone https://github.com/Z3Prover/z3.git && \ + cd z3 && \ + python scripts/mk_make.py && \ + cd build && \ + make -j $(NUM_THREADS) && \ + make install && \ + cd ../.. && \ + pip3 install chardet==3.0.4 && \ + pip3 install urllib3==1.22 && \ + opam init -y --disable-sandboxing && \ + opam switch create ocaml-base-compiler.4.06.1 && \ + opam install sail -y + +eval $(opam config env) && \ + git clone https://github.com/riscv/sail-riscv.git && \ + cd sail-riscv && \ + make -j $(NUM_THREADS) && \ + ARCH=RV32 make -j $(NUM_THREADS) && \ + ARCH=RV64 make -j $(NUM_THREADS) && \ + ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 && \ + ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 + +pip3 install testresources && \ + pip3 install riscof --ignore-installed PyYAML + +# Verilator +apt install verilator + From a748cc1acb50ecd46c4d20c0405c8f8adfadd72d Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 17:24:21 -0600 Subject: [PATCH 02/16] Updates to tool install script --- bin/wally-tool-chain-install.sh | 100 ++++++++++++++++---------------- 1 file changed, 50 insertions(+), 50 deletions(-) mode change 100644 => 100755 bin/wally-tool-chain-install.sh diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh old mode 100644 new mode 100755 index b66e01da..fa368593 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -7,23 +7,23 @@ NUM_THREADS=4 apt update # INSTALL -apt install -y git gawk make texinfo bison flex build-essential python libz-dev libexpat-dev autoconf device-tree-compiler ninja-build libpixman-1-dev build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev +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 build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev # gcc cross-compiler -git clone https://github.com/riscv/riscv-gnu-toolchain && \ - cd riscv-gnu-toolchain && \ - ./configure --prefix=${RISCV} --enable-multilib --with-multilib-generator="rv32e-ilp32e--;rv32i-ilp32--;rv32im-ilp32--;rv32iac-ilp32--;rv32imac-ilp32--;rv32imafc-ilp32f--;rv32imafdc-ilp32d--;rv64i-lp64--;rv64ic-lp64--;rv64iac-lp64--;rv64imac-lp64--;rv64imafdc-lp64d--;rv64im-lp64--;" && \ - make -j $(NUM_THREADS) && \ - make install +git clone https://github.com/riscv/riscv-gnu-toolchain +cd riscv-gnu-toolchain +./configure --prefix=${RISCV} --enable-multilib --with-multilib-generator="rv32e-ilp32e--;rv32i-ilp32--;rv32im-ilp32--;rv32iac-ilp32--;rv32imac-ilp32--;rv32imafc-ilp32f--;rv32imafdc-ilp32d--;rv64i-lp64--;rv64ic-lp64--;rv64iac-lp64--;rv64imac-lp64--;rv64imafdc-lp64d--;rv64im-lp64--;" +make -j $(NUM_THREADS) +make install # elf2hex export PATH=$RISCV/riscv-gnu-toolchain/bin:$PATH -git clone https://github.com/sifive/elf2hex.git && \ - cd elf2hex && \ - autoreconf -i && \ - ./configure --target=riscv64-unknown-elf --prefix=$RISCV && \ - make && \ - make install +git clone https://github.com/sifive/elf2hex.git +cd elf2hex +autoreconf -i +./configure --target=riscv64-unknown-elf --prefix=$RISCV +make +make install # Update Python3.6 for QEMU apt-get -y update @@ -32,50 +32,50 @@ apt-get -y install pkg-config apt-get -y install libglib2.0-dev # QEMU -git clone --recurse-submodules https://github.com/qemu/qemu && \ - cd qemu && \ - ./configure --target-list=riscv64-softmmu --prefix=$RISCV && \ - make -j $(NUM_THREADS) && \ - make install +git clone --recurse-submodules https://github.com/qemu/qemu +cd qemu +./configure --target-list=riscv64-softmmu --prefix=$RISCV +make -j $(NUM_THREADS) +make install # Spike -git clone https://github.com/riscv-software-src/riscv-isa-sim && \ - mkdir riscv-isa-sim/build && \ - cd riscv-isa-sim/build && \ - ../configure --prefix=$RISCV --enable-commitlog && \ - make -j $(NUM_THREADS) && \ - make install && \ - cd ../arch_test_target/spike/device && \ - sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include && \ - sed -i 's/--isa=rv64ic/--isa=rv64iac/' rv64i_m/privilege/Makefile.include +git clone https://github.com/riscv-software-src/riscv-isa-sim +mkdir riscv-isa-sim/build +cd riscv-isa-sim/build +../configure --prefix=$RISCV --enable-commitlog +make -j $(NUM_THREADS) +make install +cd ../arch_test_target/spike/device +sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include +sed -i 's/--isa=rv64ic/--isa=rv64iac/' rv64i_m/privilege/Makefile.include # SAIL -apt-get install -y opam build-essential libgmp-dev z3 pkg-config zlib1g-dev && \ - git clone https://github.com/Z3Prover/z3.git && \ - cd z3 && \ - python scripts/mk_make.py && \ - cd build && \ - make -j $(NUM_THREADS) && \ - make install && \ - cd ../.. && \ - pip3 install chardet==3.0.4 && \ - pip3 install urllib3==1.22 && \ - opam init -y --disable-sandboxing && \ - opam switch create ocaml-base-compiler.4.06.1 && \ - opam install sail -y +apt-get install -y opam build-essential libgmp-dev z3 pkg-config zlib1g-dev +git clone https://github.com/Z3Prover/z3.git +cd z3 +python scripts/mk_make.py +cd build +make -j $(NUM_THREADS) +make install +cd ../.. +pip3 install chardet==3.0.4 +pip3 install urllib3==1.22 +opam init -y --disable-sandboxing +opam switch create ocaml-base-compiler.4.06.1 +opam install sail -y -eval $(opam config env) && \ - git clone https://github.com/riscv/sail-riscv.git && \ - cd sail-riscv && \ - make -j $(NUM_THREADS) && \ - ARCH=RV32 make -j $(NUM_THREADS) && \ - ARCH=RV64 make -j $(NUM_THREADS) && \ - ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 && \ - ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 +eval $(opam config env) +git clone https://github.com/riscv/sail-riscv.git +cd sail-riscv +make -j $(NUM_THREADS) +ARCH=RV32 make -j $(NUM_THREADS) +ARCH=RV64 make -j $(NUM_THREADS) +ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 +ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 -pip3 install testresources && \ - pip3 install riscof --ignore-installed PyYAML +pip3 install testresources +pip3 install riscof --ignore-installed PyYAML # Verilator -apt install verilator +apt install -y verilator From 59b770ad15aff8fdf93364d001ed70800e1eca77 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 17:32:44 -0600 Subject: [PATCH 03/16] fixes to install script. --- bin/wally-tool-chain-install.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index fa368593..c2be7cf0 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -3,6 +3,8 @@ export PATH=$PATH:$RISCV/bin NUM_THREADS=4 +sudo mkdir -p $RISCV + # UPDATE / UPGRADE apt update @@ -10,6 +12,7 @@ apt update 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 build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev # gcc cross-compiler +cd $RISCV git clone https://github.com/riscv/riscv-gnu-toolchain cd riscv-gnu-toolchain ./configure --prefix=${RISCV} --enable-multilib --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--;" @@ -17,6 +20,7 @@ make -j $(NUM_THREADS) make install # elf2hex +cd $RISCV export PATH=$RISCV/riscv-gnu-toolchain/bin:$PATH git clone https://github.com/sifive/elf2hex.git cd elf2hex @@ -32,6 +36,7 @@ apt-get -y install pkg-config apt-get -y install libglib2.0-dev # QEMU +cd $RISCV git clone --recurse-submodules https://github.com/qemu/qemu cd qemu ./configure --target-list=riscv64-softmmu --prefix=$RISCV @@ -39,6 +44,7 @@ make -j $(NUM_THREADS) make install # Spike +cd $RISCV git clone https://github.com/riscv-software-src/riscv-isa-sim mkdir riscv-isa-sim/build cd riscv-isa-sim/build @@ -50,6 +56,7 @@ sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include sed -i 's/--isa=rv64ic/--isa=rv64iac/' rv64i_m/privilege/Makefile.include # SAIL +cd $RISCV apt-get install -y opam build-essential libgmp-dev z3 pkg-config zlib1g-dev git clone https://github.com/Z3Prover/z3.git cd z3 From 70005c4c48b950a7a826dd8191c08d4faad8a9bd Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 18:00:14 -0600 Subject: [PATCH 04/16] fixes to installer script --- bin/wally-tool-chain-install.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index c2be7cf0..2f6f1691 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -1,15 +1,19 @@ export RISCV=/opt/riscv export PATH=$PATH:$RISCV/bin -NUM_THREADS=4 +set -e # break on error + +NUM_THREADS=1 sudo mkdir -p $RISCV # UPDATE / UPGRADE -apt update +#apt update # INSTALL -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 build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev +#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 build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev + +ln -sf /usr/bin/python3 /usr/bin/python # this is unforunate. gcc needs python but it looks specifically for python and not python3 or python2. # gcc cross-compiler cd $RISCV From b460b780aa22854bd1639501e77d849931a16abd Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 20:52:58 -0600 Subject: [PATCH 05/16] Working toolchain install script for ubuntu. --- bin/wally-tool-chain-install.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index 2f6f1691..4c26bbf5 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -8,10 +8,10 @@ NUM_THREADS=1 sudo mkdir -p $RISCV # UPDATE / UPGRADE -#apt update +apt update # INSTALL -#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 build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev +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 build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev ln -sf /usr/bin/python3 /usr/bin/python # this is unforunate. gcc needs python but it looks specifically for python and not python3 or python2. @@ -20,7 +20,7 @@ cd $RISCV git clone https://github.com/riscv/riscv-gnu-toolchain cd riscv-gnu-toolchain ./configure --prefix=${RISCV} --enable-multilib --with-multilib-generator="rv32e-ilp32e--;rv32i-ilp32--;rv32im-ilp32--;rv32iac-ilp32--;rv32imac-ilp32--;rv32imafc-ilp32f--;rv32imafdc-ilp32d--;rv64i-lp64--;rv64ic-lp64--;rv64iac-lp64--;rv64imac-lp64--;rv64imafdc-lp64d--;rv64im-lp64--;" -make -j $(NUM_THREADS) +make make install # elf2hex @@ -44,16 +44,16 @@ cd $RISCV git clone --recurse-submodules https://github.com/qemu/qemu cd qemu ./configure --target-list=riscv64-softmmu --prefix=$RISCV -make -j $(NUM_THREADS) +make make install # Spike cd $RISCV git clone https://github.com/riscv-software-src/riscv-isa-sim -mkdir riscv-isa-sim/build +mkdir -p riscv-isa-sim/build cd riscv-isa-sim/build ../configure --prefix=$RISCV --enable-commitlog -make -j $(NUM_THREADS) +make make install cd ../arch_test_target/spike/device sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include @@ -66,7 +66,7 @@ git clone https://github.com/Z3Prover/z3.git cd z3 python scripts/mk_make.py cd build -make -j $(NUM_THREADS) +make make install cd ../.. pip3 install chardet==3.0.4 @@ -78,9 +78,9 @@ opam install sail -y eval $(opam config env) git clone https://github.com/riscv/sail-riscv.git cd sail-riscv -make -j $(NUM_THREADS) -ARCH=RV32 make -j $(NUM_THREADS) -ARCH=RV64 make -j $(NUM_THREADS) +make +ARCH=RV32 make +ARCH=RV64 make ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 From f82e7474d95c2e902313597ca77e936bd147a42b Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 21:23:23 -0600 Subject: [PATCH 06/16] More improvements to the tool install script. --- bin/wally-tool-chain-install.sh | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index 4c26bbf5..6d633ed6 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -1,9 +1,11 @@ -export RISCV=/opt/riscv +export RISCV=/mnt/500gbs/riscv export PATH=$PATH:$RISCV/bin set -e # break on error -NUM_THREADS=1 +#NUM_THREADS=1 # for low memory machines > 8GiB +NUM_THREADS=8 # for >= 32GiB +#NUM_THREADS=16 # for >= 64GiB sudo mkdir -p $RISCV @@ -13,14 +15,15 @@ apt update # INSTALL 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 build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev -ln -sf /usr/bin/python3 /usr/bin/python # this is unforunate. gcc needs python but it looks specifically for python and not python3 or python2. +# needed for Ubuntu 22.04, gcc cross compiler expects python not python2 or python3. +ln -sf /usr/bin/python3 /usr/bin/python # gcc cross-compiler cd $RISCV git clone https://github.com/riscv/riscv-gnu-toolchain cd riscv-gnu-toolchain ./configure --prefix=${RISCV} --enable-multilib --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 +make -j ${NUM_THREADS} make install # elf2hex @@ -44,7 +47,7 @@ cd $RISCV git clone --recurse-submodules https://github.com/qemu/qemu cd qemu ./configure --target-list=riscv64-softmmu --prefix=$RISCV -make +make -j ${NUM_THREADS} make install # Spike @@ -53,7 +56,7 @@ git clone https://github.com/riscv-software-src/riscv-isa-sim mkdir -p riscv-isa-sim/build cd riscv-isa-sim/build ../configure --prefix=$RISCV --enable-commitlog -make +make -j ${NUM_THREADS} make install cd ../arch_test_target/spike/device sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include @@ -66,7 +69,7 @@ git clone https://github.com/Z3Prover/z3.git cd z3 python scripts/mk_make.py cd build -make +make -j ${NUM_THREADS} make install cd ../.. pip3 install chardet==3.0.4 @@ -78,7 +81,7 @@ opam install sail -y eval $(opam config env) git clone https://github.com/riscv/sail-riscv.git cd sail-riscv -make +make -j ${NUM_THREADS} ARCH=RV32 make ARCH=RV64 make ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 From 365a6e9f7abea53747bc0c9cba05c047e518d083 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 21:29:37 -0600 Subject: [PATCH 07/16] Added check for the odd Ubuntu 22.04 python2/3 issue. --- bin/wally-tool-chain-install.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index 6d633ed6..55974571 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -16,7 +16,11 @@ apt update 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 build-essential ncurses-base ncurses-bin libncurses5-dev dialog curl wget ftp libgmp-dev # needed for Ubuntu 22.04, gcc cross compiler expects python not python2 or python3. -ln -sf /usr/bin/python3 /usr/bin/python +if ! command -v python &> /dev/null +then + echo "WARNING: python3 was installed as python3 rather than python. Creating symlink." + ln -sf /usr/bin/python3 /usr/bin/python +fi # gcc cross-compiler cd $RISCV From 5c799fa57887ff013c38f6f42126b9022f93bc8d Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 21:31:47 -0600 Subject: [PATCH 08/16] Added argument to install script for alternate install directory. --- bin/wally-tool-chain-install.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index 55974571..14012c64 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -1,4 +1,6 @@ -export RISCV=/mnt/500gbs/riscv +#!/bin/bash + +export RISCV="${1:-/opt/riscv}" export PATH=$PATH:$RISCV/bin set -e # break on error From 6ae2f2328006e0d223659291f2b0f64429d7b0fb Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 21:50:24 -0600 Subject: [PATCH 09/16] Updated install readme. --- Install | 141 ++------------------------------------------------------ 1 file changed, 3 insertions(+), 138 deletions(-) diff --git a/Install b/Install index 28ef1b84..7e509197 100644 --- a/Install +++ b/Install @@ -14,148 +14,14 @@ installed at base diretory $RISCV. ** TL;DR Open Source Tool-chain Installation - The installing details are involved. The following script assumes installation occurs in RISCV=/opt/riscv + The installing details are involved, but can be skipped using the following script. wally-tool-chain-install.sh installs the open source tools to RISCV=/opt/riscv by default. Change by supplying an alternate path as an argument, (ie. wally-tool-chain-install.sh /mnt/disk1/riscv). This install script does NOT install buildroot or commercial EDA tools; Questa, Design Compiler, or Innovus. It must be run as root or with sudo. - This script only works for Ubuntu. + This script is tested for Ubuntu, 20.04 and 22.04 wally-tool-chain-install.sh -** TL;DR install summery - -*** Environement setup - 1. export RISCV=/opt/riscv - 2. sudo mkdir $RISCV - 3. sudo chown cad $RISCV - 4. sudo su cad (or root, if you don’t have a cad account) - 5. export RISCV=/opt/riscv - 6. chmod 755 $RISCV - 7. mask 0002 - 8. cd $RISCV - -*** Install dependencies - -**** Ubuntu - 1. sudo apt update - 2. sudo apt upgrade - 3. sudo apt install git gawk make texinfo bison flex build-essential python libz-dev libexpat-dev autoconf device-tree-compiler ninja-build libglib2.56-dev libpixman-1-dev build-essential ncurses-base ncurses-bin libncurses5-dev dialog - -**** Red Hat / Fedora *** TODO - -*** Install RISC-V GCC Cross-Compiler - 1. git clone https://github.com/riscv/riscv-gnu-toolchain - 2. cd riscv-gnu-toolchain - 3. git checkout 2022.09.21 - 4. ./configure --prefix=$RISCV --enable-multilib --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--;" - 5. make --jobs - -*** Install elf2hex - 1. cd $RISCV - 2. export PATH=$RISCV/riscv-gnu-toolchain/bin:$PATH - 3. git clone https://github.com/sifive/elf2hex.git - 4. cd elf2hex - 5. autoreconf -i - 6. ./configure --target=riscv64-unknown-elf --prefix=$RISCV - 7. make - 8. make install - -*** Install RISC-V Spike Simulator - 1. cd $RISCV - 2. git clone https://github.com/riscv-software-src/riscv-isa-sim - 3. mkdir riscv-isa-sim/build - 4. cd riscv-isa-sim/build - 5. ../configure --prefix=$RISCV --enable-commitlog - 6. make --jobs - 7. make install - 8. cd ../arch_test_target/spike/device - 9. sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include - 10. sed -i 's/--isa=rv64ic/--isa=rv64iac/' rv64i_m/privilege/Makefile.include - -*** Install Sail Simulator - -**** Ubuntu - 1. sudo apt install opam build-essential libgmp-dev z3 pkg-config zlib1g-dev - -**** Red Hat / Fedora - # Parallel make (--jobs) will massively speed up installation; however it requires significant system RAM. Recomemded to have 64GB - 1. sudo bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)" - When prompted, put it in /usr/bin - 2. sudo yum groupinstall 'Development Tools' - 3. sudo yum -y install gmp-devel - 4. sudo yum -y install zlib-devel - 5. git clone https://github.com/Z3Prover/z3.git - 6. cd z3 - 7. python scripts/mk_make.py - 8. cd build - 9. make - 10. sudo make install - 11. cd ../.. - 12. sudo pip3 install chardet==3.0.4 - 13. sudo pip3 install urllib3==1.22 - -**** Complete Sail Install with OCaml - # Parallel make (--jobs) will massively speed up installation; however it requires significant system RAM. Recomemded to have 64GB - 1. sudo su cad - 2. opam init -y --disable-sandboxing - 3. opam switch create ocaml-base-compiler.4.06.1 - 4. opam install sail -y - 5. eval $(opam config env) - 6. cd $RISCV - 7. git clone https://github.com/riscv/sail-riscv.git - 8. cd sail-riscv - 9. make - 10. ARCH=RV32 make - 11. ARCH=RV64 make - 12. exit - 13. sudo su - 14. export RISCV=/opt/riscv - 15. ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 - 16. ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 - 17. exit - -*** Install riscof - 1. sudo pip3 install testresources - 2. sudo pip3 install riscof --ignore-installed PyYAML - -*** Install Verilator - -**** Ubuntu - sudo apt install verilator - -**** Red Hat / Fedora *** TODO - -*** Install QEMU Simulator (Only required for linux simulation) - 1. cd $RISCV - 2. git clone --recurse-submodules https://github.com/qemu/qemu - 3. cd qemu - 4. git checkout v6.2.0 # last version tested; newer versions might be ok - 5. ./configure --target-list=riscv64-softmmu --prefix=$RISCV - 6. make --jobs - 7. make install - -*** Cross-Compile Buildroot Linux (Only required for linux simulation) -#May wish to install in another location - 1. cd $RISCV - 2. export WALLY=~/riscv-wally # make sure you haven’t sourced ~/riscv-wally/setup.sh by now - 3. git clone https://github.com/buildroot/buildroot.git - 4. cd buildroot - 5. git checkout 2021.05 # last tested working version - 6. cp -r $WALLY/linux/buildroot-config-src/wally ./board - 7. cp ./board/wally/main.config .config - 8. make --jobs - -**** Generate disassembly files - 1. source ~/riscv-wally/setup.sh - 2. cd $WALLY/linux/buildroot-scripts - 3. make all - -*** Download Synthesis Libraries - 1. cd $RISCV - 2. mkdir cad - 3. mkdir cad/lib - 4. cd cad/lib - 5. git clone https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12 - + The step by step instructions include Red Hat 8 / Fedora. ** Detailed Tool-chain Instal Guide Section 2.1 described Wally platform requirements and Section 2.2 describes how a user gets started using Wally on a Linux server. This appendix describes how the system administrator installs RISC-V tools. Superuser privileges are necessary for many of the tools. Setting up all of the tools can be time-consuming and fussy, so this appendix also describes a fallback flow with Docker and Podman. @@ -405,7 +271,6 @@ 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. - * Core-v-wally Repo Installation ** TL;DR Repo Install cd From 285cbfe53037914cb5c73d418c8ef9bb2c2a5520 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 22:00:26 -0600 Subject: [PATCH 10/16] Defaults to 1 job compiles. --- bin/wally-tool-chain-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index 14012c64..e9465b05 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -5,8 +5,8 @@ export PATH=$PATH:$RISCV/bin set -e # break on error -#NUM_THREADS=1 # for low memory machines > 8GiB -NUM_THREADS=8 # for >= 32GiB +NUM_THREADS=1 # for low memory machines > 16GiB +#NUM_THREADS=8 # for >= 32GiB #NUM_THREADS=16 # for >= 64GiB sudo mkdir -p $RISCV From cb41b921b788e0356c826a349688baf7dcc70146 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 22:14:58 -0600 Subject: [PATCH 11/16] Found minor bug in install script. --- bin/wally-tool-chain-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index e9465b05..6c52ce7c 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -90,8 +90,8 @@ cd sail-riscv make -j ${NUM_THREADS} ARCH=RV32 make ARCH=RV64 make -ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 -ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 +ln -sf $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 +ln -sf $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 pip3 install testresources pip3 install riscof --ignore-installed PyYAML From 3df5f477c708e6cd372d26cfcd88fd3a461290ea Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 22:16:47 -0600 Subject: [PATCH 12/16] Merge Install script into the README.md --- README.md | 263 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) diff --git a/README.md b/README.md index 433eb442..6092fd74 100644 --- a/README.md +++ b/README.md @@ -29,3 +29,266 @@ Add the following lines to your .bashrc or .bash_profile if [ -f ~/riscv-wally/setup.sh ]; then source ~/riscv-wally/setup.sh fi + +# Tool-chain Installation (Sys Admin) + +This section describes the open source toolchain installation. These steps should only be done once by the system admin. + +## TL;DR Open Source Tool-chain Installation + +The full instalation details are involved can be be skipped using the following script, wally-tool-chain-install.sh. +The script installs the open source tools to /opt/riscv by default. This can be changed by supply the path as the first argument. This script does not install buildroot (see the Detailed Tool-chain Install Guide in the following section) and does not install commercial EDA tools; Siemens Questa, Synopsys Design Compiler, or Cadence Innovus (see section Installing IDA Tools). It must be run as root or with sudo. This script is tested for Ubuntu, 20.04 and 22.04. Fedora and Red Hat can be installed in the Detailed Tool-chain Install Guide. + +wally-tool-chain-install.sh + +## Detailed Tool-chain Install Guide + + Section 2.1 described Wally platform requirements and Section 2.2 describes how a user gets started using Wally on a Linux server. This appendix describes how the system administrator installs RISC-V tools. Superuser privileges are necessary for many of the tools. Setting up all of the tools can be time-consuming and fussy, so this appendix also describes a fallback flow with Docker and Podman. + +### Open Source Software Installation + +Compiling, assembling, and simulating RISC-V programs requires downloading and installing the following free tools: + +1. The GCC cross-compiler +2. A RISC-V simulator such as Spike, Sail, and/or QEMU +3. Spike is easy to use but doesn’t support peripherals to boot Linux +4. QEMU is faster and can boot Linux +5. Sail is presently the official golden reference for RISC-V and is used by the riscof verification suite, but runs slowly and is painful to instal + +This setup needs to be done once by the administrator + +Note: The following directions assume you have an account called cad to install shared software and files. You can substitute a different user for cad if you prefer. + +Note: Installing software in Linux is unreasonably touchy and varies with the flavor and version of your Linux distribution. Don’t be surprised if the installation directions have changed since the book was written or don’t work on your machine; you may need some ingenuity to adjust them. Browse the openhwgroup/core-v-wally repo and look at the README.md for the latest build instructions. + +### Create the $RISCV Directory + +First, set up a directory for riscv software in some place such as /opt/riscv. We will call this shared directory $RISCV. + +$ export RISCV=/opt/riscv +$ sudo mkdir $RISCV +$ sudo chown cad $RISCV +$ sudo su cad (or root, if you don’t have a cad account) +$ export RISCV=/opt/riscv +$ chmod 755 $RISCV +$ umask 0002 +$ cd $RISCV + +### Update Tools + +Ubuntu users may need to install and update various tools. + +$ sudo apt update +$ sudo apt upgrade +$ sudo apt install git gawk make texinfo bison flex build-essential python libz-dev libexpat-dev autoconf device-tree-compiler ninja-build libglib2.56-dev libpixman-1-dev build-essential ncurses-base ncurses-bin libncurses5-dev dialog + +### Install RISC-V GCC Cross-Compiler + +To install GCC from source can take hours to compile. This configuration enables multilib to target many flavors of RISC-V. This book is tested with GCC 12.2 (tagged 2022.09.21), but will likely work with newer versions as well. + +$ git clone https://github.com/riscv/riscv-gnu-toolchain +$ cd riscv-gnu-toolchain +$ git checkout 2022.09.21 +$ ./configure --prefix=$RISCV --enable-multilib --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 --jobs + +Note: make --jobs will reduce compile time by compiling in parallel. However, adding this option could dramatically increase the memory utilization of your local machine. + +### Install elf2hex + +We also need the elf2hex utility to convert executable files into hexadecimal files for Verilog simulation. Install with: + +$ cd $RISCV +$ export PATH=$RISCV/riscv-gnu-toolchain/bin:$PATH +$ git clone https://github.com/sifive/elf2hex.git +$ cd elf2hex +$ autoreconf -i +$ ./configure --target=riscv64-unknown-elf --prefix=$RISCV +$ make +$ make install + +Note: The exe2hex utility that comes with Spike doesn’t work for our purposes because it doesn’t handle programs that start at 0x80000000. The SiFive version above is touchy to install. For example, if Python version 2.x is in your path, it won’t install correctly. Also, be sure riscv64-unknown-elf-objcopy shows up in your path in $RISCV/riscv-gnu-toolchain/bin at the time of compilation, or elf2hex won’t work properly. + +### Install RISC-V Spike Simulator + +Spike also takes a while to install and compile, but this can be done concurrently with the GCC installation. After the build, we need to change two Makefiles to support atomic instructions . + +$ cd $RISCV +$ git clone https://github.com/riscv-software-src/riscv-isa-sim +$ mkdir riscv-isa-sim/build +$ cd riscv-isa-sim/build +$ ../configure --prefix=$RISCV --enable-commitlog +$ make --jobs +$ make install +$ cd ../arch_test_target/spike/device +$ sed -i 's/--isa=rv32ic/--isa=rv32iac/' rv32i_m/privilege/Makefile.include +$ sed -i 's/--isa=rv64ic/--isa=rv64iac/' rv64i_m/privilege/Makefile.include + +### Install Sail Simulator + +Sail is the new golden reference model for RISC-V. Sail is written in OCaml, which is an object-oriented extension of ML, which in turn is a functional programming language suited to formal verification. OCaml is installed with the opam OCcaml package manager. Sail has so many dependencies that it can be difficult to install. + +On Ubuntu, apt-get makes opam installation fairly simple. + +$ sudo apt-get install opam build-essential libgmp-dev z3 pkg-config zlib1g-dev + +If you are on RedHat/Rocky Linux 8, installation is much more difficult because packages are not available in the default package manager and some need to be built from source. + +$ sudo bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)" + When prompted, put it in /usr/bin +$ sudo yum groupinstall 'Development Tools' +$ sudo yum -y install gmp-devel +$ sudo yum -y install zlib-devel +$ git clone https://github.com/Z3Prover/z3.git +$ cd z3 +$ python scripts/mk_make.py +$ cd build +$ make +$ sudo make install +$ cd ../.. +$ sudo pip3 install chardet==3.0.4 +$ sudo pip3 install urllib3==1.22 + +Once you have installed the packages on either Ubuntu or RedHat, use opam to install the OCaml compiler and Sail. Run as the cad user because you will be installing Sail in $RISCV. + +$ sudo su cad +$ opam init -y --disable-sandboxing +$ opam switch create ocaml-base-compiler.4.06.1 +$ opam install sail -y + +Now you can clone and compile Sail-RISCV. This will take a while. + +$ eval $(opam config env) +$ cd $RISCV +$ git clone https://github.com/riscv/sail-riscv.git +$ cd sail-riscv +$ make +$ ARCH=RV32 make +$ ARCH=RV64 make +$ exit +$ sudo su +$ export RISCV=/opt/riscv +$ ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV64 /usr/bin/riscv_sim_RV64 +$ ln -s $RISCV/sail-riscv/c_emulator/riscv_sim_RV32 /usr/bin/riscv_sim_RV32 +$ exit + +### Install riscof + +riscof is a Python library used as the RISC-V compatibility framework test an implementation such as Wally or Spike against the Sail golden reference. It will be used to compile the riscv-arch-test suite. + +It is most convenient if the sysadmin installs riscof into the server’s Python libraries: + +$ sudo pip3 install testresources +$ sudo pip3 install riscof --ignore-installed PyYAML + +However, riscof can also be installed and run locally by individual users. + +### Install Verilator + +Verilator is a free Verilog simulator with a good Lint tool used to catch errors in the SystemVerilog code. It is needed to run regression. +$ sudo apt install verilator + +### Install QEMU Simulator + +QEMU is another simulator used when booting Linux in Chapter 17. You can optionally install it using the following commands. + + +The QEMU patch changes the VirtIO driver to match the Wally peripherals, and also adds print statements to log the state of the CSRs (see Section 2.5XREF). + + +$ cd $RISCV +$ git clone --recurse-submodules https://github.com/qemu/qemu +$ cd qemu +$ git checkout v6.2.0 # last version tested; newer versions might be ok +$ ./configure --target-list=riscv64-softmmu --prefix=$RISCV +$ make --jobs +$ make install + +### Cross-Compile Buildroot Linux + +Building Linux is only necessary for exploring the boot process in Chapter 17. Building and generating a trace is a time-consuming operation that could be skipped for now; you can return to this section later if you are interested in the Linux details. + +Buildroot depends on configuration files in riscv-wally, so the cad user must install Wally first according to the instructions in Section 2.2.2. However, don’t source ~/wally-riscv/setup.sh because it will set LD_LIBRARY_PATH in a way to cause make to fail on buildroot. + +To configure and build Buildroot: + +$ cd $RISCV +$ export WALLY=~/riscv-wally # make sure you haven’t sourced ~/riscv-wally/setup.sh by now +$ git clone https://github.com/buildroot/buildroot.git +$ cd buildroot +$ git checkout 2021.05 # last tested working version +$ cp -r $WALLY/linux/buildroot-config-src/wally ./board +$ cp ./board/wally/main.config .config +$ make --jobs + +To generate disassembly files and the device tree, run another make script. Note that you can expect some warnings about phandle references while running dtc on wally-virt.dtb. + +$ source ~/riscv-wally/setup.sh +$ cd $WALLY/linux/buildroot-scripts +$ make all + +Note: When the make tasks complete, you’ll find source code in $RISCV/buildroot/output/build and the executables in $RISCV/buildroot/output/images. + +### Download Synthesis Libraries + +For logic synthesis, we need a synthesis tool (see Section 3.XREF) and a cell library. Clone the OSU 12-track cell library for the Skywater 130 nm process: + +$ cd $RISCV +$ mkdir cad +$ mkdir cad/lib +$ cd cad/lib +$ git clone https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12 + +## Installing EDA Tools + +Electronic Design Automation (EDA) tools are vital to implementations of System on Chip architectures as well as validating different designs. Open-source and commercial tools exist for multiple strategies and although the one can spend a lifetime using combinations of different tools, only a small subset of tools is utilized for this text. The tools are chosen because of their ease in access as well as their repeatability for accomplishing many of the tasks utilized to design Wally. It is anticipated that additional tools may be documented later after this is text is published to improve use and access. + +Siemens Quest is the primary tool utilized for simulating and validating Wally. For logic synthesis, you will need Synopsys Design Compiler. Questa and Design Compiler are commercial tools that require an educational or commercial license. + +Note: Some EDA tools utilize LM_LICENSE_FILE for their environmental variable to point to their license server. Some operating systems may also utilize MGLS_LICENSE_FILE instead, therefore, it is important to read the user manual on the preferred environmental variable required to point to a user’s license file. Although there are different mechanisms to allow licenses to work, many companies commonly utilize the FlexLM (i.e., Flex-enabled) license server manager that runs off a node locked license. + +Although most EDA tools are Linux-friendly, they tend to have issues when not installed on recommended OS flavors. Both Red Hat Enterprise Linux and SUSE Linux products typically tend to be recommended for installing commercial-based EDA tools and are recommended for utilizing complex simulation and architecture exploration. Questa can also be installed on Microsoft Windows as well as Mac OS with a Virtual Machine such as Parallels. + +Siemens Questa + +Siemens Questa simulates behavioral, RTL and gate-level HDL. To install Siemens Questa first go to a web browser and navigate to +https://eda.sw.siemens.com/en-US/ic/questa/simulation/advanced-simulator/. Click Sign In and log in with your credentials and the product can easily be downloaded and installed. Some Windows-based installations also require gcc libraries that are typically provided as a compressed zip download through Siemens. + +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 + +$ firefox & +Navigate to https://solvnet.synopsys.com +Log in with your institution’s username and password +Click on Downloads, then scroll down to Synopsys Installer +Select the latest version (currently 5.4). Click Download Here, agree, +Click on SynopsysInstaller_v5.4.run +Return to downloads and also get Design Compiler (synthesis) latest version, and any others you want. + Click on all parts and the .spf file, then click Download Files near the top +move the SynopsysIntaller into /cad/synopsys/Installer_5.4 with 755 permission for cad, +move other files into /cad/synopsys/downloads and work as user cad from here on +$ cd /cad/synopsys/installer_5.4 +$ ./SynopsysInstaller_v5.4.run +Accept default installation directory +$ ./installer +Enter source path as /cad/synopsys/downloads, and installation path as /cad/synopsys +When prompted, enter your site ID +Follow prompts + +Installer can be utilized in graphical or text-based modes. It is far easier to use the text-based installation tool. To install DC, navigate to the location where your downloaded DC files are and type installer. You should be prompted with questions related to where you wish to have your files installed. + +The Synopsys Installer automatically installs all downloaded product files into a single top-level target directory. You do not need to specify the installation directory for each product. For example, if you specify /import/programs/synopsys as the target directory, your installation directory structure might look like this after installation: + +/import/programs/synopsys/syn/S-2021.06-SP1 + +Note: Although most parts of Wally, including the software used in this chapter and Questa simulation, will work on most modern Linux platforms, as of 2022, the Synopsys CAD tools for SoC design are only supported on RedHat Enterprise Linux 7.4 or 8 or SUSE Linux Enterprise Server (SLES) 12 or 15. Moreover, the RISC-V formal specification (sail-riscv) does not build gracefully on RHEL7. + +The Verilog simulation has been tested with Siemens Questa/ModelSim. This package is available to universities worldwide as part of the Design Verification Bundle through the Siemens Academic Partner Program members for $990/year. + +If you want to implement your own version of the chip, your tool and license complexity rises significantly. Logic synthesis uses Synopsys Design Compiler. Placement and routing uses Cadence Innovus. Both Synopsys and Cadence offer their tools at a steep discount to their university program members, but the cost is still several thousand dollars per year. Most research universities with integrated circuit design programs have Siemens, Synopsys, and Cadence licenses. You also need a process design kit (PDK) for a specific integrated circuit technology and its libraries. The open-source Google Skywater 130 nm PDK is sufficient to synthesize the core but lacks memories. Google presently funds some fabrication runs for universities. IMEC and Muse Semiconductor offers full access to multiproject wafer fabrication on the TSMC 28 nm process including logic, I/O, and memory libraries; this involves three non-disclosure agreements. Fabrication costs on the order of $10,000 for a batch of 1 mm2 chips. + +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. + + + From 4c4f71c27c82406b6ce9118d1b803e47bcf51d96 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 22:20:53 -0600 Subject: [PATCH 13/16] Readme formatting. --- README.md | 203 +++++++++++++++++++++++++++--------------------------- 1 file changed, 102 insertions(+), 101 deletions(-) diff --git a/README.md b/README.md index 6092fd74..7c646a0f 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ This section describes the open source toolchain installation. These steps shou The full instalation details are involved can be be skipped using the following script, wally-tool-chain-install.sh. The script installs the open source tools to /opt/riscv by default. This can be changed by supply the path as the first argument. This script does not install buildroot (see the Detailed Tool-chain Install Guide in the following section) and does not install commercial EDA tools; Siemens Questa, Synopsys Design Compiler, or Cadence Innovus (see section Installing IDA Tools). It must be run as root or with sudo. This script is tested for Ubuntu, 20.04 and 22.04. Fedora and Red Hat can be installed in the Detailed Tool-chain Install Guide. -wally-tool-chain-install.sh + wally-tool-chain-install.sh ## Detailed Tool-chain Install Guide @@ -49,11 +49,11 @@ wally-tool-chain-install.sh -$ cd $RISCV -$ git clone --recurse-submodules https://github.com/qemu/qemu -$ cd qemu -$ git checkout v6.2.0 # last version tested; newer versions might be ok -$ ./configure --target-list=riscv64-softmmu --prefix=$RISCV -$ make --jobs -$ make install + $ cd $RISCV + $ git clone --recurse-submodules https://github.com/qemu/qemu + $ cd qemu + $ git checkout v6.2.0 # last version tested; newer versions might be ok + $ ./configure --target-list=riscv64-softmmu --prefix=$RISCV + $ make --jobs + $ make install ### Cross-Compile Buildroot Linux @@ -212,14 +212,14 @@ Buildroot depends on configuration files in riscv-wally, so the cad user must in To configure and build Buildroot: -$ cd $RISCV -$ export WALLY=~/riscv-wally # make sure you haven’t sourced ~/riscv-wally/setup.sh by now -$ git clone https://github.com/buildroot/buildroot.git -$ cd buildroot -$ git checkout 2021.05 # last tested working version -$ cp -r $WALLY/linux/buildroot-config-src/wally ./board -$ cp ./board/wally/main.config .config -$ make --jobs + $ cd $RISCV + $ export WALLY=~/riscv-wally # make sure you haven’t sourced ~/riscv-wally/setup.sh by now + $ git clone https://github.com/buildroot/buildroot.git + $ cd buildroot + $ git checkout 2021.05 # last tested working version + $ cp -r $WALLY/linux/buildroot-config-src/wally ./board + $ cp ./board/wally/main.config .config + $ make --jobs To generate disassembly files and the device tree, run another make script. Note that you can expect some warnings about phandle references while running dtc on wally-virt.dtb. @@ -233,11 +233,11 @@ Note: When the make tasks complete, you’ll find source code in $RISCV/buildroo For logic synthesis, we need a synthesis tool (see Section 3.XREF) and a cell library. Clone the OSU 12-track cell library for the Skywater 130 nm process: -$ cd $RISCV -$ mkdir cad -$ mkdir cad/lib -$ cd cad/lib -$ git clone https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12 + $ cd $RISCV + $ mkdir cad + $ mkdir cad/lib + $ cd cad/lib + $ git clone https://foss-eda-tools.googlesource.com/skywater-pdk/libs/sky130_osu_sc_t12 ## Installing EDA Tools @@ -258,7 +258,7 @@ 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 -$ firefox & + $ firefox & Navigate to https://solvnet.synopsys.com Log in with your institution’s username and password Click on Downloads, then scroll down to Synopsys Installer @@ -268,19 +268,20 @@ Return to downloads and also get Design Compiler (synthesis) latest version, and 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 other files into /cad/synopsys/downloads and work as user cad from here on -$ cd /cad/synopsys/installer_5.4 -$ ./SynopsysInstaller_v5.4.run -Accept default installation directory -$ ./installer -Enter source path as /cad/synopsys/downloads, and installation path as /cad/synopsys -When prompted, enter your site ID -Follow prompts + + $ cd /cad/synopsys/installer_5.4 + $ ./SynopsysInstaller_v5.4.run + Accept default installation directory + $ ./installer + Enter source path as /cad/synopsys/downloads, and installation path as /cad/synopsys + When prompted, enter your site ID + Follow prompts Installer can be utilized in graphical or text-based modes. It is far easier to use the text-based installation tool. To install DC, navigate to the location where your downloaded DC files are and type installer. You should be prompted with questions related to where you wish to have your files installed. The Synopsys Installer automatically installs all downloaded product files into a single top-level target directory. You do not need to specify the installation directory for each product. For example, if you specify /import/programs/synopsys as the target directory, your installation directory structure might look like this after installation: -/import/programs/synopsys/syn/S-2021.06-SP1 + /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. From a4e822fb69071105a4832a6d053e66987122a4e5 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 22:22:39 -0600 Subject: [PATCH 14/16] More changes to the readme formatting. --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7c646a0f..3196e3fc 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ This section describes the open source toolchain installation. These steps shou The full instalation details are involved can be be skipped using the following script, wally-tool-chain-install.sh. The script installs the open source tools to /opt/riscv by default. This can be changed by supply the path as the first argument. This script does not install buildroot (see the Detailed Tool-chain Install Guide in the following section) and does not install commercial EDA tools; Siemens Questa, Synopsys Design Compiler, or Cadence Innovus (see section Installing IDA Tools). It must be run as root or with sudo. This script is tested for Ubuntu, 20.04 and 22.04. Fedora and Red Hat can be installed in the Detailed Tool-chain Install Guide. - wally-tool-chain-install.sh + $ wally-tool-chain-install.sh ## Detailed Tool-chain Install Guide @@ -49,11 +49,11 @@ The script installs the open source tools to /opt/riscv by default. This can be Compiling, assembling, and simulating RISC-V programs requires downloading and installing the following free tools: - 1. The GCC cross-compiler - 2. A RISC-V simulator such as Spike, Sail, and/or QEMU - 3. Spike is easy to use but doesn’t support peripherals to boot Linux - 4. QEMU is faster and can boot Linux - 5. Sail is presently the official golden reference for RISC-V and is used by the riscof verification suite, but runs slowly and is painful to instal +1. The GCC cross-compiler +2. A RISC-V simulator such as Spike, Sail, and/or QEMU +3. Spike is easy to use but doesn’t support peripherals to boot Linux +4. QEMU is faster and can boot Linux +5. Sail is presently the official golden reference for RISC-V and is used by the riscof verification suite, but runs slowly and is painful to instal This setup needs to be done once by the administrator From 5b705039a60d148bcfa46bd249a6d016c2d3c36c Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sat, 21 Jan 2023 22:47:47 -0600 Subject: [PATCH 15/16] Added block diagram to readme. --- README.md | 2 ++ wallyriscvTopAll.png | Bin 0 -> 38693 bytes 2 files changed, 2 insertions(+) create mode 100644 wallyriscvTopAll.png diff --git a/README.md b/README.md index 3196e3fc..88b38835 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Configurable RISC-V Processor Wally is a 5-stage pipelined processor configurable to support all the standard RISC-V options, incluidng RV32/64, A, C, F, D, and M extensions, FENCE.I, and the various privileged modes and CSRs. It is written in SystemVerilog. It passes the RISC-V Arch Tests and boots Linux on an FPGA. +![Wally block diagram](wallyriscvTopAll.png) + Wally is described in a textbook, RISC-V System-on-Chip Design, by Harris, Stine, Thompson, and Harris. See Appendix D for directions installing the RISC-V tool chain needed to use Wally. New users may wish to do the following setup to access the server via a GUI and use a text editor. diff --git a/wallyriscvTopAll.png b/wallyriscvTopAll.png new file mode 100644 index 0000000000000000000000000000000000000000..df25bfbbaeb3ca757b98780001c8d2674d73d592 GIT binary patch literal 38693 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 BJih<{ literal 0 HcmV?d00001 From 19966033f1b69db5d224c550af510adf73f085b8 Mon Sep 17 00:00:00 2001 From: Ross Thompson Date: Sun, 22 Jan 2023 12:53:23 -0600 Subject: [PATCH 16/16] Added SPDX header to install script. --- bin/wally-tool-chain-install.sh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/bin/wally-tool-chain-install.sh b/bin/wally-tool-chain-install.sh index 6c52ce7c..dbed6ed8 100755 --- a/bin/wally-tool-chain-install.sh +++ b/bin/wally-tool-chain-install.sh @@ -1,4 +1,30 @@ #!/bin/bash +########################################### +## cache +## +## Written: Ross Thompson ross1728@gmail.com +## Created: 18 January 2023 +## Modified: 22 January 2023 +## +## Purpose: Open source tool chain installation script +## +## A component of the CORE-V-WALLY configurable RISC-V project. +## +## 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. +################################################################################################ export RISCV="${1:-/opt/riscv}" export PATH=$PATH:$RISCV/bin