#!/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} best_speed=99 speed=20 step=16 synth_case() { if [ -f test_${1}.txt ]; then echo "Reusing cached tab_${ip}_${dev}_${grade}/test_${1}." return fi case "${dev}" in xc7k) xl_device="xc7k70t-fbg676-${grade}" ;; xc7v) xl_device="xc7v585t-ffg1761-${grade}" ;; xcku) xl_device="xcku035-fbva676-${grade}-e" ;; xcvu) xl_device="xcvu065-ffvc1517-${grade}-e" ;; xckup) xl_device="xcku3p-ffva676-${grade}-e" ;; xcvup) xl_device="xcvu3p-ffvc1517-${grade}-e" ;; esac cat > test_${1}.tcl <<- EOT read_verilog ../tabtest.v read_verilog ../../../picorv32.v read_xdc test_${1}.xdc synth_design -flatten_hierarchy full -part ${xl_device} -top top opt_design -sweep -remap -propconst opt_design -directive Explore place_design -directive Explore phys_opt_design -retime -rewire -critical_pin_opt -placement_opt -critical_cell_opt route_design -directive Explore place_design -post_place_opt phys_opt_design -retime route_design -directive NoTimingRelaxation report_utilization report_timing EOT cat > test_${1}.xdc <<- EOT create_clock -period ${speed%?}.${speed#?} [get_ports clk] EOT echo "Running tab_${ip}_${dev}_${grade}/test_${1}.." if ! $VIVADO -nojournal -log test_${1}.log -mode batch -source test_${1}.tcl > /dev/null 2>&1; then cat test_${1}.log exit 1 fi mv test_${1}.log test_${1}.txt } got_violated=false got_met=false countdown=2 while [ $countdown -gt 0 ]; do synth_case $speed if grep -q '^Slack.*(VIOLATED)' test_${speed}.txt; then echo " tab_${ip}_${dev}_${grade}/test_${speed} VIOLATED" step=$((step / 2)) speed=$((speed + step)) got_violated=true elif grep -q '^Slack.*(MET)' test_${speed}.txt; then echo " tab_${ip}_${dev}_${grade}/test_${speed} MET" [ $speed -lt $best_speed ] && best_speed=$speed step=$((step / 2)) speed=$((speed - step)) got_met=true else echo "ERROR: No slack line found in $PWD/test_${speed}.txt!" exit 1 fi if [ $step -eq 0 ]; then countdown=$((countdown - 1)) speed=$((best_speed - 2)) step=1 fi done if ! $got_violated; then echo "ERROR: No timing violated in $PWD!" exit 1 fi if ! $got_met; then echo "ERROR: No timing met in $PWD!" exit 1 fi echo "-----------------------" echo "Best speed for tab_${ip}_${dev}_${grade}: $best_speed" echo "-----------------------" echo $best_speed > results.txt