yosys/tests/tools/autotest.sh

178 lines
4.5 KiB
Bash
Raw Normal View History

2013-01-05 04:13:26 -06:00
#!/bin/bash
libs=""
genvcd=false
use_xsim=false
2013-11-24 08:10:43 -06:00
use_modelsim=false
2013-01-05 04:13:26 -06:00
verbose=false
keeprunning=false
makejmode=false
frontend="verilog"
2013-01-05 04:13:26 -06:00
backend_opts="-noattr -noexpr"
autotb_opts=""
2013-01-05 04:13:26 -06:00
scriptfiles=""
2014-01-02 10:51:30 -06:00
scriptopt=""
2013-01-05 04:13:26 -06:00
toolsdir="$(cd $(dirname $0); pwd)"
warn_iverilog_git=false
2013-01-05 04:13:26 -06:00
if [ ! -f $toolsdir/cmp_tbdata -o $toolsdir/cmp_tbdata.c -nt $toolsdir/cmp_tbdata ]; then
( set -ex; gcc -Wall -o $toolsdir/cmp_tbdata $toolsdir/cmp_tbdata.c; ) || exit 1
fi
while getopts xmGl:wkjvref:s:p:n: opt; do
2013-01-05 04:13:26 -06:00
case "$opt" in
x)
use_xsim=true ;;
2013-11-24 08:10:43 -06:00
m)
use_modelsim=true ;;
G)
warn_iverilog_git=true ;;
2013-01-05 04:13:26 -06:00
l)
libs="$libs $(cd $(dirname $OPTARG); pwd)/$(basename $OPTARG)";;
w)
genvcd=true ;;
k)
keeprunning=true ;;
j)
makejmode=true ;;
2013-01-05 04:13:26 -06:00
v)
verbose=true ;;
r)
2014-01-02 10:51:30 -06:00
backend_opts="$backend_opts -norename" ;;
e)
backend_opts="$( echo " $backend_opts " | sed 's, -noexpr ,,; s,^ ,,; s, $,,;'; )" ;;
f)
frontend="$OPTARG" ;;
2013-01-05 04:13:26 -06:00
s)
[[ "$OPTARG" == /* ]] || OPTARG="$PWD/$OPTARG"
scriptfiles="$scriptfiles $OPTARG" ;;
2014-01-02 10:51:30 -06:00
p)
scriptopt="$OPTARG" ;;
n)
autotb_opts="$autotb_opts -n $OPTARG" ;;
2013-01-05 04:13:26 -06:00
*)
echo "Usage: $0 [-x|-m] [-w] [-k] [-j] [-v] [-r] [-e] [-l libs] [-f frontend] [-s script] [-p cmdstring] verilog-files\n" >&2
2013-01-05 04:13:26 -06:00
exit 1
esac
done
create_ref() {
cp "$1" "$2.v"
2013-01-05 04:13:26 -06:00
}
compile_and_run() {
exe="$1"; output="$2"; shift 2
2013-11-24 08:10:43 -06:00
if $use_modelsim; then
altver=$( ls -v /opt/altera/ | grep '^[0-9]' | tail -n1; )
/opt/altera/$altver/modelsim_ase/bin/vlib work
/opt/altera/$altver/modelsim_ase/bin/vlog "$@"
/opt/altera/$altver/modelsim_ase/bin/vsim -c -do 'run -all; exit;' testbench | grep '#OUT#' > "$output"
elif $use_xsim; then
2013-01-05 04:13:26 -06:00
(
set +x
files=( "$@" )
xilver=$( ls -v /opt/Xilinx/Vivado/ | grep '^[0-9]' | tail -n1; )
/opt/Xilinx/Vivado/$xilver/bin/xvlog "${files[@]}"
/opt/Xilinx/Vivado/$xilver/bin/xelab -R work.testbench | grep '#OUT#' > "$output"
2013-01-05 04:13:26 -06:00
)
else
iverilog -s testbench -o "$exe" "$@"
vvp -n "$exe" > "$output"
fi
}
shift $((OPTIND - 1))
for fn
do
bn=${fn%.v}
if [ "$bn" == "$fn" ]; then
echo "Invalid argument: $fn" >&2
exit 1
fi
[[ "$bn" == *_tb ]] && continue
if $makejmode; then
status_prefix="Test: $bn "
else
status_prefix=""
echo -n "Test: $bn "
fi
2013-01-05 04:13:26 -06:00
2014-03-16 19:56:00 -05:00
rm -f ${bn}.{err,log,sikp}
2013-01-05 04:13:26 -06:00
mkdir -p ${bn}.out
rm -rf ${bn}.out/*
body() {
cd ${bn}.out
fn=$(basename $fn)
bn=$(basename $bn)
2013-01-05 04:13:26 -06:00
cp ../$fn $fn
if [ ! -f ../${bn}_tb.v ]; then
"$toolsdir"/../../yosys -b "test_autotb $autotb_opts" -o ${bn}_tb.v $fn
2013-01-05 04:13:26 -06:00
else
cp ../${bn}_tb.v ${bn}_tb.v
fi
if $genvcd; then sed -i 's,// \$dump,$dump,g' ${bn}_tb.v; fi
create_ref $fn ${bn}_ref
compile_and_run ${bn}_tb_ref ${bn}_out_ref ${bn}_tb.v ${bn}_ref.v $libs
if $genvcd; then mv testbench.vcd ${bn}_ref.vcd; fi
test_count=0
test_passes() {
2014-03-14 05:46:13 -05:00
"$toolsdir"/../../yosys -b "verilog $backend_opts" -o ${bn}_syn${test_count}.v "$@"
2013-01-05 04:13:26 -06:00
compile_and_run ${bn}_tb_syn${test_count} ${bn}_out_syn${test_count} \
${bn}_tb.v ${bn}_syn${test_count}.v $libs \
"$toolsdir"/../../techlibs/common/simlib.v \
"$toolsdir"/../../techlibs/common/simcells.v
2013-01-05 04:13:26 -06:00
if $genvcd; then mv testbench.vcd ${bn}_syn${test_count}.vcd; fi
$toolsdir/cmp_tbdata ${bn}_out_ref ${bn}_out_syn${test_count}
test_count=$(( test_count + 1 ))
}
2014-03-16 19:56:00 -05:00
if [ "$frontend" = "verific" -o "$frontend" = "verific_gates" ] && grep -q VERIFIC-SKIP $fn; then
touch ../${bn}.skip
return
fi
2013-01-05 04:13:26 -06:00
if [ -n "$scriptfiles" ]; then
2014-03-14 05:46:13 -05:00
test_passes $fn $scriptfiles
2014-01-02 10:51:30 -06:00
elif [ -n "$scriptopt" ]; then
2014-03-14 05:46:13 -05:00
test_passes -f "$frontend" -p "$scriptopt" $fn
elif [ "$frontend" = "verific" ]; then
test_passes -p "verific -vlog2k $fn; verific -import -all; opt; memory;;"
elif [ "$frontend" = "verific_gates" ]; then
test_passes -p "verific -vlog2k $fn; verific -import -gates -all; opt; memory;;"
2013-01-05 04:13:26 -06:00
else
2014-09-14 09:09:06 -05:00
test_passes -f "$frontend" -p "hierarchy; proc; opt; memory; opt; fsm; opt -fine" $fn
test_passes -f "$frontend" -p "hierarchy; synth -run coarse; techmap; opt; abc -dff" $fn
2013-01-05 04:13:26 -06:00
fi
touch ../${bn}.log
}
if $verbose; then
echo ".."
echo "Output written to console." > ${bn}.err
( set -ex; body; )
else
( set -ex; body; ) > ${bn}.err 2>&1
fi
if [ -f ${bn}.log ]; then
mv ${bn}.err ${bn}.log
echo "${status_prefix}-> ok"
2014-03-16 19:56:00 -05:00
elif [ -f ${bn}.skip ]; then
mv ${bn}.err ${bn}.skip
echo "${status_prefix}-> skip"
else
echo "${status_prefix}-> ERROR!"
if $warn_iverilog_git; then
echo "Note: Make sure that 'iverilog' is an up-to-date git checkout of icarus verilog."
fi
$keeprunning || exit 1
fi
2013-01-05 04:13:26 -06:00
done
exit 0