V-Model

V-Model

Definition: The V-Model is a sequential software process model that pairs every decomposition activity on the way down with a corresponding verification activity on the way up, arranged visually as a “V”. Requirements, system design, architecture, and module design descend the left arm; unit, integration, system, and acceptance testing ascend the right arm, with each test level planned at the same moment its matching design artifact is written. It is the Waterfall Model with a spine: instead of testing being a phase tacked onto the end, test design is a first-class output of every design phase.


How It Works

The V-Model rearranges the same phases a waterfall project would run, but the rearrangement carries real information. The left arm decomposes the problem, moving from the customer’s world into the machine’s world. The bottom is where abstraction stops and code exists. The right arm recomposes the system, moving back out from the machine’s world into the customer’s world, and at each step it asks whether the thing that was just assembled satisfies the document written at the matching level on the left.

The Descending Arm — Decomposition and Specification

Each level on the left produces two artifacts, not one: a specification, and a test plan for that specification.

1. Requirements analysis (user requirements). Elicit what the customer actually needs, expressed in the customer’s vocabulary, free of implementation commitment. Output is a user requirements specification. Simultaneously, the acceptance test plan is drafted — if a requirement cannot be turned into an acceptance criterion at this moment, it is not yet a requirement. That forcing function alone kills a large class of vague requirements before they cost anything. See Requirements Engineering.

2. System requirements (functional specification). Translate user needs into system behavior: interfaces, performance envelopes, error handling, operating modes, safety and security constraints. Output is a system requirements specification. Simultaneously, the system test plan is drafted, defining how the assembled system will be exercised against those behaviors in a representative environment.

3. Architectural design (high-level design). Decompose the system into subsystems and components, define their responsibilities, the interfaces between them, data flows, and cross-cutting concerns like concurrency, timing, and fault handling. Output is an architecture document. Simultaneously, the integration test plan is drafted — it is literally derived from the interface definitions, because integration testing tests interfaces, and this is the phase in which interfaces are invented.

4. Module design (low-level design). Specify each component’s internals: algorithms, data structures, state machines, pre- and post-conditions, error paths. Output is a detailed design document. Simultaneously, the unit test plan is drafted, with cases derived from the specified logic paths and boundary conditions rather than from code that does not exist yet.

The discipline is: you may not leave a design level until its test plan exists. Test planning moves left in the schedule. That is the entire idea.

Movement between levels is controlled by formal gate reviews, each with defined entry and exit criteria:

GateSits betweenExit criterion, in one line
System requirements reviewUser and system requirementsEvery user need is allocated to a system requirement and has draft acceptance criteria
Preliminary design reviewSystem requirements and architectureEvery system requirement is allocated to a component, and interfaces are frozen enough to test
Critical design reviewArchitecture and module designEvery component has a detailed design and an approved unit test plan
Test readiness reviewImplementation and each test levelThe build, the environment, the test cases, and the pass criteria all exist and are baselined

Gates are where the model earns or loses its reputation. Held honestly, they stop half-specified work from propagating downward. Held as status meetings where nobody is allowed to say “not ready”, they become the ceremony that gives the V-Model its bureaucratic reputation while delivering none of its benefit.

The Bottom — Implementation

Coding sits at the vertex. It is deliberately drawn as the narrowest part of the V, which is an honest statement about where effort goes in the systems this model was built for: in a certified avionics or medical device programme, writing the code is frequently a minority of total effort, dwarfed by specification, review, test, and evidence production. Implementation here is a translation step from the low-level design, not a place where design decisions get made. When a coder discovers a design decision that has to be made at the keyboard, the correct V-Model response is a change request that flows back up the left arm — not an ad-hoc fix.

The Ascending Arm — Integration and Verification

Each level on the right executes the plan written at the matching level on the left, and can only be signed off against that specific artifact.

1. Unit testing verifies each module against its low-level design. Scope is a single unit in isolation, with collaborators stubbed or mocked. Coverage targets (statement, branch, and in safety contexts MC/DC) are usually mandated here.

