Skip to content

Check the build

# run from: the repo root
./devkit verify                                   # modern: is the build sane?
./devkit verify --board                           # ...and is the board running it?
./devkit verify --target factory                  # factory: is the build sane?
./devkit verify --target factory --board          # ...and is the board running it?
./devkit verify --target factory --require-board  # the same, but FAIL if the board is stale or unreadable
It checks Why
the five files are present and not trivially small
the bitstream is compressed an uncompressed one overflows the FSBL's on-chip memory and BOOT.bin silently fails to boot
timing is met, and what is in the design (DSP48s, LUTs)
(modern) firmware-modern/verify_dtb.py audits the built device tree, 16 checks device-tree mistakes usually build and boot
--board: every file on the card against output/, by checksum a card holding a different build of the same size looks entirely normal

You should see (factory target), among the rest:

== bitstream ==
  PASS  compressed (2371856 B < 3.9 MB uncompressed)
== timing ==
  PASS  no failing setup endpoints
        WNS 0.215 ns over 54211 endpoints

--board reports, it does not fail

It reports without changing the exit status. Use --require-board in a script that must fail on a stale card.

Timing reports gone after an import

Importing an XSA deletes timing.rpt and utilization.rpt, so verify says timing is not available. On a tree that was built from source with Vivado, regenerate them in about a minute:

# run from: the repo root
cat > firmware/src/hdl/projects/pluto/regen.tcl <<'EOF'
open_project pluto.xpr
open_run impl_1
report_utilization -file utilization.rpt
report_timing_summary -file timing.rpt
EOF
./devkit container shell -c "source tools/env-vivado.sh && cd firmware/src/hdl/projects/pluto \
    && vivado -mode batch -nojournal -nolog -source regen.tcl"

Next: put it on the board.