Back to resources
HIL
Testing
Firmware

Meet the BenchPod: A Networked Instrument for Hardware CI

The BenchPod folds power control, flashing, a logic analyzer, and a 16-bit analog front-end into one networked box — so the hardware your tests need stops being the thing that lives on one engineer's desk.

Edward Viaene · June 5, 2026 · 4 min read

Embedded teams end up with a bench full of equipment that is hard to share, hard to automate, and difficult to use remotely. A power supply, a logic analyzer, a debug probe, a UART adapter, maybe a scope and a signal generator — each with its own cables, its own quirks, and a physical location that is almost always not where your CI runner lives. The moment a test needs real hardware, it stops being something CI can do and becomes something a person has to do at the bench.

The BenchPod is our answer to that problem: a single networked box that collapses the instruments around a device-under-test (DUT) into one device your tests can drive over the network.

A BenchPod wired to a development board as the device-under-test
A BenchPod wired to a development board as the device-under-test

What it does

A BenchPod sits between your CI and a target board and exposes the operations a hardware test actually needs:

  • Programmable power control — switch the target on and off, power-cycle it, schedule a delayed power-on, and monitor current and voltage per rail. Power is gated through electronic eFuses, so a misbehaving DUT can't take the bench down with it.
  • Flashing over SWD — the pod is itself a network-attached debug probe. It drives an OpenOCD backend through the pod to flash and debug an SWD target, so swapping stm32f4x.cfg for stm32h7x.cfg or nrf52.cfg is all it takes to support a different board.
  • UART capture and console — sample the DUT's serial output to assert on its boot banner, or hold an interactive console session and drive the firmware's command interface live.
  • A logic analyzer with 12 bidirectional channels — observe and drive GPIO, and decode bus traffic (I2C today) so you can assert what the firmware actually did on the wire, not just that it booted.
  • Sensor emulation — the pod can pretend to be an I2C sensor (a BMP280) on two channels while you capture UART, so you can test how firmware behaves with and without a peripheral present, without soldering anything.
  • A 16-bit analog front-end — a 1 MSPS ADC with a ±30 V input range and a 16-bit DAC, with an on-board calibration relay so the pod can validate its own DAC-to-ADC path. That turns the pod into a programmable signal source and a measurement instrument, not just a digital tool.

Everything is reachable over the network from a JSON API, a Python SDK with a pytest plugin, an MCP server for AI agents, and the EmbeddedCI cloud.

What's inside

The v2.0.0 BenchPod is a two-(plus)-chip design that keeps the timing-critical work close to the hardware:

  • An STM32H563 microcontroller runs the firmware: networking (native Ethernet via an on-board PHY, plus Wi-Fi through an ESP32-C3 acting as a dumb NIC), the command server, and the orchestration logic.
  • An iCE40 UltraPlus FPGA with 8 MB of PSRAM owns the fast, deterministic work: logic-analyzer capture, ADC/DAC streaming, and the SWD bit-banging used for flashing. The microcontroller sends high-level commands ("capture 4096 samples", "flash this target", "drive the DAC"); the FPGA does it at the sample-rate clock without the CPU in the loop.

The first generation ran on an RP2350 paired with the same FPGA approach; v2 moved to the STM32 for its Ethernet MAC and SPI bandwidth while keeping the same board footprint and the same clean split: the MCU does protocol and policy, the FPGA does timing.

Why a box, and not a rack

You could build all of this from separate instruments. Plenty of teams have. The difference is what happens next:

  • It's shareable. The pod connects out to the network, so the bench in one office can be driven by a runner — or an engineer — anywhere. The hardware stops being tied to one desk.
  • It's automatable. Every operation is an API call, which means it's a test step. There's no GUI to click and no instrument to manually arm.
  • It's reproducible. Power sequencing, flashing, and capture happen the same way every run, because the pod does them — not a human remembering the order.

That's the whole point of the BenchPod: take the parts of embedded testing that only work on real hardware, and make them as easy to put in CI as a unit test. For the practical version of that — wiring a DUT, flashing it, and asserting on UART from pytest — see Why Hardware CI Needs Real Devices and Running Hardware CI with GitHub Actions.