Allocate behaviour and timing
Functions should be allocated across hardware, firmware, control logic and external services with explicit timing, resource and failure assumptions.
- Define modes, states and transitions.
- Budget execution time, memory, power and bandwidth.
- Specify signal ranges, update rates and diagnostics.
- Identify startup, shutdown and degraded behaviour.
Verify interfaces and real-time behaviour
Unit tests alone cannot establish system behaviour. Hardware-in-the-loop, timing measurement, fault injection and communication testing expose interactions that software-only testing misses.
- Trace tests to system and software requirements.
- Exercise nominal, boundary and invalid inputs.
- Measure latency, jitter and deadline behaviour.
- Test reset, communication loss and recovery.
Integrate secure development practices
Security activities belong inside the development lifecycle: protecting the development environment, reviewing dependencies, finding vulnerabilities and preparing response capability.
- Control source, build and release provenance.
- Review third-party components and update paths.
- Protect secrets and debug interfaces.
- Design logging and vulnerability response before release.
Release a reproducible system configuration
The released product is a specific combination of hardware revision, bootloader, firmware, parameters and manufacturing data. Evidence is meaningful only when tied to that configuration.
- Record toolchain and build configuration.
- Bind firmware to compatible hardware revisions.
- Version calibration and production parameters.
- Retain verification results and known limitations.
Apply the method to the decision—not as a checklist.
The appropriate evidence depends on intended use, technical risk, operating environment, contractual obligations and the authority responsible for acceptance. This guide is educational and does not replace project-specific analysis, applicable standards or independent review.
