diff --git a/bench/t/gdbfpga b/bench/t/gdbfpga
new file mode 100644
index 0000000000000000000000000000000000000000..fb78314f9c109314c9cb95d8af8194150e5e0505
--- /dev/null
+++ b/bench/t/gdbfpga
@@ -0,0 +1,6 @@
+set pagination off
+tar remote :3333
+load
+break _exit
+c
+quit
diff --git a/bench/t/run-all.sh b/bench/t/run-all.sh
new file mode 100755
index 0000000000000000000000000000000000000000..148cc6f7f9bac461f9f815d8cf54ae548dd3ca2e
--- /dev/null
+++ b/bench/t/run-all.sh
@@ -0,0 +1,90 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# Usage: ./run-all.sh <path to the program_cva6_fpga.tcl file> <serial port>
+
+BASEPATH=$(dirname "$0")
+BUILDPATH=$(dirname "$BASEPATH/../")
+
+KERNEL=(
+    binarysearch
+    bitcount
+    bitonic
+    bsort
+    complex_updates
+    cosf
+    countnegative
+    cubic
+    deg2rad
+    fac
+    fft
+    filterbank
+    fir2dim
+    iir
+    insertsort
+    isqrt
+    jfdctint
+    lms
+    ludcmp
+    matrix1
+    md5
+    minver
+    pm
+    prime
+    quicksort
+    rad2deg
+    recursion
+    sha
+    st
+)
+
+SEQUENTIAL=(
+    adpcm_dec
+    adpcm_enc
+    ammunition
+    anagram
+    audiobeam
+    cjpeg_transupp
+    cjpeg_wrbmp
+    dijkstra
+    epic
+    fmref
+    g723_enc
+    gsm_dec
+    gsm_enc
+    h264_dec
+    huff_dec
+    huff_enc
+    ndes
+    petrinet
+    rijndael_dec
+    rijndael_enc
+    statemate
+)
+
+run () {
+    bench="$BUILDPATH/build/artifacts/$1.riscv"
+    echo "$1 $bench"
+    if [ ! -f "$bench" ]; then
+        echo "warning: $bench does not exists."
+    else
+        xsct "$2"/program_cva6_fpga.tcl
+        openocd -f ~/Documents/cva6/fpga/openocd_digilent_hs2.cfg &
+
+        riscv32-unknown-elf-gdb "$bench" -x "$BASEPATH/gdbfpga" -q
+        kill -TERM %1
+        wait
+    fi
+}
+
+screen -S "tacle-bench" -d -m -L -l -Logfile "tacle-bench.res" "$2" 115200
+
+for kern in "${KERNEL[@]}"; do
+   run "kernel/$kern" "$1"
+done
+
+for seq in "${SEQUENTIAL[@]}"; do
+   run "sequential/$seq" "$1"
+done
+
+screen -S "tacle-bench" -X quit