Files
EMBS/Practicals/hlsdev/sim.sh

76 lines
2.6 KiB
Bash
Executable File

#!/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 "------------------------------------------------------------------"