79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
#!/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
 | 
						|
 |