Hardware bring-up trees for on-device netkit builds and peer A/B benches.
Software targets without a board tree yet use the library API +
docs/PLATFORMS.md and host smoke
(make test-embedded-smoke-matrix).
Espressif note: C3 / C6 / P4 are RISC-V silicon but always use mcu_esp +
ESP-NN (same as S3). mcu_risc is only for non-Espressif RISC-V + NMSIS-NN.
Several Espressif boards can coexist — each boards/… tree pins its own
NETKIT_ARCH. Details: PLATFORMS.md — Target ≠ CPU ISA.
| Hardware | Class | netkit target | Status |
|---|---|---|---|
| STM32 NUCLEO-F446RE | Arm MCU | mcu_arm + NETKIT_ARCH=CM4 |
Peer-benched (CMSIS-NN / reference vs TFLM / microTVM) |
| Seeed XIAO ESP32C3 | Espressif MCU (RISC-V → still mcu_esp) |
mcu_esp + NETKIT_ARCH=ESP32C3 |
Peer-benched int8 CNN / DS-CNN vs TFLM (ESP-NN); MLP firmware too |
| Seeed XIAO ESP32-S3 | Espressif MCU (Xtensa) | mcu_esp + NETKIT_ARCH=ESP32S3 |
Peer-benched int8 + float32 CNN / DS-CNN vs TFLM (ESP-NN S3 asm) |
| ESP32-P4-Function-EV | Espressif MCU (RISC-V → still mcu_esp) |
mcu_esp + NETKIT_ARCH=ESP32P4 |
Peer-benched int8 + float32 CNN / DS-CNN vs TFLM |
| Raspberry Pi Zero 2 W | Arm MPU | mpu_arm |
Peer-benched (XNNPACK ON/OFF vs TF Lite) |
| Other Espressif ESP32* | MCU | mcu_esp + matching NETKIT_ARCH |
Runtime + host smoke; add a boards/… tree per board — PLATFORMS.md |
| RISC-V MCU (Nuclei / RV32) | MCU | mcu_risc |
Runtime + host smoke; no boards/ tree yet — PLATFORMS.md |
Canonical latency tables: ../README.md, docs/STATUS.md. Open issues: docs/KNOWN_ISSUES.md.
Chip: STM32F446RET6 · Cortex-M4F · 180 MHz · 512 KiB flash / 128 KiB SRAM
Toolchain / flash: each board README covers make, OpenOCD / ST-Link, UART capture.
| Board directory | Model / dtype | Setup & build |
|---|---|---|
nucleo-f446re/ |
MNIST MLP float32 | CMSIS-NN / reference, lowered AOT |
nucleo-f446re-mlp-int8/ |
MNIST MLP int8 | CMSIS-NN, interpreter embed |
nucleo-f446re-cnn-int8/ |
MNIST CNN int8 | CMSIS-NN / reference; lowered or NETKIT_EMBED=1 |
nucleo-f446re-cnn-dw-int8/ |
MNIST DS-CNN int8 | Same pattern as CNN int8 |
Typical flow (see the board README for flags):
cd boards/nucleo-f446re-cnn-int8
make # or: make deploy-lowered / NETKIT_EMBED=1
make flash # ST-Link
# UART capture — details in that READMERepo-root helper for CNN int8: make flash-mnist-cnn-int8.
| Board directory | Stack |
|---|---|
nucleo-f446re-tflm/ |
TFLM MNIST MLP f32 |
nucleo-f446re-tflm-mlp-int8/ |
TFLM MNIST MLP int8 |
nucleo-f446re-tflm-cnn-int8/ |
TFLM MNIST CNN int8 |
nucleo-f446re-tflm-cnn-dw-int8/ |
TFLM MNIST DS-CNN int8 |
nucleo-f446re-tvm-cnn-int8/ |
microTVM AOT CNN int8 |
nucleo-f446re-tvm-cnn-dw-int8/ |
microTVM AOT DS-CNN int8 |
Logs: benchmark/mcu_ab_logs/.
Float32 MNIST CNN / DS-CNN exceed 512 KiB flash on this part — on-device digit peers for those models are int8 only (STATUS.md).
Chip: ESP32-C3 · RISC-V · 160 MHz · ~400 KB SRAM / 4 MB flash
netkit: NETKIT_TARGET=mcu_esp + NETKIT_ARCH=ESP32C3 + ESP-NN (not NMSIS-NN)
Toolchain / flash: PlatformIO ESP-IDF · onboard USB Serial/JTAG
Index: xiao-esp32c3/README.md
| Board directory | Runtime | Model |
|---|---|---|
xiao-esp32c3-mlp-int8/ |
netkit | MNIST MLP int8 |
xiao-esp32c3-cnn-int8/ |
netkit | MNIST CNN int8 |
xiao-esp32c3-cnn-dw-int8/ |
netkit | MNIST DS-CNN int8 |
xiao-esp32c3-tflm-cnn-int8/ |
TFLM | MNIST CNN int8 |
xiao-esp32c3-tflm-cnn-dw-int8/ |
TFLM | MNIST DS-CNN int8 |
Methodology: 10×10, discard first invoke; order swaps nk→tflm / tflm→nk; netkit = interpreter embed.
Results: ESP-NN · reference · STATUS.
Runners: run_esp_int8_ab.sh / run_esp_int8_ref_ab.sh.
ImageNet / MobileNetV4: not on this part (weights exceed 1 MiB app partition). Int8 only (no FPU — float32 peer firmwares not used).
PORT=/dev/cu.usbmodem* ./boards/xiao-esp32c3/scripts/run_esp_int8_ab.sh
PORT=/dev/cu.usbmodem* ./boards/xiao-esp32c3/scripts/run_esp_int8_ref_ab.shChip: ESP32-P4 · RISC-V · 360 MHz · FPU · companion ESP32-C6 on kit is WiFi-only
netkit: NETKIT_TARGET=mcu_esp + NETKIT_ARCH=ESP32P4 + ESP-NN (portable; PIE asm off under PIO gas)
Toolchain / flash: PlatformIO ESP-IDF · USB-UART (CH34x)
Index: esp32-p4-function-ev/README.md
| Board directory | Runtime | Model |
|---|---|---|
esp32-p4-function-ev-cnn-int8/ |
netkit | MNIST CNN int8 (embed) |
esp32-p4-function-ev-cnn-dw-int8/ |
netkit | MNIST DS-CNN int8 (embed) |
esp32-p4-function-ev-tflm-cnn-int8/ |
TFLM | MNIST CNN int8 |
esp32-p4-function-ev-tflm-cnn-dw-int8/ |
TFLM | MNIST DS-CNN int8 |
esp32-p4-function-ev-cnn/ |
netkit | MNIST CNN float32 (lowered AOT) |
esp32-p4-function-ev-cnn-dw/ |
netkit | MNIST DS-CNN float32 (lowered AOT) |
esp32-p4-function-ev-tflm-cnn/ |
TFLM | MNIST CNN float32 |
esp32-p4-function-ev-tflm-cnn-dw/ |
TFLM | MNIST DS-CNN float32 |
Methodology: 10×10, discard first invoke; order swaps. Results: all rounds · STATUS · float embed bug (P4 and S3): KNOWN_ISSUES KI-001.
PORT=/dev/cu.usbmodem* ./boards/esp32-p4-function-ev/scripts/run_esp_int8_ab.sh
PORT=/dev/cu.usbmodem* ./boards/esp32-p4-function-ev/scripts/run_esp_int8_ref_ab.sh
PORT=/dev/cu.usbmodem* ./boards/esp32-p4-function-ev/scripts/run_esp_float32_ab.shChip: ESP32-S3 · Xtensa · 240 MHz · FPU · bring-up unit: 16 MB PSRAM / 32 MB OPI flash
netkit: NETKIT_TARGET=mcu_esp + NETKIT_ARCH=ESP32S3 + ESP-NN S3 asm
Toolchain / flash: PlatformIO ESP-IDF · USB Serial/JTAG — prefer OpenOCD (board/esp32s3-builtin.cfg)
Index: xiao-esp32s3/README.md
| Board directory | Runtime | Model |
|---|---|---|
xiao-esp32s3-cnn-int8/ |
netkit | MNIST CNN int8 (embed) |
xiao-esp32s3-cnn-dw-int8/ |
netkit | MNIST DS-CNN int8 (embed) |
xiao-esp32s3-tflm-cnn-int8/ |
TFLM | MNIST CNN int8 |
xiao-esp32s3-tflm-cnn-dw-int8/ |
TFLM | MNIST DS-CNN int8 |
xiao-esp32s3-cnn/ |
netkit | MNIST CNN float32 (lowered AOT) |
xiao-esp32s3-cnn-dw/ |
netkit | MNIST DS-CNN float32 (lowered AOT) |
xiao-esp32s3-tflm-cnn/ |
TFLM | MNIST CNN float32 |
xiao-esp32s3-tflm-cnn-dw/ |
TFLM | MNIST DS-CNN float32 |
Methodology: 10×10, discard first invoke. Results: all rounds · STATUS · float embed bug (S3 and P4): KNOWN_ISSUES KI-001.
Chip: ESP32-C6 · RISC-V · 160 MHz · no FPU (int8 peers only)
netkit: NETKIT_TARGET=mcu_esp + NETKIT_ARCH=ESP32C6 + ESP-NN
Status: Peer A/B not published yet. Same pattern as C3 when brought up. Published Espressif numbers: C3 / S3 / P4 above.
ISA: linux/aarch64 (Cortex-A53) · netkit: NETKIT_TARGET=mpu_arm + XNNPACK
No bare-metal firmware tree — cross-build on the host (Docker linux/arm64), deploy over SSH.
Setup / rebuild / run A/B: pi-zero-2w/README.md
Covers prerequisites, tools/build_mpu_pi_aarch64.sh, SSH helpers, and float32 + int8 suites vs TF Lite (XNNPACK ON/OFF).
| Target | How to build / integrate |
|---|---|
mcu_esp (ESP-NN) |
Board: xiao-esp32c3-mlp-int8 · PLATFORMS.md — Espressif · make esp-nn-init |
mcu_risc (NMSIS-NN) |
PLATFORMS.md — RISC-V MCU · make nmsis-init · link into your RISC-V BSP |
mpu_risc |
PLATFORMS.md — RISC-V MPU · XNNPACK like other MPUs |
Host cpu |
Getting Started |
Host lean-runtime smoke for MCU/MPU profiles (including CMSIS / ESP-NN / NMSIS-NN):
make cmsis-init esp-nn-init nmsis-init
make test-embedded-smoke-matrix- docs/PLATFORMS.md —
NETKIT_TARGET/NETKIT_ARCH/ fetch / CMake for every profile - docs/BUILD_TARGETS.md — arena and backend flags
- docs/ARENA.md — MCU static arena / no-heap rules
- THIRD_PARTY_NOTICES.md — CMSIS / TFLM / TVM / … licenses