diff options
Diffstat (limited to 'fpga/usrp3/tools/scripts/setupenv_base.sh')
-rw-r--r-- | fpga/usrp3/tools/scripts/setupenv_base.sh | 472 |
1 files changed, 472 insertions, 0 deletions
diff --git a/fpga/usrp3/tools/scripts/setupenv_base.sh b/fpga/usrp3/tools/scripts/setupenv_base.sh new file mode 100644 index 000000000..0cdf71370 --- /dev/null +++ b/fpga/usrp3/tools/scripts/setupenv_base.sh @@ -0,0 +1,472 @@ +#!/bin/bash +# +# Copyright 2015 Ettus Research +# + +#---------------------------------------------------------------------------- +# Global defaults +#---------------------------------------------------------------------------- +export VIV_PLATFORM=$(uname -o) + +# Vivado specific +if [[ $VIV_PLATFORM = "Cygwin" ]]; then + if [[ -d "/cygdrive/c/Xilinx/Vivado_Lab" ]]; then + VIVADO_BASE_PATH="/cygdrive/c/Xilinx/Vivado_Lab" + else + VIVADO_BASE_PATH="/cygdrive/c/Xilinx/Vivado" + fi + MODELSIM_BASE_PATH="/cygdrive/c/mentor/modelsim" +else + if [[ -d "/opt/Xilinx/Vivado_Lab" ]]; then + VIVADO_BASE_PATH="/opt/Xilinx/Vivado_Lab" + else + VIVADO_BASE_PATH="/opt/Xilinx/Vivado" + fi + MODELSIM_BASE_PATH="/opt/mentor/modelsim" +fi + +function resolve_viv_path { + if [[ $VIV_PLATFORM = "Cygwin" ]]; then + echo $(cygpath -aw $1) + else + echo $1 + fi +} + +#---------------------------------------------------------------------------- +# Validate prerequisites +#---------------------------------------------------------------------------- +# Ensure required variables +if [ -z "$REPO_BASE_PATH" ]; then + echo "ERROR: Please define the variable REPO_BASE_PATH before calling this script" + return +fi +if [ -z "$VIVADO_VER" ]; then + echo "ERROR: Please define the variable VIVADO_VER before calling this script" + return +fi +if [ -z "$DISPLAY_NAME" ]; then + echo "ERROR: Please define the variable DISPLAY_NAME before calling this script" + return +fi +if [ ${#PRODUCT_ID_MAP[@]} -eq 0 ]; then + echo "ERROR: Please define the variable PRODUCT_ID_MAP before calling this script" + return +fi + +# Ensure that the script is sourced +if [[ $BASH_SOURCE = $0 ]]; then + echo "ERROR: This script must be sourced." + help + exit 1 +fi + +#---------------------------------------------------------------------------- +# Help message display function +#---------------------------------------------------------------------------- +function help { + cat <<EOHELP + +Usage: source setupenv.sh [--help|-h] [--vivado-path=<PATH>] [--modelsim-path=<PATH>] + +--vivado-path : Path to the base install directory for Xilinx Vivado + (Default: /opt/Xilinx/Vivado or /opt/Xilinx/Vivado_Lab) +--modelsim-path : Path to the base install directory for Modelsim (optional simulation tool) + (Default: /opt/mentor/modelsim) +--help -h : Shows this message. + +This script sets up the environment required to build FPGA images for the Ettus Research +${DISPLAY_NAME}. It will also optionally set up the the environment to run the +Modelsim simulator (although this tool is not required). + +Required tools: Xilinx Vivado $VIVADO_VER (Synthesis and Simulation) +Optional tools: Mentor Graphics Modelsim (Simulation) + +EOHELP +} + +#---------------------------------------------------------------------------- +# Setup and parse command line +#---------------------------------------------------------------------------- +# Detect platform bitness +if [ "$(uname -m)" = "x86_64" ]; then + BITNESS="64" +else + BITNESS="32" +fi + +# Go through cmd line options +MODELSIM_REQUESTED=0 +MODELSIM_FOUND=0 +PARSE_STATE="" +for i in "$@"; do + case $i in + -h|--help) + help + return 0 + ;; + --vivado-path=*) + VIVADO_BASE_PATH="${i#*=}" + PARSE_STATE="" + ;; + --vivado-path) + PARSE_STATE="vivado-path" + ;; + --vivado-version=*) + VIVADO_USER_VER="${i#*=}" + PARSE_STATE="" + ;; + --vivado-version) + PARSE_STATE="vivado-version" + ;; + --modelsim-path=*) + MODELSIM_BASE_PATH="${i#*=}" + MODELSIM_REQUESTED=1 + PARSE_STATE="" + ;; + --modelsim-path) + PARSE_STATE="modelsim-path" + ;; + *) + case $PARSE_STATE in + vivado-path) + VIVADO_BASE_PATH="$i" + PARSE_STATE="" + ;; + vivado-version) + VIVADO_USER_VER="$i" + PARSE_STATE="" + ;; + modelsim-path) + MODELSIM_BASE_PATH="$i" + MODELSIM_REQUESTED=1 + PARSE_STATE="" + ;; + *) + echo "ERROR: Unrecognized option: $i" + help + return 1 + ;; + esac + ;; + esac +done + +# Vivado environment setup +if [[ ${VIVADO_VER^^} = "CMDLINE_ARG" ]]; then + if [[ -z $VIVADO_USER_VER ]]; then + echo "ERROR: The --vivado-version argument must be specified when the env version is \"CMDLINE_ARG\"" + return 1 + else + VIVADO_VER=$VIVADO_USER_VER + fi +fi +export VIVADO_PATH=$VIVADO_BASE_PATH/$VIVADO_VER + +echo "Setting up a ${BITNESS}-bit FPGA build environment for the ${DISPLAY_NAME}..." +#---------------------------------------------------------------------------- +# Prepare Vivado environment +#---------------------------------------------------------------------------- +if [ -d "$VIVADO_PATH/bin" ]; then + echo "- Vivado: Found ($VIVADO_PATH/bin)" +else + echo "- Vivado: Version $VIVADO_VER not found in $VIVADO_BASE_PATH (ERROR.. Builds and simulations will not work)" + if [[ -z $VIVADO_USER_VER ]]; then + echo " Use the --vivado-path option to override the search path" + else + echo " Use the --vivado-path option to override the search path or specify the correct --vivado-version" + fi + unset VIVADO_USER_VER + return 1 +fi + +$VIVADO_PATH/settings${BITNESS}.sh +if [[ -e $VIVADO_PATH/.settings${BITNESS}-Vivado_Lab.sh ]]; then + $VIVADO_PATH/.settings${BITNESS}-Vivado_Lab.sh +else + $VIVADO_PATH/.settings${BITNESS}-Vivado.sh +fi +if [[ -e $(readlink -f $VIVADO_BASE_PATH/..)/DocNav/.settings${BITNESS}-DocNav.sh ]]; then + $(readlink -f $VIVADO_BASE_PATH/..)/DocNav/.settings${BITNESS}-DocNav.sh +fi + +if [[ -x `which tput 2>/dev/null` ]] ; then + export VIV_COLOR_SCHEME=default +fi +VIVADO_EXEC="$REPO_BASE_PATH/tools/scripts/launch_vivado.sh" + +#---------------------------------------------------------------------------- +# Prepare Modelsim environment +#---------------------------------------------------------------------------- +if [[ -d $MODELSIM_BASE_PATH ]]; then + if [[ $VIV_PLATFORM = "Cygwin" ]]; then + VSIM_PATH=$(find -L $MODELSIM_BASE_PATH -maxdepth 3 -wholename '*win*/vsim.exe' | head -n 1) + else + VSIM_PATH=$(find -L $MODELSIM_BASE_PATH -maxdepth 3 -wholename '*linux*/vsim' | head -n 1) + fi +fi +if [[ $VSIM_PATH ]]; then + if [[ $($VSIM_PATH -version) =~ .*ModelSim[[:space:]](.+)[[:space:]]vsim.* ]]; then + MODELSIM_VER=${BASH_REMATCH[1]} + MODELSIM_PATH=$(dirname $VSIM_PATH) + fi + case $MODELSIM_VER in + DE-64|SE-64) + export MODELSIM_64BIT=1 + export SIM_COMPLIBDIR=$VIVADO_PATH/modelsim64 + ;; + DE|SE|PE) + export MODELSIM_64BIT=0 + export SIM_COMPLIBDIR=$VIVADO_PATH/modelsim32 + ;; + *) + ;; + esac +fi + +function build_simlibs { + mkdir -p $SIM_COMPLIBDIR + pushd $SIM_COMPLIBDIR + CMD_PATH=`mktemp XXXXXXXX.vivado_simgen.tcl` + if [[ $MODELSIM_64BIT -eq 1 ]]; then + echo "compile_simlib -force -simulator modelsim -family all -language all -library all -directory $SIM_COMPLIBDIR" > $CMD_PATH + else + echo "compile_simlib -force -simulator modelsim -family all -language all -library all -32 -directory $SIM_COMPLIBDIR" > $CMD_PATH + fi + $VIVADO_EXEC -mode batch -source $(resolve_viv_path $CMD_PATH) -nolog -nojournal + rm -f $CMD_PATH + popd +} + +if [[ $MODELSIM_VER ]]; then + echo "- Modelsim: Found ($MODELSIM_VER, $MODELSIM_PATH)" + if [[ -e "$SIM_COMPLIBDIR/modelsim.ini" ]]; then + echo "- Modelsim Compiled Libs: Found ($SIM_COMPLIBDIR)" + else + echo "- Modelsim Compiled Libs: Not found! (Run build_simlibs to generate them.)" + fi +else + if [[ $MODELSIM_REQUESTED -eq 1 ]]; then + echo "- Modelsim: Not found in $MODELSIM_BASE_PATH (WARNING.. Simulations with vsim will not work)" + fi +fi + +#---------------------------------------------------------------------------- +# Misc export variables +#---------------------------------------------------------------------------- +export PATH=$(echo ${PATH} | tr ':' '\n' | awk '$0 !~ "/Vivado/"' | paste -sd:) +export PATH=${PATH}:$VIVADO_PATH:$VIVADO_PATH/bin:$VIVADO_HLS_PATH:$VIVADO_HLS_PATH/bin:$MODELSIM_PATH + +for prod in "${!PRODUCT_ID_MAP[@]}"; do + IFS='/' read -r -a prod_tokens <<< "${PRODUCT_ID_MAP[$prod]}" + if [ ${#prod_tokens[@]} -eq 6 ]; then + export XIL_ARCH_${prod}=${prod_tokens[0]} + export XIL_PART_ID_${prod}=${prod_tokens[1]}/${prod_tokens[2]}/${prod_tokens[3]}/${prod_tokens[4]}/${prod_tokens[5]} + elif [ ${#prod_tokens[@]} -eq 5 ]; then + export XIL_ARCH_${prod}=${prod_tokens[0]} + export XIL_PART_ID_${prod}=${prod_tokens[1]}/${prod_tokens[2]}/${prod_tokens[3]}/${prod_tokens[4]} + elif [ ${#prod_tokens[@]} -eq 4 ]; then + export XIL_ARCH_${prod}=${prod_tokens[0]} + export XIL_PART_ID_${prod}=${prod_tokens[1]}/${prod_tokens[2]}/${prod_tokens[3]} + else + echo "ERROR: Invalid PRODUCT_ID_MAP entry: \"${PRODUCT_ID_MAP[$prod]}\". Must be <arch>/<part>/<pkg>/<sg>[/<tg>[/<rev>]]." + return 1 + fi +done + +#---------------------------------------------------------------------------- +# Define IP management aliases +#---------------------------------------------------------------------------- +# Vivado specific +VIV_IP_UTILS=$REPO_BASE_PATH/tools/scripts/viv_ip_utils.tcl + +function viv_create_ip { + if [[ -z $1 || -z $2 || -z $3 || -z $4 ]]; then + echo "Create a new Vivado IP instance and a Makefile for it" + echo "" + echo "Usage: viv_create_new_ip <IP Name> <IP Location> <IP VLNV> <Product>" + echo "- <IP Name>: Name of the IP instance" + echo "- <IP Location>: Base location for IP" + echo "- <IP VLNV>: The vendor, library, name, and version (VLNV) string for the IP as defined by Xilinx" + echo "- <Product>: Product to generate IP for. Choose from: ${!PRODUCT_ID_MAP[@]}" + return 1 + fi + + ip_name=$1 + ip_dir=$(readlink -f $2) + ip_vlnv=$3 + IFS='/' read -r -a prod_tokens <<< "${PRODUCT_ID_MAP[$4]}" + part_name=${prod_tokens[1]}${prod_tokens[2]}${prod_tokens[3]} + if [[ -z $part_name ]]; then + echo "ERROR: Invalid product name $4. Supported: ${!PRODUCT_ID_MAP[@]}" + return 1 + fi + if [[ -d $ip_dir/$ip_name ]]; then + echo "ERROR: IP $ip_dir/$ip_name already exists. Please choose a different name." + return 1 + fi + + $VIVADO_EXEC -mode gui -source $(resolve_viv_path $VIV_IP_UTILS) -nolog -nojournal -tclargs create $part_name $ip_name $(resolve_viv_path $ip_dir) $ip_vlnv + echo "Generating Makefile..." + python $REPO_BASE_PATH/tools/scripts/viv_gen_ip_makefile.py --ip_name=$ip_name --dest=$ip_dir/$ip_name + echo "Done generating IP in $ip_dir/$ip_name" +} + +function viv_modify_ip { + if [[ -z $1 ]]; then + echo "Modify an existing Vivado IP instance" + echo "" + echo "Usage: viv_modify_ip <IP XCI Path>" + echo "- <IP XCI Path>: Path to the IP XCI file." + return 1 + fi + + xci_path=$(readlink -f $1) + part_name=$(python $REPO_BASE_PATH/tools/scripts/viv_ip_xci_editor.py read_part $xci_path) + if [[ -z $part_name ]]; then + echo "ERROR: Invalid part name $part_name. XCI parse error." + return 1 + fi + if [[ -f $xci_path ]]; then + $VIVADO_EXEC -mode gui -source $(resolve_viv_path $VIV_IP_UTILS) -nolog -nojournal -tclargs modify $part_name $(resolve_viv_path $xci_path) + else + echo "ERROR: IP $xci_path not found." + return 1 + fi +} + +function viv_modify_bd { + if [[ -z $1 || -z $2 ]]; then + echo "Modify an existing Vivado Block Design instance" + echo "" + echo "Usage: viv_modify_bd <BD Path> <Product>" + echo "- <BD Path>: Path to the BD file." + echo "- <Product>: Product to generate IP for. Choose from: ${!PRODUCT_ID_MAP[@]}" + return 1 + fi + + bd_path=$(readlink -f $1) + IFS='/' read -r -a prod_tokens <<< "${PRODUCT_ID_MAP[$2]}" + part_name=${prod_tokens[1]}${prod_tokens[2]}${prod_tokens[3]} + if [[ -f $bd_path ]]; then + $VIVADO_EXEC -mode gui -source $(resolve_viv_path $VIV_IP_UTILS) -nolog -nojournal -tclargs modify $part_name $(resolve_viv_path $bd_path) + else + echo "ERROR: IP $bd_path not found." + return 1 + fi +} + +function viv_modify_tcl_bd { + if [[ -z $1 || -z $2 ]]; then + echo "Modify an existing Vivado TCL-based Block Design instance." + echo "" + echo "Usage: viv_modify_bd_tcl <TCL Path> <Product>" + echo "- <TCL Path>: Path to the TCL source file." + echo "- <Product> : Product to generate IP for. Choose from: ${!PRODUCT_ID_MAP[@]}" + return 1 + fi + + src_path=$(readlink -f $1) + IFS='/' read -r -a prod_tokens <<< "${PRODUCT_ID_MAP[$2]}" + part_name=${prod_tokens[1]}${prod_tokens[2]}${prod_tokens[3]} + bd_ip_repo="${src_path%/top*}/lib/vivado_ipi" + if [[ -f $src_path ]]; then + $VIVADO_EXEC -mode gui -source $(resolve_viv_path $VIV_IP_UTILS) -nolog -nojournal -tclargs modify_bdtcl $part_name $(resolve_viv_path $src_path) $(resolve_viv_path $bd_ip_repo) + echo "INFO: Vivado BD was closed, writing source TCL..." + $VIVADO_EXEC -mode batch -source $(resolve_viv_path $VIV_IP_UTILS) -nolog -nojournal -tclargs write_bdtcl $part_name $(resolve_viv_path $src_path) + else + echo "ERROR: IP $src_path not found." + return 1 + fi +} + +function viv_ls_ip { + if [[ -z $1 ]]; then + echo "List the items in the Vivado IP catalog" + echo "" + echo "Usage: viv_ls_ip <Product>" + echo "- <Product>: Product to generate IP for. Choose from: ${!PRODUCT_ID_MAP[@]}" + return 1 + fi + + IFS='/' read -r -a prod_tokens <<< "${PRODUCT_ID_MAP[$1]}" + part_name=${prod_tokens[1]}${prod_tokens[2]}${prod_tokens[3]} + if [[ -z $part_name ]]; then + echo "ERROR: Invalid product name $1. Supported: ${!PRODUCT_ID_MAP[@]}" + return 1 + fi + $VIVADO_EXEC -mode batch -source $(resolve_viv_path $VIV_IP_UTILS) -nolog -nojournal -tclargs list $part_name | grep -v -E '(^$|^#|\*\*)' + test ${PIPESTATUS[0]} -eq 0 +} + +function viv_upgrade_ip { + if [[ -z $1 ]]; then + echo "Upgrade one or more Xilinx IP targets" + echo "" + echo "Usage: viv_upgrade_ip <IP Directory> [--recursive]" + echo "- <IP Directory>: Path to the IP XCI file." + return 1 + fi + max_depth="-maxdepth 1" + if [[ $2 == "--recursive" ]]; then + max_depth="" + fi + search_path=$(readlink -f $1) + IFS='' read -r -a xci_files <<< $(find $search_path $max_depth | grep .xci | xargs) + for xci_path in $xci_files; do + if [[ -f $xci_path ]]; then + echo "Upgrading $xci_path..." + part_name=$(python $REPO_BASE_PATH/tools/scripts/viv_ip_xci_editor.py read_part $xci_path) + $VIVADO_EXEC -mode batch -source $(resolve_viv_path $VIV_IP_UTILS) -nolog -nojournal -tclargs upgrade $part_name $(resolve_viv_path $xci_path) | grep -v -E '(^$|^#|\*\*)' + test ${PIPESTATUS[0]} -eq 0 + else + echo "ERROR: IP $xci_path not found." + return 1 + fi + done +} + +#---------------------------------------------------------------------------- +# Define hardware programming aliases +#---------------------------------------------------------------------------- +VIV_HW_UTILS=$REPO_BASE_PATH/tools/scripts/viv_hardware_utils.tcl + +function viv_hw_console { + vivado -mode tcl -source $(resolve_viv_path $VIV_HW_UTILS) -nolog -nojournal +} + +function viv_jtag_list { + $VIVADO_EXEC -mode batch -source $(resolve_viv_path $VIV_HW_UTILS) -nolog -nojournal -tclargs list | grep -v -E '(^$|^#|\*\*)' + test ${PIPESTATUS[0]} -eq 0 +} + +function viv_jtag_program { + if [[ -z $1 ]]; then + echo "Downloads a bitfile to an FPGA device using Vivado" + echo "" + echo "Usage: viv_jtag_program <Bitfile Path> [<FTDI Serial> = .] [<Device Address> = 0:0]" + echo "- <Bitfile Path>: Path to a .bit FPGA configuration file" + echo "- <FTDI Serial>: Regular expression for filtering out devices by" + echo " their FTDI serial" + echo "- <Device Address>: Address to the device in the form <Target>:<Device>" + echo " Run viv_jtag_list to get a list of connected devices" + return 1 + fi + $VIVADO_EXEC -mode batch -source $(resolve_viv_path $VIV_HW_UTILS) -nolog -nojournal -tclargs program $* | grep -v -E '(^$|^#|\*\*)' + test ${PIPESTATUS[0]} -eq 0 +} + +function probe_bitfile { + if [[ -z $1 ]]; then + echo "Probe a Xilinx bit file and report header information" + echo "" + echo "Usage: probe_bitfile <Bitfile Path>" + echo "- <Bitfile Path>: Path to a .bit FPGA configuration file" + return 1 + fi + python $REPO_BASE_PATH/tools/scripts/xil_bitfile_parser.py --info $1 +} + +echo +echo "Environment successfully initialized." +return 0 |