2. Integration testing verifies assembled components against the architectural design. Its subject matter is interfaces: parameter passing, protocol conformance, ordering, timing, resource sharing, and failure propagation across a boundary. Strategies vary — big-bang, top-down with stubs, bottom-up with drivers, or the far more common sandwich approach.

3. System testing verifies the complete, integrated system against the system requirements specification, in an environment representing the real one. Functional behavior, performance, security, robustness, recovery, and installation all live here.

4. Acceptance testing validates the system against the original user requirements, ideally executed by or with the customer, in the operational environment. This is the only level that asks whether the right product was built at all; every level below asks only whether it was built correctly.

The dotted horizontal lines between arms are the model’s actual payload. Each one is a traceability relation: a design artifact on the left, a test artifact on the right, and a bidirectional mapping between individual requirements and individual test cases. Two consequences follow.

Forward tracing answers: for this requirement, which tests demonstrate it? If a requirement has no test, it is unverifiable and the gap is visible before code exists. Backward tracing answers: for this test, which requirement justifies it? A test with no parent requirement is either scope creep or evidence of an unwritten requirement. Regulated industries require this matrix as a deliverable, and tooling (DOORS, Polarion, codebeamer, Jama) exists almost entirely to maintain it.


The Shape

The dotted edges run backwards in time relative to the solid ones: the plan is authored on the left long before it is executed on the right. Read the diagram as two columns and the V shape appears — descending specification on one side, ascending verification on the other, with each pair joined across the gap.

The same structure, grouped by which question each arm answers:


Level Pairing Table

Every row is a contract. The left column produces the middle column, and the right column consumes it.

Left-arm activityArtifact producedRight-arm counterpartWhat it proves
User requirements analysisUser requirements spec, acceptance criteriaAcceptance testingThe product solves the customer’s problem
System requirementsFunctional spec, interface list, non-functional budgetsSystem testingThe assembled system behaves as specified
Architectural designComponent decomposition, interface definitionsIntegration testingComponents interoperate across their interfaces
Module designDetailed design, algorithms, state machinesUnit testingEach module implements its detailed design
ImplementationSource code, build artifactsStatic analysis, code reviewThe code conforms to design and coding standards

A useful sanity check on any V-Model project: pick a random row, ask for both artifacts, and ask for the trace between them. If either is missing or the trace is hand-waved, the project is running a waterfall wearing a V-shaped costume.


Static Verification on the Left Arm

A common misreading is that the left arm contains no verification at all — that nothing is checked until code exists. False, and the mistake is expensive. Each descending level is verified against the level above it by static techniques, long before anything executes.

Left-arm phaseStatic verification appliedDefect class it catches
User requirementsStakeholder review, use-case walkthrough, testability checkAmbiguity, missing stakeholders, unverifiable wording
System requirementsRequirements inspection, consistency and completeness analysisContradictory requirements, unallocated needs, missing modes
Architectural designDesign review, interface consistency check, timing and resource budgetingInterface mismatches, unmet performance budgets, single points of failure
Module designDetailed design review, state-machine analysis, formal methods where warrantedUnreachable states, missing error paths, unhandled boundaries
ImplementationCode review, coding-standard conformance, static analysis, formal proofUndefined behavior, standard violations, latent runtime faults

Industry data behind the model is blunt: a requirements defect discovered at acceptance testing costs one to two orders of magnitude more to fix than the same defect caught in requirements review, because the fix invalidates every artifact produced between the two points. Static verification is the cheapest part of the entire V, and it is the part most often cut when the schedule slips — which is precisely backwards. See Code Review and Static Analysis for the code-level end of this spectrum.

The practical rule: a review is only verification if it compares two artifacts. Reading a design document and finding it agreeable is not a review. Reading a design document against the system requirements, item by item, and recording which requirements it fails to address, is.


Verification versus Validation

The distinction is not pedantry — it decides who signs off and against what.

Verification: “Are we building the product right?” Does the output of this phase conform to the specification that was its input? Verification is internal, objective, and comparative. It never questions whether the specification was a good idea. Unit, integration, and system testing are verification activities, as are design reviews, inspections, static analysis, and formal proofs.

