summaryrefslogtreecommitdiffstats
path: root/scripts/quartus/tabtest.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/quartus/tabtest.sh')
-rw-r--r--scripts/quartus/tabtest.sh78
1 files changed, 78 insertions, 0 deletions
diff --git a/scripts/quartus/tabtest.sh b/scripts/quartus/tabtest.sh
new file mode 100644
index 0000000..2fd1b40
--- /dev/null
+++ b/scripts/quartus/tabtest.sh
@@ -0,0 +1,78 @@
+#!/bin/bash
+
+set -e
+read _ ip dev grade _ < <( echo $* | tr '_/' ' '; )
+
+# rm -rf tab_${ip}_${dev}_${grade}
+mkdir -p tab_${ip}_${dev}_${grade}
+cd tab_${ip}_${dev}_${grade}
+
+max_speed=99
+min_speed=01
+best_speed=99
+
+synth_case() {
+ if [ -f test_${1}.txt ]; then
+ echo "Reusing cached tab_${ip}_${dev}_${grade}/test_${1}."
+ return
+ fi
+
+ case "${dev}" in
+ ep4ce) al_device="ep4ce30f23${grade}" ;;
+ ep4cgx) al_device="ep4cgx50df27${grade}" ;;
+ 5cgx) al_device="5cgxbc9c6f23${grade}" ;;
+ esac
+
+ cat > test_${1}.qsf <<- EOT
+set_global_assignment -name DEVICE ${al_device}
+set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
+set_global_assignment -name TOP_LEVEL_ENTITY top
+set_global_assignment -name VERILOG_FILE ../tabtest.v
+set_global_assignment -name VERILOG_FILE ../../../picorv32.v
+set_global_assignment -name SDC_FILE test_${1}.sdc
+ EOT
+
+ cat > test_${1}.sdc <<- EOT
+ create_clock -period ${speed%?}.${speed#?} [get_ports clk]
+ EOT
+
+ echo "Running tab_${ip}_${dev}_${grade}/test_${1}.."
+
+ if ! $QUARTUS_BIN/quartus_map test_${1}; then
+ exit 1
+ fi
+ if ! $QUARTUS_BIN/quartus_fit --read_settings_files=off --write_settings_files=off test_${1} -c test_${1}; then
+ exit 1
+ fi
+ if ! $QUARTUS_BIN/quartus_sta test_${1} -c test_${1}; then
+ exit 1
+ fi
+
+ cp output_files/test_${1}.sta.summary test_${1}.txt
+}
+
+countdown=7
+while [ $countdown -gt 0 ]; do
+ speed=$(((max_speed+min_speed)/2))
+ synth_case $speed
+
+ if grep -q '^Slack : -' test_${speed}.txt; then
+ echo " tab_${ip}_${dev}_${grade}/test_${speed} VIOLATED"
+ min_speed=$((speed))
+ elif grep -q '^Slack : [^-]' test_${speed}.txt; then
+ echo " tab_${ip}_${dev}_${grade}/test_${speed} MET"
+ [ $speed -lt $best_speed ] && best_speed=$speed
+ max_speed=$((speed))
+ else
+ echo "ERROR: No slack line found in $PWD/test_${speed}.txt!"
+ exit 1
+ fi
+
+ countdown=$((countdown-1))
+done
+
+echo "-----------------------"
+echo "Best speed for tab_${ip}_${dev}_${grade}: $best_speed"
+echo "-----------------------"
+echo $best_speed > results.txt
+