A team once shipped boards with a “functional test passed” stamp because a bootloader printed a friendly UART banner. The string matched, the fixture lit green, and the schedule looked less terrifying. Then early units started coming back with random resets—about 6% early-life failures in the first few thousand—right when the product needed credibility. On the bench, the boards seemed fine until real activity hit: a BLE transmit burst pulled on the power system and a 1.8 V rail sag showed up plainly on a scope trace. The root cause wasn’t mysterious firmware behavior. It was an assembly reality: a substituted inductor with a similar top-mark but different saturation behavior, plus a test that never stressed the rail.
That escape isn’t just a technical miss; it’s a social failure wearing a technical costume. Once a report says “functional PASS,” other people hear “features validated,” and the organization starts making ship decisions with a false map.
Functional is not a synonym for “it prints something.”
Scope First: A Test That Lies by Accident Still Lies
When firmware is late or unstable, early tests need to behave like what they are: assembly-defect detectors and hardware baselines. Calling them “functional” is how teams accidentally certify behavior they never exercised.
Here lies the “functional test” label trap. Someone says, “we need a functional test without firmware,” and what they usually mean is “we need a way to keep the line moving without turning manufacturing into a firmware lab.” Those are different goals. The first phrasing invites a sloppy PASS/FAIL stamp. The second invites a scoped test with explicit claims and explicit non-claims, which keeps arguments from looping in build reviews. It also keeps dashboards honest when leadership asks for pass rates and someone tries to equate automation with quality.
To prevent scope drift, force every early test plan to answer two questions in writing: what defects does this catch, and what product behaviors does this not certify. Some teams formalize it as a two-column signoff artifact during DVT-to-PVT handoff, because memory does not survive schedule pressure.
| Category | The test can claim this | The test must not claim this |
|---|---|---|
| Early assembly screening | Detects assembly defects consistent with defined measurements (rails/clock/reset/continuity/one or two analog truths) | Certifies customer-visible features, performance across conditions, safety/compliance, or “works” in a broad sense |
| Firmware-assisted later | Validates specific behaviors tied to a versioned, reproducible test image and requirements trace | Implies coverage outside the enabled feature flags or outside the test conditions |
A pro audience does not need a definition of JTAG, SWD, UART, I2C, or SPI here. The useful work is deciding what can be measured deterministically today, and how those measurements get named and carried forward so nobody weaponizes a green light.
Measurement-First Baseline: Rails, Then Clocks/Resets, Then One Analog Truth
A baseline doesn’t mean adding “more tests.” It means establishing a small set of invariants—5 to 8 is usually enough—that a board must satisfy before any firmware symptom is worth debating. Rails and clocks are the classic invariants because they are preconditions for everything else, and they are hard to argue with when captured on instruments instead of in logs.
This shows up in the “late firmware excuse that hid a clock problem” pattern. In one case, boards booted sometimes and hung other times, and “firmware is unstable” became the default explanation. The fix started by removing the variability: repeat the same experiment across 50 power cycles, measure oscillator startup and reset timing, and stop treating inconsistent logs as evidence. The clock source had marginal startup in cold conditions because of a load capacitor choice that was “close enough” on paper. Once that was measured and corrected, the firmware stopped looking flaky. The win wasn’t a better log format; it was a waveform and a repeatability discipline.
The baseline’s first priority is power rails, because if the rails are wrong, every other symptom lies. That means measuring more than “it boots so power is fine.” It means rail nominal voltages, sequencing relative to enables and reset, ripple/noise with a known bandwidth and decent probe technique, and a deliberate stress that approximates a worst-case transient. A Tektronix MDO3000 series scope and a bench supply like a Keysight E36313A can do a lot of this without ceremony, and a calibrated DMM like a Fluke 87V catches the boring lies fast.
The “PASS stamp that cost a quarter” story is a good reason to treat transient load response as non-optional. A UART banner compare can pass on a marginal rail because boot is a low-stress event compared to radios, motors, or sensors pulling current in bursts. A 10-second scripted load step, or any repeatable step that approximates a real current transient, is a cheap way to flush out substituted inductors, wrong-value capacitors, or a regulator that is barely stable. Without that stress, the test checks only that the board is quiet, not that it is healthy.
At this point the I2C scan trap tends to appear: “our i2c scan shows devices so hardware is good.” An enumeration can still pass with the wrong pull-up value, a marginal rail feeding a level shifter, a cold joint that opens under vibration, or a clock that starts slowly enough to scramble timing once in ten boots. It can also pass while an analog reference is off-grade, because digital comms remain perfect right up until the measurements drift in the field. An I2C scan is a useful smoke check, but it is not evidence of a stable power and timing foundation.
A baseline that is meant to survive firmware churn needs at least one concrete threshold example, because vagueness is how “measurement” turns into vibes. An example, not a universal rule: a 1.8 V rail might be required to stay within ±5% steady-state, and under a defined load step (e.g., approximating the expected radio burst), the droop might be limited to <100 mV with recovery within a short window. That window could be sub-millisecond or several milliseconds depending on the regulator, the load profile, and what downstream ICs can tolerate. This is where the uncertainty boundary matters: ripple and droop thresholds depend on the specific regulator compensation, the probing bandwidth, the physical loop area of the probe, and the actual transient shape. The way to make the threshold honest is to validate it on a golden unit and then on a known-bad unit (or an induced fault) to confirm the measurement discriminates between “healthy” and “about to create an RMA queue.”
The baseline should also include a small analog sanity set on mixed-signal boards, because skipping analog is how teams ship “works on my bench” disasters. The classic failure is subtle and expensive: the digital interface is perfect, values look reasonable at room temperature, and then field readings drift with temperature or supply variation. In one sensor program, the cause was a shortage-driven substitution: a 2.048 V reference stuffed with the wrong tolerance grade, one character different in the part number. Firmware tried to paper over the drift with compensation tables until someone measured the reference pin and looked at ADC code distribution with a fixed input. The fix was BOM control and a single reference measurement in early test with a tight enough threshold to catch substitutions. Calibration cannot fix a swapped component family; it can only decorate the failure until it escapes.
Clocks and resets deserve a baseline spot for the same reason rails do: they create lies if they are marginal. A simple habit—capture reset deassertion timing and oscillator startup across dozens of power cycles—turns “random hang” into a reproducible system. It also keeps cross-time-zone teams from turning every intermittent into a Slack argument about who broke what overnight.
Prove the Fixture Before Blaming the Boards (Golden-First Discipline)
Intermittent failures often have a mechanical origin, and a production fixture is a mechanical system with electrical side effects. Treating fixture results as ground truth without proving the fixture is how teams waste days on rework that never had a chance to help.
A bed-of-nails fixture once started failing boards that had previously passed bench bring-up. Symptoms were inconsistent, which made “firmware instability” an easy scapegoat. The faster move was to run a known-good golden board through the fixture and compare contact resistance across pogo pins. The golden failed too. That immediately shifted the blame away from the design and toward the test infrastructure. The culprit was not subtle: a connector housing on the fixture was out of tolerance, shifting alignment so two pogo pins barely touched. Replace the connector, and the failure pattern vanished. After that, a fixture self-test step became non-negotiable.
Use this decision tree to prevent most early chaos:
- If the golden unit fails on the fixture: Stop touching DUTs. Check pogo pin contact resistance, connector alignment, instrument calibration state, and fixture wiring before any board-level debug.
- If the golden unit passes but a DUT fails: Proceed with board diagnosis using the baseline measurements. Log serial number, board revision, fixture ID, and ambient conditions so the failure can be compared, not re-enacted from memory.
The phrase “random failures on the fixture” should be treated as a request to prove the fixture, not a request for more firmware logs. That single habit changes the tone of late-night cross-site debugging because it narrows the search space immediately.
Defect-Class Coverage: A Small Fault-Model Ladder Beats “Complete Test Suite” Theater
A productive early test strategy isn’t the one with the longest checklist. It’s the one that catches the most likely defect classes with the cheapest reliable measurements, while making deferrals explicit so they cannot be smuggled into a green stamp.
A fault-model ladder starts by enumerating defect classes that actually show up in contract builds: opens, shorts, wrong part, wrong orientation, missing part, solder bridges, and mechanical misalignment. Then it maps each class to a detection method that does not require stable application firmware: AOI for gross placement and polarity mistakes, continuity checks where access exists, rail signatures and load response for substitutions and missing passives, and boundary-scan where chains and access are real. The ladder’s value is not theoretical coverage, but the ability to say, out loud and in writing, “this test catches opens/shorts on these nets, but it does not validate feature X.”
This also addresses the “let’s fully automate production tests now” pressure. Automation is not progress if it automates noise. Proving fixture repeatability, defining invariants, and choosing defect-class tests that will still mean the same thing next week is progress. Everything else is dashboard theater.
Deferral needs a defense line because people equate “not tested” with negligence. The better framing is that deferrals are intentional risk decisions: deferred because access is missing, because firmware is too volatile, or because the defect class is rare relative to the current schedule and build context. The point is to stop those deferrals from turning into implied claims.
Boundary-Scan: Deterministic Evidence, When the Hardware Allows It
Boundary-scan is the least glamorous, highest-leverage tool in this situation, because it can provide deterministic coverage for opens and shorts on fine-pitch parts without needing application firmware. It also collapses debates. If the chain can run interconnect tests and a net shows an open, there is no argument about whether a firmware timing tweak will fix it.
In one case with intermittent bus failures, a cheap logic analyzer made the bus look “mostly fine,” which kept the blame aimed at firmware timing. Boundary-scan interconnect tests isolated an open on a BGA address pin—likely a cold joint—without waiting for more logs or more code. That avoided an expensive X-ray rework loop and turned rework into a targeted action with quantitative verification. Coordination across Everett and a CM team in Penang became simpler because the evidence was deterministic.
The reality check matters: boundary-scan only works if access is real. Chain continuity needs to be designed in, BSDLs need to be usable, pull-ups and strapping need to be sane, and security settings are not “later problems”—fused debug access is a hard constraint. The common wishful request is “can boundary scan test everything,” often paired with “no test pads but it should still be doable.” The honest answer is that feasibility depends on chain access, BSDL quality, and lock-down state; promising a coverage percentage without those facts is how test plans turn into fiction.
A practical compromise that keeps teams from spinning is to pilot boundary-scan on one board with the intended fixture access and toolchain (Corelis/Asset/Keysight-class suites are common in factories). If it works, it can replace days of debate in every future failure analysis. If it does not, the plan should pivot immediately back to rails, clocks, resets, and a small analog signature set—things that can still be measured through available connectors and pads.
The Harness That Survives: Minimal Now, Deeper Later
Early tests tend to die because they are brittle, undocumented, or bound to one person’s tool preferences. A minimal harness that survives is boring by design: a runner, a board-specific pin map, a threshold set, and logging that makes reruns comparable.
A pattern that has lasted through multiple firmware rewrites is a three-layer harness: stimulus/measurement abstraction (instrument drivers via something like pyvisa or a DAQ layer), a board map (often a YAML pin map is enough), and test cases that stay deterministic. Logging to CSV keyed by serial number can be plenty early, as long as metadata is disciplined: board revision, fixture ID, ambient conditions, and test image version when firmware is involved. The language choice (Python vs LabVIEW vs vendor environments) matters less than the modular boundary. A monolithic LabVIEW VI that only one person can edit becomes a staffing risk rather than a test strategy.
There is also a subtle uncertainty that belongs in the harness conversation: current-profile signatures. They are powerful when firmware states are stable. When firmware churns daily, current thresholds should be treated as trend/anomaly detection, not hard pass/fail, unless the team can lock a versioned test image with controlled feature flags and reproducibility.
The handoff point is straightforward: early tests can expand their claims as firmware matures, but only if the harness keeps the measurement layer trusted and the naming stays honest. Early screening reduces assembly escapes. It does not certify product behavior.