Validation: “Are we building the right product?” Does the finished system satisfy the actual need in its actual operating environment? Validation is external and can only be settled by the stakeholders who own the need. Acceptance testing, user trials, clinical evaluation, field testing, and operational readiness reviews are validation activities.

AspectVerificationValidation
QuestionBuilt right?Built the right thing?
ReferenceThe preceding specificationThe real-world need
Performed byEngineering, QA, independent testCustomer, users, regulator, clinician
Typical timingThroughout the right armEnd of the right arm, plus field use
Failure meansA defect against the specThe spec itself was wrong
Cost to fixLocalized, usually a code or design changeSystemic, often a requirements change

The V-Model’s tragic flaw is visible in that last row. Verification failures are caught early and cheaply. Validation failures — the spec was wrong — are caught last, at maximum cost, when the entire left arm has to be reworked. A project can pass every verification gate flawlessly and still ship a product nobody wanted. This is precisely the failure mode that Iterative and Incremental Development and the Agile Manifesto were formulated to attack.


Why It Matters

  • Test design becomes a design review. Writing an acceptance test for a requirement forces the requirement to be concrete, observable, and falsifiable. Requirements that cannot be tested are exposed while they are still cheap sentences rather than expensive features.
  • Defects are found at the level they were introduced. An architecture error surfaces in integration testing, against the architecture document, not as a mysterious system-level symptom traced back through weeks of debugging.
  • Traceability is structural, not retrofitted. The requirements-to-test matrix falls out of the process rather than being reconstructed under deadline pressure the week before an audit.
  • It makes test effort visible in the plan. Because test planning happens in the same phase as design, test effort is budgeted, staffed, and scheduled up front instead of being compressed into whatever time remains after coding overruns.
  • It supports independent verification and validation. A separate test organization can work from the specifications in parallel with development, which is mandated in defence and aerospace contracting and strongly encouraged by several safety standards.
  • Phase entry and exit criteria are explicit. Each level has defined inputs, outputs, and review gates, which makes progress measurable in a way that “80 percent coded” never is.
  • It scales to hardware-software co-development. Mechanical, electrical, and software subsystems can each run their own V and integrate at defined points, which is why systems engineering adopted it long before software teams argued about it.
  • It produces the evidence regulators demand. In certified domains, the deliverable is not just working software but a documented argument that the software is fit for purpose. The V-Model’s artifacts are that argument.
  • It is honest about the cost of change. By making the rework path explicit — a change flows back up the left arm and invalidates the tests below it — the model prices late changes accurately rather than pretending they are free.

Why Regulated and Safety-Critical Industries Run the V

In most software, a defect costs money. In these domains, a defect can kill someone, and the legal system asks afterwards whether the organization exercised due diligence. That single fact reshapes the process.

Automotive — ISO 26262. The functional safety standard for road vehicles is drawn as a V and structured as one, spanning concept phase, system level, hardware level, and software level. Each ASIL rating (A through D, D being most stringent) prescribes test methods, coverage criteria, and independence of the reviewer. Requirements-based testing plus MC/DC coverage is effectively mandatory at ASIL D, and MC/DC is only meaningful when tests derive from requirements rather than from the code they are supposed to check.

Medical devices — IEC 62304, FDA design controls. Software safety classification (A, B, C) determines how much of the V is compulsory. FDA design control regulation is itself a V in prose: design inputs, design outputs, design verification, design validation, design transfer, and a design history file that is the traceability record. Regulatory submission requires the trace, not merely the passing tests.

Aerospace — DO-178C. Objectives are tabulated by software level (A through E), with independence requirements attached to specific objectives. Requirements-based test coverage, structural coverage analysis, and traceability between requirements, design, code, and tests are the core of the certification package. Dead code and unreachable code must be explained, which only makes sense in a process where every line of code has a requirement above it.

Rail — EN 50128. Software for railway control and protection, SIL 0 to SIL 4, with prescribed techniques per SIL, a specified organizational structure, and mandated independence between the designer, verifier, validator, and assessor roles. The V-Model is named directly in the standard’s lifecycle.

