#!/bin/bash # run_tb.sh - Run Vivado XSIM testbench for a module # # Usage: ./run_tb.sh # ./run_tb.sh mod_add # ./run_tb.sh --list # # Prerequisites: # Vivado 2019.2 at /opt/Xilinx/Vivado/2019.2/ set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" VIVADO_SETTINGS="/opt/Xilinx/Vivado/2019.2/settings64.sh" if [ "$1" = "--list" ]; then echo "Available modules:" for d in "$SCRIPT_DIR"/sync_rtl/*/TB; do if [ -f "$d/xsim_run.tcl" ]; then name=$(basename "$(dirname "$d")") echo " $name" fi done exit 0 fi if [ -z "$1" ]; then echo "Usage: $0 " echo " $0 --list" exit 1 fi MODULE="$1" TB_DIR="$SCRIPT_DIR/sync_rtl/$MODULE/TB" TCL_FILE="$TB_DIR/xsim_run.tcl" if [ ! -f "$TCL_FILE" ]; then echo "ERROR: No xsim_run.tcl found for module '$MODULE'" echo " Expected: $TCL_FILE" echo " Run '$0 --list' to see available modules" exit 1 fi # Source Vivado environment if [ -f "$VIVADO_SETTINGS" ]; then source "$VIVADO_SETTINGS" else echo "ERROR: Vivado settings not found at $VIVADO_SETTINGS" exit 1 fi # Fix ncurses compatibility for Vivado 2019.2 on modern Linux export LD_PRELOAD="${LD_PRELOAD}${LD_PRELOAD:+:}/usr/lib64/libtinfo.so.5" cd "$SCRIPT_DIR" echo "========================================" echo " Running testbench for: $MODULE" echo "========================================" # Save TCL variables as bash variables, run commands with substitution execute_tcl() { local tcl_file="$1" local tmp_script="/tmp/run_tb_$$.sh" # Convert TCL 'set VAR value' to bash 'VAR=value' { grep -E '^set [A-Z0-9_]+ ' "$tcl_file" | while read -r _ var value; do echo "${var}=${value}" done # Extract xvlog, xelab, xsim commands with bash variable expansion grep -E '^(xvlog|xelab|xsim) ' "$tcl_file" | while read -r cmd; do printf 'echo " %s"\n' "$cmd" printf '%s 2>&1\n' "$cmd" done } > "$tmp_script" chmod +x "$tmp_script" . "$tmp_script" rm -f "$tmp_script" } execute_tcl "$TCL_FILE"