diff options
Diffstat (limited to 'scripts/vendors/compile-uvvm.sh')
-rwxr-xr-x | scripts/vendors/compile-uvvm.sh | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/scripts/vendors/compile-uvvm.sh b/scripts/vendors/compile-uvvm.sh new file mode 100755 index 000000000..d33743a87 --- /dev/null +++ b/scripts/vendors/compile-uvvm.sh @@ -0,0 +1,437 @@ +#! /usr/bin/env bash +# ============================================================================== +# Authors: +# Patrick Lehmann +# +# Bash Script (executable): +# Script to compile the UVVM library for GHDL on Linux. +# +# Description: +# - Creates a subdirectory in the current working directory +# - Compiles all UVVM packages and verification IPs +# +# ============================================================================== +# Copyright (C) 2017-2021 Patrick Lehmann - Boetzingen, Germany +# Copyright (C) 2015-2016 Patrick Lehmann - Dresden, Germany +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <gnu.org/licenses>. +# ============================================================================== + +# Work around for Darwin (Mac OS) +test greadlink --version > /dev/null 2>&1 && READLINK=greadlink || READLINK=readlink + +# Save working directory +WorkingDir=$(pwd) +ScriptDir="$(dirname $0)" +ScriptDir="$($READLINK -f $ScriptDir)" + +# Source Bash utilities +source $ScriptDir/../ansi_color.sh +if [[ $? -ne 0 ]]; then echo 1>&2 -e "${COLORED_ERROR} While loading Bash utilities.${ANSI_NOCOLOR}" ; exit 1; fi + + +# Command line argument processing +COMMAND=1 +CLEAN=0 +COMPILE_UVVM=0 +COMPILE_UVVM_UTILITIES=0 +COMPILE_UVVM_VVC_FRAMEWORK=0 +COMPILE_UVVM_VIP=0 +COMPILE_UVVM_VIP_AVALON_MM=0 +COMPILE_UVVM_VIP_AVALON_ST=0 +COMPILE_UVVM_VIP_AXI=0 +COMPILE_UVVM_VIP_AXILITE=0 +COMPILE_UVVM_VIP_AXISTREAM=0 +COMPILE_UVVM_VIP_CLOCK_GENERATOR=0 +COMPILE_UVVM_VIP_ERROR_INJECTION=0 +COMPILE_UVVM_VIP_ETHERNET=0 +COMPILE_UVVM_VIP_GMII=0 +COMPILE_UVVM_VIP_GPIO=0 +COMPILE_UVVM_VIP_HVVC_TO_VVC_BRIDGE=0 +COMPILE_UVVM_VIP_I2C=0 +COMPILE_UVVM_VIP_RGMII=0 +COMPILE_UVVM_VIP_SBI=0 +COMPILE_UVVM_VIP_SCOREBOARD=0 +COMPILE_UVVM_VIP_SPEC_COV=0 +COMPILE_UVVM_VIP_SPI=0 +COMPILE_UVVM_VIP_UART=0 +VERBOSE=0 +DEBUG=0 +FILTERING=1 +SUPPRESS_WARNINGS=0 +HALT_ON_ERROR=0 +DestDir="" +SrcDir="" +while [[ $# -gt 0 ]]; do + case "$1" in + -c|--clean) + COMMAND=3 + CLEAN=1 + ;; + -a|--all) + COMMAND=2 + ;; + --uvvm) + COMMAND=3 + COMPILE_UVVM=1 + ;; + --uvvm-vip) + COMMAND=3 + COMPILE_UVVM_VIP=1 + ;; + --uvvm-utilities) + COMMAND=3 + COMPILE_UVVM_UTILITIES=1 + ;; + --uvvm-vvc-framework) + COMMAND=3 + COMPILE_UVVM_VVC_FRAMEWORK=1 + ;; + --uvvm-vip-avalon_mm) + COMMAND=3 + COMPILE_UVVM_VIP_AVALON_MM=1 + ;; + --uvvm-vip-avalon_st) + COMMAND=3 + COMPILE_UVVM_VIP_AVALON_ST=1 + ;; + --uvvm-vip-axi) + COMMAND=3 + COMPILE_UVVM_VIP_AXI=1 + ;; + --uvvm-vip-axi_lite) + COMMAND=3 + COMPILE_UVVM_VIP_AXILITE=1 + ;; + --uvvm-vip-axi_stream) + COMMAND=3 + COMPILE_UVVM_VIP_AXISTREAM=1 + ;; + --uvvm-vip-clock) + COMMAND=3 + COMPILE_UVVM_VIP_CLOCK_GENERATOR=1 + ;; + --uvvm-vip-error) + COMMAND=3 + COMPILE_UVVM_VIP_ERROR_INJECTION=1 + ;; + --uvvm-vip-ethernet) + COMMAND=3 + COMPILE_UVVM_VIP_ETHERNET=1 + ;; + --uvvm-vip-gmii) + COMMAND=3 + COMPILE_UVVM_VIP_GMII=1 + ;; + --uvvm-vip-gpio) + COMMAND=3 + COMPILE_UVVM_VIP_GPIO=1 + ;; + --uvvm-vip-hvvc2vvc) + COMMAND=3 + COMPILE_UVVM_VIP_HVVC_TO_VVC_BRIDGE=1 + ;; + --uvvm-vip-i2c) + COMMAND=3 + COMPILE_UVVM_VIP_I2C=1 + ;; + --uvvm-vip-rgmii) + COMMAND=3 + COMPILE_UVVM_VIP_RGMII=1 + ;; + --uvvm-vip-sbi) + COMMAND=3 + COMPILE_UVVM_VIP_SBI=1 + ;; + --uvvm-vip-spec) + COMMAND=3 + COMPILE_UVVM_VIP_SPEC_COV=1 + ;; + --uvvm-vip-spi) + COMMAND=3 + COMPILE_UVVM_VIP_SPI=1 + ;; + --uvvm-vip-scoreboard) + COMMAND=3 + COMPILE_UVVM_VIP_SCOREBOARD=1 + ;; + --uvvm-vip-uart) + COMMAND=3 + COMPILE_UVVM_VIP_UART=1 + ;; + -v|--verbose) + VERBOSE=1 + ;; + -d|--debug) + VERBOSE=1 + DEBUG=1 + ;; + -h|--help) + COMMAND=0 + break + ;; + -n|--no-filter) + FILTERING=0 + ;; + -N|--no-warnings) + SUPPRESS_WARNINGS=1 + ;; + -H|--halt-on-error) + HALT_ON_ERROR=1 + ;; + --ghdl) + GHDL="$2" # overwrite a potentially existing GHDL environment variable + shift # skip argument + ;; + --source) + SrcDir="$2" + shift # skip argument + ;; + --output) + DestDir="$2" + shift # skip argument + ;; + *) # unknown option + echo 1>&2 -e "\n${COLORED_ERROR} Unknown command line option '$1'.${ANSI_NOCOLOR}" + COMMAND=0 + break + ;; + esac + shift # parsed argument or value +done + +ERRORCOUNT=0 + +if [[ $COMMAND -le 1 ]]; then + test $COMMAND -eq 1 && echo 1>&2 -e "\n${COLORED_ERROR} No command selected.${ANSI_NOCOLOR}" + echo "" + echo "Synopsis:" + echo " A script to compile the simulation library 'uvvm' for GHDL on Linux." + echo " A library folder 'uvvm/v08' will be created relative to the current" + echo " working directory." + echo "" + echo " Use the adv. options or edit 'config.sh' to supply paths and default parameters." + echo "" + echo "Usage:" + echo " compile-uvvm.sh [<verbosity>] <common command>|<library> [<options>] [<adv. options>]" + echo "" + echo "Common commands:" + echo " -h --help Print this help page" + echo " -c --clean Remove all generated files" + echo "" + echo "Libraries:" + echo " -a --all Compile all libraries." + echo " --uvvm Compile UVVM library packages." + echo " --uvvm-vip Compile UVVM Verification IPs (VIPs)." + echo "" + echo "Common Packages:" + echo " --uvvm-utilities UVVM utilities." + echo " --uvvm-vvc-framework VHDL Verification Component (VVC) framework." + echo "" + echo "Verification IPs:" + echo " --uvvm-vip-avalon_mm Altera/Intel Avalon Memory Mapped" + echo " --uvvm-vip-avalon_st Altera/Intel Avalon Stream" + echo " --uvvm-vip-axi ARM AMBA AXI4" + echo " --uvvm-vip-axi_lite ARM AMBA AXI4-Lite" + echo " --uvvm-vip-axi_stream ARM AMBA AXI4-Stream" + echo " --uvvm-vip-clock Clock generator" + echo " --uvvm-vip-error Error injection" + echo " --uvvm-vip-ethernet Ethernet" + echo " --uvvm-vip-gmii GMII" + echo " --uvvm-vip-gpio General Purpose Input/Output (GPIO)" + echo " --uvvm-vip-hvvc2vvc HVVC to VVC bridge" + echo " --uvvm-vip-i2c Inter-Integrated Circuit (I²C)" + echo " --uvvm-vip-rgmii RGMII" + echo " --uvvm-vip-sbi Simple Bus Interface" + echo " --uvvm-vip-scoreboard Scoreboard" + echo " --uvvm-vip-spec Specification Coverage" + echo " --uvvm-vip-spi Serial Peripheral Interface" + echo " --uvvm-vip-uart Universal Asynchronous Receiver Transmitter (UART)" + echo "" + echo "Library compile options:" + echo " -H --halt-on-error Halt on error(s)." + echo "" + echo "Advanced options:" + echo " --ghdl <GHDL binary> Path to GHDL's executable, e.g. /usr/local/bin/ghdl" + echo " --output <dir name> Name of the output directory, e.g. uvvm_util" + echo " --source <Path to UVVM> Path to the sources." + echo "" + echo "Verbosity:" + echo " -v --verbose Print verbose messages." + echo " -d --debug Print debug messages." + echo " -n --no-filter Disable output filtering scripts." + echo " -N --no-warnings Suppress all warnings. Show only error messages." + echo "" + exit $COMMAND +fi + +if [[ $COMMAND -eq 2 ]]; then + COMPILE_UVVM=1 + COMPILE_UVVM_VIP=1 +fi +if [[ $COMPILE_UVVM -eq 1 ]]; then + COMPILE_UVVM_UTILITIES=1 + COMPILE_UVVM_VVC_FRAMEWORK=1 +fi +if [[ $COMPILE_UVVM_VIP -eq 1 ]]; then + COMPILE_UVVM_VIP_AVALON_MM=1 + COMPILE_UVVM_VIP_AVALON_ST=1 + COMPILE_UVVM_VIP_AXI=1 + COMPILE_UVVM_VIP_AXILITE=1 + COMPILE_UVVM_VIP_AXISTREAM=1 + COMPILE_UVVM_VIP_CLOCK_GENERATOR=1 + COMPILE_UVVM_VIP_ERROR_INJECTION=1 + COMPILE_UVVM_VIP_ETHERNET=1 + COMPILE_UVVM_VIP_GMII=1 + COMPILE_UVVM_VIP_GPIO=1 + COMPILE_UVVM_VIP_HVVC_TO_VVC_BRIDGE=1 + COMPILE_UVVM_VIP_I2C=1 + COMPILE_UVVM_VIP_RGMII=1 + COMPILE_UVVM_VIP_SBI=1 + COMPILE_UVVM_VIP_SCOREBOARD=1 + COMPILE_UVVM_VIP_SPEC_COV=1 + COMPILE_UVVM_VIP_SPI=1 + COMPILE_UVVM_VIP_UART=1 +fi + + +# Source configuration file from GHDL's 'vendors' library directory +echo -e "${ANSI_MAGENTA}Loading environment...${ANSI_NOCOLOR}" +source $ScriptDir/config.sh +if [[ $? -ne 0 ]]; then echo 1>&2 -e "${COLORED_ERROR} While loading configuration.${ANSI_NOCOLOR}" ; exit 1; fi +source $ScriptDir/shared.sh +if [[ $? -ne 0 ]]; then echo 1>&2 -e "${COLORED_ERROR} While loading further procedures.${ANSI_NOCOLOR}"; exit 1; fi + +# <= $VHDLVersion +# <= $VHDLStandard +# <= $VHDLFlavor +GHDLSetup 2008 + +# -> $SourceDirectories +# -> $DestinationDirectories +# -> $SrcDir +# -> $DestDir +# <= $SourceDirectory +# <= $DestinationDirectory +SetupDirectories UVVM "UVVM" + +# Create "uvvm" directory and change to it +# => $DestinationDirectory +CreateDestinationDirectory +cd $DestinationDirectory + + +# Extend global GHDL Options TODO: move to GHDLSetup +Analyze_Parameters+=( + -fexplicit + -Wbinding + -Wno-shared +) +if [[ $DEBUG -eq 0 ]]; then + Analyze_Parameters+=( + -Wno-hide + ) +fi +if [[ ! (VERBOSE -eq 1) && ($DEBUG -eq 1) ]]; then + Analyze_Parameters+=( + -Wno-others + -Wno-static + ) +fi +Analyze_Parameters+=( + --ieee=$VHDLFlavor + --no-vital-checks + --std=$VHDLStandard + -frelaxed + -P$DestinationDirectory +) + + +# Cleanup directory +# ============================================================================== +if [[ $CLEAN -eq 1 ]]; then + echo -e "${ANSI_YELLOW}Cleaning up vendor directory ...${ANSI_NOCOLOR}" + rm *.o 2> /dev/null + rm *.cf 2> /dev/null +fi + + +# Read order of components +# ============================================================================== +test $VERBOSE -eq 1 && echo -e " ${ANSI_GRAY}Reading compile order files...${ANSI_NOCOLOR}" + +Components=() +while IFS= read -r Component; do + Component=${Component%\r} + if [[ ${Component:0:2} != "# " ]]; then + Components+=("$Component") + fi +done < <(cat "$SourceDirectory/script/component_list.txt") + + +# Read libraries and Verification IPs +# ============================================================================== +VIPNames=() + +for ComponentName in "${Components[@]}"; do + x="${ComponentName%%_*}" + pos=${#x}+1 + l=${ComponentName:$pos} + VIPName=${l^^} + LibraryPath=$ComponentName + + VIPName=${VIPName//UTIL/UTILITIES} + VIPName=${VIPName//AXILITE/AXI_LITE} + VIPName=${VIPName//AXISTREAM/AXI_STREAM} + + test $VERBOSE -eq 1 && echo -e " ${ANSI_GRAY}Found VIP '$VIPName' in '$LibraryPath'.${ANSI_NOCOLOR}" + test $DEBUG -eq 1 && echo -e " ${ANSI_DARK_GRAY}Reading compile order from '$SourceDirectory/$LibraryPath/script/compile_order.txt'${ANSI_NOCOLOR}" + + # Reading component's files + StructName=$VIPName + Files=() + + CompileOrderFile="$SourceDirectory/$LibraryPath/script/compile_order.txt" + if [[ -f "$CompileOrderFile" ]]; then + echo -e "${COLORED_ERROR} Compile order file '$CompileOrderFile' does not exist..${ANSI_NOCOLOR}" + continue + fi + + while IFS= read -r File; do + File=${File%\r} + if [[ ${File:0:2} == "# " ]]; then + if [[ ${File:2:7} == "library" ]]; then + LibraryName=${File:10} + fi + else + Files+=("${File:3}") + fi + done < <(cat "$CompileOrderFile") + + CreateLibraryStruct $StructName $LibraryName $LibraryPath $VHDLVersion "${Files[@]}" + + VarName="COMPILE_UVVM_${VIPName}" + test ${!VarName} -eq 1 && Libraries+=("$StructName") +done + +# Compile components +if [[ ${#Libraries[@]} -ne 0 ]]; then + Compile "$SourceDirectory" "${Libraries[*]}" + + echo "--------------------------------------------------------------------------------" + echo -e "Compiling UVVM packages and VIPs $(test $ERRORCOUNT -eq 0 && echo $COLORED_SUCCESSFUL || echo $COLORED_FAILED)" +else + echo -e "${COLORED_ERROR} Neither UVVM packages nor VIPs selected.${ANSI_NOCOLOR}" + exit 2 +fi |