Defence and government. The original German V-Modell XT and its descendants remain procurement frameworks for public contracts, where the process itself is contractually specified because the customer must be able to audit progress against fixed deliverables.

What unites these is not conservatism. It is the requirement to produce, at the end, a defensible argument that each safety requirement has been implemented and demonstrated. A test suite that passes is not an argument. A trace from hazard to safety requirement to design element to code to test case to test result is. The V-Model’s structure exists to generate that chain as a byproduct of doing the work.

There is a second, less discussed reason: in these domains the requirements genuinely are more stable. Braking behavior, infusion pump dosing, flight control laws, and signalling interlocks are constrained by physics, regulation, and long-lived hardware. The V-Model’s weakest assumption — that requirements can be known up front — is at its most defensible exactly where the model is most used.


The V-Model and the Test Pyramid Compared

Both start from “test earlier”. They mean radically different things by it, and conflating them causes real confusion on teams that straddle both worlds.

Test Pyramid and TDD pushes testing left in code time: write the test seconds before the implementation, at the smallest possible granularity, and let the test suite run in seconds so the feedback loop is tight enough to steer design. Its lever is speed of feedback, its unit is the function or class, and its bias is heavily toward many fast unit tests with progressively fewer slow, broad tests.

The V-Model pushes testing left in project time: write the test plan months before the implementation, at every granularity, so that specification defects are caught during specification. Its lever is specification rigor, its unit is the requirement, and it is deliberately balanced — system and acceptance levels carry as much weight as unit level, because those are the levels the regulator cares about.

DimensionV-ModelTest Pyramid and TDD
“Test early” meansPlan tests during design phasesWrite tests before each small code change
Time horizonMonths aheadSeconds to minutes ahead
Test derived fromA written requirement or design documentThe desired behavior of the next unit of code
Primary purposeEvidence and traceabilityDesign feedback and regression safety
Distribution of effortBalanced across all four levelsWeighted heavily toward unit tests
Tolerates changing requirementsPoorly — change ripples up the left armWell — the suite makes change safe
Answers toAuditors and standards bodiesThe developers writing the code

They are not mutually exclusive, and the best regulated teams run both. TDD produces the unit-level tests that satisfy the bottom of the V while giving developers fast feedback; the V supplies the requirements-based test cases at every level and the trace matrix that TDD alone cannot produce. The failure mode is assuming one substitutes for the other: high unit-test coverage does not demonstrate requirements coverage, and a complete trace matrix does not mean the code is pleasant to change. Pairing them with CI-CD Best Practices lets the fast tests gate every commit while the heavyweight system and acceptance levels run on a slower cadence.


Variants and Tailoring

The canonical four-level V is a template, not a law. Real programmes reshape it, and the reshapings are worth knowing by name.

Scaling the number of levels. A small embedded component might collapse to three levels; a large system-of-systems might add a supra-system level above user requirements and a hardware-software integration level between unit and integration. The invariant is not “four levels” — it is “every decomposition level has exactly one matching recomposition level”.

The W-Model. An explicit answer to the criticism that the V draws testing as living only on the right. The W overlays a second V on the first: the descending arm of the second V is test preparation running under each design phase, and its ascending arm is test execution. It encodes as geometry what the V-Model only encodes as discipline, which is useful mainly as a teaching device.

The double V in automotive. ISO 26262 practice pairs each level with a simulation fidelity: model-in-the-loop verifies the control model, software-in-the-loop verifies generated code on a host, processor-in-the-loop verifies it on the target instruction set, and hardware-in-the-loop verifies the complete ECU against a simulated vehicle. Each rung climbs closer to reality without waiting for a physical prototype.

V-Modell XT. The German federal standard, whose “XT” stands for extensible tailoring. Its central contribution is that the process itself is configured per project from defined process modules and decision gates, with the tailoring decisions recorded as a project artifact. It formalizes what every competent team does informally.

Incremental and agile hybrids. Running one V per release increment is common and legitimate: the safety-critical core follows a full V while surrounding non-critical features run on shorter iterations. Some teams run a V per feature with continuous integration underneath, using Feature Flags to keep unverified increments dark in production builds. The hybrid works when the split is drawn along criticality lines and fails when it is drawn along team-preference lines, because the trace obligation does not respect team boundaries.

