#!/usr/bin/env bash # # Build and run the Vitis HLS C-simulation for a practical, locally. # # This is a plain C++ compile of the testbench + DUT, which is what "Run C # Simulation" does on the server (minus the HLS compiler's extra checking). # It is the fast way to know your logic is right before spending time on the # remote machine. # # Usage: # ./sim.sh # practical-3b # ./sim.sh practical-4 # any other practical directory # set -euo pipefail here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" practical="${1:-practical-3b}" # Find the HLS component: the directory holding hls_config.cfg. cfg="$(find "$here/../$practical" -name hls_config.cfg -not -path '*/hls/*' 2>/dev/null | head -1)" if [ -z "$cfg" ]; then echo "error: no hls_config.cfg found under $here/../$practical" >&2 exit 1 fi proj="$(cd "$(dirname "$cfg")" && pwd)" # hls_config.cfg names the sources, so we never have to guess. tb_name="$(grep -E '^tb\.file=' "$cfg" | head -1 | cut -d= -f2- | tr -d '\r')" dut_name="$(grep -E '^syn\.file=' "$cfg" | grep -E '\.(cpp|cc|cxx|c)$' | head -1 | cut -d= -f2- | tr -d '\r')" if [ -z "$tb_name" ] || [ -z "$dut_name" ]; then echo "error: could not read tb.file / syn.file from $cfg" >&2 exit 1 fi # Prefer the real Xilinx headers; fall back to the stub so this still works # before ./fetch-headers.sh has been run. if [ -f "$here/include/ap_int.h" ]; then inc="$here/include" inc_extra="$here/include" else inc="$here/include-stub" inc_extra="$here/include-stub" echo "==============================================================" echo "NOTE: using the FALLBACK stub headers in hlsdev/include-stub." echo " They are good enough for the Game of Life practical, but" echo " they are NOT the real Xilinx headers. Run ./fetch-headers.sh" echo " for a simulation you can fully trust." echo "==============================================================" echo fi CXX="${CXX:-clang++}" out="$here/build" mkdir -p "$out" dut="$proj/$dut_name" tb="$proj/$tb_name" for f in "$dut" "$tb"; do [ -f "$f" ] || { echo "error: missing source $f" >&2; exit 1; } done echo "component : $proj" echo "testbench : $tb_name" echo "dut : $dut_name" echo "compiling with $CXX ..." "$CXX" -std=c++14 -O2 -Wall -Wextra -Wno-unknown-pragmas -Wno-unused-label \ -I"$inc" -I"$inc_extra" -I"$proj" \ "$tb" "$dut" -o "$out/csim" echo "running ..." echo "------------------------------------------------------------------" "$out/csim" echo "------------------------------------------------------------------"