Update vivado evaluations
This commit is contained in:
parent
f99cd747da
commit
9dbc96e330
41
README.md
41
README.md
|
@ -674,34 +674,31 @@ for an example of how to do that.
|
||||||
Evaluation: Timing and Utilization on Xilinx 7-Series FPGAs
|
Evaluation: Timing and Utilization on Xilinx 7-Series FPGAs
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
|
|
||||||
The following evaluations have been performed with Vivado 2016.1.
|
The following evaluations have been performed with Vivado 2017.2.
|
||||||
|
|
||||||
#### Timing on Xilinx 7-Series FPGAs
|
#### Timing on Xilinx 7-Series FPGAs
|
||||||
|
|
||||||
The `picorv32_axi` module with enabled `TWO_CYCLE_ALU` has been placed and
|
The `picorv32_axi` module with enabled `TWO_CYCLE_ALU` has been placed and
|
||||||
routed for Xilinx Artix-7T, Kintex-7T, Virtex-7T, Kintex UltraScale, and Virtex
|
routed for Xilinx Artix-7T, Kintex-7T, Virtex-7T, Kintex UltraScale, and Virtex
|
||||||
UltraScale devices in all speed grades. A binary search is used to find the
|
UltraScale devices in all speed grades. A binary search is used to find the
|
||||||
lowest clock period for which the design meets timing.
|
shortest clock period for which the design meets timing.
|
||||||
|
|
||||||
See `make table.txt` in [scripts/vivado/](scripts/vivado/).
|
See `make table.txt` in [scripts/vivado/](scripts/vivado/).
|
||||||
|
|
||||||
| Family | Device | Speedgrade | Clock Period (Freq.) |
|
| Device | Device | Speedgrade | Clock Period (Freq.) |
|
||||||
|:------------------------ |:-------------------- |:----------:| --------------------:|
|
|:------------------------- |:---------------------|:----------:| --------------------:|
|
||||||
| Xilinx Artix-7T | xc7a15t-fgg484-1 | -1 | 4.1 ns (243 MHz) |
|
| Xilinx Kintex-7T | xc7k70t-fbg676-2 | -2 | 2.4 ns (416 MHz) |
|
||||||
| Xilinx Artix-7T | xc7a15t-fgg484-2 | -2 | 3.5 ns (285 MHz) |
|
| Xilinx Kintex-7T | xc7k70t-fbg676-3 | -3 | 2.3 ns (434 MHz) |
|
||||||
| Xilinx Artix-7T | xc7a15t-fgg484-3 | -3 | 3.1 ns (322 MHz) |
|
| Xilinx Virtex-7T | xc7v585t-ffg1761-2 | -2 | 2.3 ns (434 MHz) |
|
||||||
| Xilinx Kintex-7T | xc7k70t-fbg676-1 | -1 | 2.8 ns (357 MHz) |
|
| Xilinx Virtex-7T | xc7v585t-ffg1761-3 | -3 | 2.3 ns (434 MHz) |
|
||||||
| Xilinx Kintex-7T | xc7k70t-fbg676-2 | -2 | 2.2 ns (454 MHz) |
|
| Xilinx Kintex UltraScale | xcku035-fbva676-2-e | -2 | 2.1 ns (476 MHz) |
|
||||||
| Xilinx Kintex-7T | xc7k70t-fbg676-3 | -3 | 2.1 ns (476 MHz) |
|
| Xilinx Kintex UltraScale | xcku035-fbva676-3-e | -3 | 1.8 ns (555 MHz) |
|
||||||
| Xilinx Virtex-7T | xc7v585t-ffg1761-1 | -1 | 2.7 ns (370 MHz) |
|
| Xilinx Virtex UltraScale | xcvu065-ffvc1517-2-e | -2 | 1.9 ns (526 MHz) |
|
||||||
| Xilinx Virtex-7T | xc7v585t-ffg1761-2 | -2 | 2.2 ns (454 MHz) |
|
| Xilinx Virtex UltraScale | xcvu065-ffvc1517-3-e | -3 | 1.8 ns (555 MHz) |
|
||||||
| Xilinx Virtex-7T | xc7v585t-ffg1761-3 | -3 | 2.1 ns (476 MHz) |
|
| Xilinx Kintex UltraScale+ | xcku3p-ffva676-2-e | -2 | 1.5 ns (666 MHz) |
|
||||||
| Xilinx Kintex UltraScale | xcku035-fbva676-1-c | -1 | 2.3 ns (434 MHz) |
|
| Xilinx Kintex UltraScale+ | xcku3p-ffva676-3-e | -3 | 1.3 ns (769 MHz) |
|
||||||
| Xilinx Kintex UltraScale | xcku035-fbva676-2-e | -2 | 2.0 ns (500 MHz) |
|
| Xilinx Virtex UltraScale+ | xcvu3p-ffvc1517-2-e | -2 | 1.5 ns (666 MHz) |
|
||||||
| Xilinx Kintex UltraScale | xcku035-fbva676-3-e | -3 | 1.8 ns (555 MHz) |
|
| Xilinx Virtex UltraScale+ | xcvu3p-ffvc1517-3-e | -3 | 1.4 ns (714 MHz) |
|
||||||
| Xilinx Virtex UltraScale | xcvu065-ffvc1517-1-i | -1 | 2.3 ns (434 MHz) |
|
|
||||||
| Xilinx Virtex UltraScale | xcvu065-ffvc1517-2-e | -2 | 2.1 ns (476 MHz) |
|
|
||||||
| Xilinx Virtex UltraScale | xcvu065-ffvc1517-3-e | -3 | 1.9 ns (526 MHz) |
|
|
||||||
|
|
||||||
#### Utilization on Xilinx 7-Series FPGAs
|
#### Utilization on Xilinx 7-Series FPGAs
|
||||||
|
|
||||||
|
@ -721,7 +718,7 @@ See `make area` in [scripts/vivado/](scripts/vivado/).
|
||||||
|
|
||||||
| Core Variant | Slice LUTs | LUTs as Memory | Slice Registers |
|
| Core Variant | Slice LUTs | LUTs as Memory | Slice Registers |
|
||||||
|:------------------ | ----------:| --------------:| ---------------:|
|
|:------------------ | ----------:| --------------:| ---------------:|
|
||||||
| PicoRV32 (small) | 725 | 48 | 441 |
|
| PicoRV32 (small) | 757 | 48 | 442 |
|
||||||
| PicoRV32 (regular) | 874 | 48 | 572 |
|
| PicoRV32 (regular) | 910 | 48 | 583 |
|
||||||
| PicoRV32 (large) | 2072 | 88 | 1022 |
|
| PicoRV32 (large) | 2090 | 88 | 1085 |
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
VIVADO_BASE = /opt/Xilinx/Vivado/2016.1
|
VIVADO_BASE = /opt/Xilinx/Vivado/2017.2
|
||||||
VIVADO = $(VIVADO_BASE)/bin/vivado
|
VIVADO = $(VIVADO_BASE)/bin/vivado
|
||||||
XVLOG = $(VIVADO_BASE)/bin/xvlog
|
XVLOG = $(VIVADO_BASE)/bin/xvlog
|
||||||
XELAB = $(VIVADO_BASE)/bin/xelab
|
XELAB = $(VIVADO_BASE)/bin/xelab
|
||||||
|
@ -8,6 +8,9 @@ TOOLCHAIN_PREFIX = riscv64-unknown-elf-
|
||||||
|
|
||||||
export VIVADO
|
export VIVADO
|
||||||
|
|
||||||
|
# work-around for http://svn.clifford.at/handicraft/2016/vivadosig11
|
||||||
|
export RDI_VERBOSE = False
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Simple synthesis tests:"
|
@echo "Simple synthesis tests:"
|
||||||
|
@ -49,11 +52,12 @@ tab_%/results.txt:
|
||||||
area: synth_area_small synth_area_regular synth_area_large
|
area: synth_area_small synth_area_regular synth_area_large
|
||||||
-grep -B4 -A10 'Slice LUTs' synth_area_small.log synth_area_regular.log synth_area_large.log
|
-grep -B4 -A10 'Slice LUTs' synth_area_small.log synth_area_regular.log synth_area_large.log
|
||||||
|
|
||||||
table.txt: tab_small_xc7a_1/results.txt tab_small_xc7a_2/results.txt tab_small_xc7a_3/results.txt
|
table.txt: tab_small_xc7k_2/results.txt tab_small_xc7k_3/results.txt
|
||||||
table.txt: tab_small_xc7k_1/results.txt tab_small_xc7k_2/results.txt tab_small_xc7k_3/results.txt
|
table.txt: tab_small_xc7v_2/results.txt tab_small_xc7v_3/results.txt
|
||||||
table.txt: tab_small_xc7v_1/results.txt tab_small_xc7v_2/results.txt tab_small_xc7v_3/results.txt
|
table.txt: tab_small_xcku_2/results.txt tab_small_xcku_3/results.txt
|
||||||
table.txt: tab_small_xcku_1/results.txt tab_small_xcku_2/results.txt tab_small_xcku_3/results.txt
|
table.txt: tab_small_xcvu_2/results.txt tab_small_xcvu_3/results.txt
|
||||||
table.txt: tab_small_xcvu_1/results.txt tab_small_xcvu_2/results.txt tab_small_xcvu_3/results.txt
|
table.txt: tab_small_xckup_2/results.txt tab_small_xckup_3/results.txt
|
||||||
|
table.txt: tab_small_xcvup_2/results.txt tab_small_xcvup_3/results.txt
|
||||||
|
|
||||||
table.txt:
|
table.txt:
|
||||||
bash table.sh > table.txt
|
bash table.sh > table.txt
|
||||||
|
|
|
@ -13,6 +13,8 @@ do
|
||||||
xc7v) d="Xilinx Virtex-7T" ;;
|
xc7v) d="Xilinx Virtex-7T" ;;
|
||||||
xcku) d="Xilinx Kintex UltraScale" ;;
|
xcku) d="Xilinx Kintex UltraScale" ;;
|
||||||
xcvu) d="Xilinx Virtex UltraScale" ;;
|
xcvu) d="Xilinx Virtex UltraScale" ;;
|
||||||
|
xckup) d="Xilinx Kintex UltraScale+" ;;
|
||||||
|
xcvup) d="Xilinx Virtex UltraScale+" ;;
|
||||||
esac
|
esac
|
||||||
speedtxt=$( printf '%s.%s ns (%d MHz)' ${speed%?} ${speed#?} $((10000 / speed)) )
|
speedtxt=$( printf '%s.%s ns (%d MHz)' ${speed%?} ${speed#?} $((10000 / speed)) )
|
||||||
printf '| %-25s | %-10s | %20s |\n' "$d" "-$grade" "$speedtxt"
|
printf '| %-25s | %-10s | %20s |\n' "$d" "-$grade" "$speedtxt"
|
||||||
|
|
|
@ -8,7 +8,7 @@ mkdir -p tab_${ip}_${dev}_${grade}
|
||||||
cd tab_${ip}_${dev}_${grade}
|
cd tab_${ip}_${dev}_${grade}
|
||||||
|
|
||||||
best_speed=99
|
best_speed=99
|
||||||
speed=30
|
speed=20
|
||||||
step=16
|
step=16
|
||||||
|
|
||||||
synth_case() {
|
synth_case() {
|
||||||
|
@ -18,17 +18,12 @@ synth_case() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "${dev}" in
|
case "${dev}" in
|
||||||
xc7a) xl_device="xc7a15t-fgg484-${grade}" ;;
|
|
||||||
xc7k) xl_device="xc7k70t-fbg676-${grade}" ;;
|
xc7k) xl_device="xc7k70t-fbg676-${grade}" ;;
|
||||||
xc7v) xl_device="xc7v585t-ffg1761-${grade}" ;;
|
xc7v) xl_device="xc7v585t-ffg1761-${grade}" ;;
|
||||||
xcku) xl_device="xcku035-fbva676-${grade}" ;;
|
xcku) xl_device="xcku035-fbva676-${grade}-e" ;;
|
||||||
xcvu) xl_device="xcvu065-ffvc1517-${grade}" ;;
|
xcvu) xl_device="xcvu065-ffvc1517-${grade}-e" ;;
|
||||||
esac
|
xckup) xl_device="xcku3p-ffva676-${grade}-e" ;;
|
||||||
|
xcvup) xl_device="xcvu3p-ffvc1517-${grade}-e" ;;
|
||||||
case "${dev}-${grade}" in
|
|
||||||
xcku-1) xl_device="${xl_device}-c" ;;
|
|
||||||
xcvu-1) xl_device="${xl_device}-i" ;;
|
|
||||||
xcku-?|xcvu-?) xl_device="${xl_device}-e" ;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
cat > test_${1}.tcl <<- EOT
|
cat > test_${1}.tcl <<- EOT
|
||||||
|
@ -60,19 +55,24 @@ synth_case() {
|
||||||
mv test_${1}.log test_${1}.txt
|
mv test_${1}.log test_${1}.txt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
got_violated=false
|
||||||
|
got_met=false
|
||||||
|
|
||||||
countdown=2
|
countdown=2
|
||||||
while [ $countdown -gt 0 ]; do
|
while [ $countdown -gt 0 ]; do
|
||||||
synth_case $speed
|
synth_case $speed
|
||||||
|
|
||||||
if grep -q '^Slack.*(VIOLATED)' test_${speed}.txt; then
|
if grep -q '^Slack.*(VIOLATED)' test_${speed}.txt; then
|
||||||
echo " tab_${ip}_${dev}_${grade}/test_${speed} VIOLATED"
|
echo " tab_${ip}_${dev}_${grade}/test_${speed} VIOLATED"
|
||||||
[ $speed -eq 38 ] || step=$((step / 2))
|
step=$((step / 2))
|
||||||
speed=$((speed + step))
|
speed=$((speed + step))
|
||||||
|
got_violated=true
|
||||||
elif grep -q '^Slack.*(MET)' test_${speed}.txt; then
|
elif grep -q '^Slack.*(MET)' test_${speed}.txt; then
|
||||||
echo " tab_${ip}_${dev}_${grade}/test_${speed} MET"
|
echo " tab_${ip}_${dev}_${grade}/test_${speed} MET"
|
||||||
[ $speed -lt $best_speed ] && best_speed=$speed
|
[ $speed -lt $best_speed ] && best_speed=$speed
|
||||||
step=$((step / 2))
|
step=$((step / 2))
|
||||||
speed=$((speed - step))
|
speed=$((speed - step))
|
||||||
|
got_met=true
|
||||||
else
|
else
|
||||||
echo "ERROR: No slack line found in $PWD/test_${speed}.txt!"
|
echo "ERROR: No slack line found in $PWD/test_${speed}.txt!"
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -85,6 +85,17 @@ while [ $countdown -gt 0 ]; do
|
||||||
fi
|
fi
|
||||||
done
|
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 "-----------------------"
|
||||||
echo "Best speed for tab_${ip}_${dev}_${grade}: $best_speed"
|
echo "Best speed for tab_${ip}_${dev}_${grade}: $best_speed"
|
||||||
echo "-----------------------"
|
echo "-----------------------"
|
||||||
|
|
Loading…
Reference in New Issue