What must not be tailored away. Whatever the shape, three things survive every legitimate variant: each design level retains a matching test level, the trace between them is maintained continuously, and validation against the real need remains distinct from verification against the spec. Remove any of the three and the remaining structure is decoration.


Comparison

AspectV-ModelWaterfall ModelSpiral ModelScrum
Shape of the lifecycleSequential, folded into a VSequential, linearSequential loops, risk-drivenFixed-length iterations
When tests are plannedDuring the matching design phaseAfter implementationPer spiral cyclePer story, continuously
Requirements assumptionKnown and stable up frontKnown and stable up frontProgressively discoveredExpected to change
Central mechanismLevel-to-level traceabilityPhase completionRisk analysis per cycleEmpirical inspect and adapt
Customer involvementStart (requirements) and end (acceptance)Start and endEvery cycle’s reviewEvery Sprint review
Handling of late changeExpensive, ripples up the left armExpensive, formal change controlAbsorbed in the next cycleAbsorbed in the next sprint
Time to first working softwareLate — after full descentLateModerate — prototypes earlyEarly — first sprint
Documentation weightHeavy, and deliberately soHeavyModerate, risk documents prominentLight, working software preferred
Best fitSafety-critical, regulated, fixed-scopeWell-understood, repeat projectsLarge, high-risk, novel systemsEvolving product requirements
Main weaknessValidation failure discovered lastSame, plus no test disciplineCost and expertise of risk analysisWeak audit trail without extra work

The V-Model is best understood as waterfall plus test discipline plus traceability. Everything the V adds is on the testing and evidence axis; nothing it adds addresses waterfall’s core vulnerability, which is being wrong about requirements. That is why hybrids exist — see the pitfalls section on “agile V” arrangements.


Real-World Use Cases

  • Automotive ECU development. An engine or braking controller developed to ISO 26262 ASIL D, with hazard analysis feeding safety goals, safety goals feeding technical safety requirements, and every requirement traced to hardware-in-the-loop test cases before the software exists.
  • Infusion pump firmware. IEC 62304 Class C software where a dosing error is potentially fatal; unit tests derived from the detailed design of the dose calculation module, system tests derived from clinical use scenarios, validation performed with clinicians in a simulated ward.
  • Flight control software. DO-178C Level A, where every requirement maps to test cases, structural coverage is analysed to MC/DC, and any code not covered must be justified as deactivated or explained as a coverage-analysis gap.
  • Railway signalling interlocking. EN 50128 SIL 4, with an independent validator who has never touched the design signing off the validation report, and a formal safety case assembled from the trace.
  • Nuclear instrumentation and control. IEC 61513 and IEC 60880 programmes where the V lifecycle is embedded in the licensing submission and the regulator reviews the artifacts, not just the product.
  • Defence procurement. Fixed-price contracts where deliverables at each V level are the contractual milestones and payment is tied to reviews (SRR, PDR, CDR, TRR) that gate movement between phases.
  • Industrial automation and PLC safety functions. IEC 61508 SIL-rated safety instrumented systems in chemical plants, where proof-test intervals and verification evidence are part of the plant’s operating licence.
  • Automotive supplier qualification. A tier-one supplier shipping software to an OEM must hand over the trace matrix and verification reports as part of the delivery, so the V is imposed contractually even where the supplier’s internal culture is agile.
  • Satellite and launch vehicle avionics. Systems that cannot be patched after deployment, where the cost of a validation failure is the total loss of the asset and the entire mission.
  • Large-scale systems engineering. Any programme integrating mechanical, electronic, and software subsystems, where each discipline runs its own V and the system-level V governs the integration points between them.

Common Pitfalls

  • Treating the right arm as “the testing phase”. The most common corruption: teams draw the V, then execute a waterfall and write all the tests at the end anyway. If test plans are not deliverables of the design phases, you have a waterfall with better diagrams.
  • Confusing verification with validation. Passing every system test proves the system matches the spec. It says nothing about whether the spec captured the need. Teams that conflate these ship correct implementations of wrong requirements and are genuinely surprised.
  • Trace matrices maintained as a compliance ritual. A matrix updated the month before an audit, by an engineer reverse-engineering links from memory, produces the artifact without the benefit. The trace has to be maintained continuously to catch the gaps it exists to catch.
  • Requirements too vague to test. “The system shall be responsive” generates no test case. The V exposes this early only if someone actually attempts to write the acceptance test at requirements time rather than deferring it.
  • No feedback path for discovered design decisions. Coders inevitably find gaps in the low-level design. Without a defined change path back up the left arm, they fix it locally, the design document silently drifts from the code, and every downstream test is now verifying against a fiction.
  • Ignoring non-functional requirements until system test. Performance, security, and resource budgets must be decomposed down the left arm and allocated to components. Discovering at system test that the architecture cannot meet a latency budget means re-descending the entire left arm.
  • Big-bang integration. Skipping incremental integration and assembling everything at once collapses the integration level into a debugging free-for-all where fault localization is nearly impossible. The V’s level structure only pays off if integration is actually staged.
  • Over-applying it to exploratory work. Running a full V on a product whose market fit is unproven optimizes for evidence when the real risk is relevance. See Product-Market Fit — no amount of verification rigor rescues a product built on wrong assumptions.
  • Assuming the V forbids iteration. Nothing in the model prevents running a V per release, per increment, or per subsystem. Treating it as necessarily single-pass and multi-year is a choice, and usually a bad one.
  • Under-resourcing the independence requirement. Standards that mandate an independent verifier or validator mean organizationally independent, with separate reporting lines. Nominating a teammate who sat in the design reviews does not satisfy an assessor.


Example

A tier-one automotive supplier is building the software for an electric parking brake controller, rated ASIL C. The programme opens with hazard analysis and risk assessment, which produces a safety goal: unintended release of the parking brake while the vehicle is stationary on a gradient shall not occur. That goal decomposes into technical safety requirements, one of which states that the actuator release command shall be issued only when two independent inputs — the driver’s switch and the vehicle’s motion sensor — both confirm the release condition, within a fault-tolerant time interval of 200 ms. At the moment that requirement is signed, the acceptance test is written alongside it: a vehicle-level test on a 20 percent gradient, injecting a spurious switch signal with the motion sensor contradicting it, verifying the brake holds.

Descending the left arm, the system requirements phase adds interface behavior with the vehicle bus and the failure response — degrade to held-brake and set a diagnostic trouble code — and the system test plan grows a corresponding case using a restbus simulation. Architectural design splits the controller into an input arbitration component, a safety monitor, and an actuator driver, and defines the interface between arbitration and monitor as a signal pair carrying value plus validity flag. The integration test plan is written from that interface definition: send a valid-flag-clear message and assert the monitor refuses the command. Module design specifies the arbitration state machine down to its transitions, and the unit test plan enumerates every transition plus the boundary at exactly 200 ms. None of this code exists yet. Roughly forty percent of the programme’s effort has been spent, and not a line has been compiled.

Implementation then proceeds against the detailed design. Ascending the right arm, unit testing catches an off-by-one in the timeout comparison — caught against the module design, at the level where it was introduced, in an afternoon. Integration testing catches something more interesting: the arbitration component clears its validity flag on a bus timeout, but the monitor was designed to treat a missing message as “hold last value”, so a bus dropout produces a stale-but-valid state neither document anticipated. This is an architecture defect, found at the architecture level, and the fix is a change request routed back up the left arm — architecture document revised, integration test plan updated, affected unit tests re-run. System testing then confirms end-to-end behavior on the restbus, and vehicle-level acceptance testing on the gradient closes the loop back to the safety goal written eighteen months earlier. The certification package handed to the assessor is not the software. It is the trace: hazard, to safety goal, to technical safety requirement, to architectural element, to module, to code, to each test case and its recorded result. Every link was created as a byproduct of the work, which is exactly what the V-Model is for.

Dig deeper