Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutRoadmapCareersInternshipsFAQContactPrivacyTerms
Skip to lesson

Course contents

  • How to Use This Course
  • The NanoSoC Tour
  • Reading Path
  • SoC Glossary10
  • SoC Metrics Reference
  • SoC Cheatsheet
  • What SoC Integration Is12
    • The Integrator Role and Handoffs
    • Spec to Tapeout Flow
    • Contracts and Ownership
      • Interfaces as Contracts
      • RACI and Change Control
      • Hardware-Software Contract and Errata
    • Reading the SoC Spec
  • Architecture and Budgets21
  • Memory Maps and Address Decode26
  • Interconnect and Bus Fabrics26
  • Clock and Reset Architecture24
  • Power Architecture21
  • Interrupts, DMA and Peripherals15
  • Memories, Boot and Security21
  • IP Integration and Handoff21
  • Top-Level Verification and Bring-up21
  • Package, Pads and I/O18
  • Chip Signoff and Tapeout18
  • SoC Interview Prep16
  • Capstone: Integrate NanoSoC14
Loading lesson

←Contracts and Ownership
  1. Topics
  2. SoC Design
  3. What SoC Integration Is
  4. Contracts and Ownership
  5. RACI and Change Control
On this page

    Part 1 of 14, lesson 8 of 12Part 1 of 14/What SoC Integration Is/Lesson 8 of 12All levels

    RACI and Change Control

    One accountable owner per contract facet, and the change process that guards them after a freeze.

    Why it matters

    The alias would be a footnote if one owner could remove it: widen the DMA address port to 12 bits and every image but the first disappears. But the port belongs to the DMA owner, the slot width to the integrator, the headers to software, and the tests to verification, so the one-line fix touches four parties and every consumer they feed. Without a named decider the change either dies in a thread or lands quietly and breaks the headers. Naming one decider per facet, and one path by which a frozen contract may change, removes that thread.

    The core idea

    RACI names four positions per contract: Responsible does the work, Accountable answers for it, Consulted is asked first, Informed is told after. The rule that makes it work is singularity: exactly one A per row. Two accountables means no decider; zero means the facet belongs to everyone, which is nobody. On NanoSoC the integrator holds the A for the shared tables and the top-level structure, block owners hold the A for behaviour inside their wrappers, software holds the A for drivers built on frozen tables, and verification holds the A for the proof that the assembled chip meets the specification.

    Contract

    Responsible

    Accountable

    Consulted

    Informed

    Address map and decode

    Integrator

    Integrator

    Software, PD

    Verification, docs

    Fabric protocol and config

    Integrator

    Integrator

    Block owners

    Verification

    Block behaviour and collateral

    Block owner

    Block owner

    Integrator

    Software, verification

    Clock, reset, power intent

    Integrator

    Integrator

    PD, block owners

    Software

    Constraints per block

    Block owner

    Block owner

    PD, integrator

    Signoff board

    Top-level constraint merge

    Integrator

    Integrator

    PD, block owners

    Signoff board

    Drivers against frozen tables

    Software

    Software

    Integrator

    Verification

    Chip-level proof

    Verification

    Verification

    Integrator, software

    Signoff board

    Physical closure

    PD

    PD

    Integrator

    Signoff board

    Change control is the only legal path across a freeze, and it has five steps: request with the reason, impact listing every consumer and test touched, decision by the Accountable, regeneration of every consumer from the changed source, and requalification proving the change and nothing else. The worked example below runs the alias-removal request through it: widening the port touches the DMA RTL, the wrapper, the headers, the aliases used in tests, and the alias checker itself. The Accountable defers it to the next spin and approves the cheap companion instead, a lint rule plus the canonical-address check, which is how change control earns its keep: most requests are correctly refused or shrunk.

    The RACI checker

    The script below holds the table above as data and enforces the two rules that keep RACI honest: every contract names exactly one Accountable, and every contract names someone Responsible for doing the work. It passes the NanoSoC table and demonstrates it catching a row where two parties both claim accountability.

    example.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    CONTRACTS = ["map", "fabric", "block", "clock_reset_power",
                 "constraints", "top_constraints", "drivers", "proof", "closure"]
    
    RACI = {  # name: parties per position; NanoSoC teaching values
        "map": {"R": ["integrator"], "A": ["integrator"]},
        "fabric": {"R": ["integrator"], "A": ["integrator"]},
        "block": {"R": ["block-owner"], "A": ["block-owner"]},
        "clock_reset_power": {"R": ["integrator"], "A": ["integrator"]},
        "constraints": {"R": ["block-owner"], "A": ["block-owner"]},
        "top_constraints": {"R": ["integrator"], "A": ["integrator"]},
        "drivers": {"R": ["software"], "A": ["software"]},
        "proof": {"R": ["verification"], "A": ["verification"]},
        "closure": {"R": ["pd"], "A": ["pd"]},
    }
    
    def check(raci):
        problems = []
        for name in CONTRACTS:
            row = raci.get(name, {})
            if len(row.get("A", [])) != 1:
                problems.append(name + ": needs exactly one Accountable")
            if len(row.get("R", [])) < 1:
                problems.append(name + ": needs someone Responsible")
        return problems
    
    assert check(RACI) == []
    
    shared = dict(RACI)
    shared["drivers"] = {"R": ["software"], "A": ["software", "integrator"]}
    assert check(shared) == ["drivers: needs exactly one Accountable"]
    
    orphan = dict(RACI)
    orphan["closure"] = {"R": ["pd"], "A": []}
    assert check(orphan) == ["closure: needs exactly one Accountable"]
    print("PASS: 9 contracts singly accountable; shared-A and empty-A caught")

    What the review looks for

    • The RACI table is versioned with the project plan, and no row has zero or two Accountables.

    • Every change after a freeze carries the five steps with the Accountable's name on the decision.

    • Refused changes are recorded with the reason, so they are not re-proposed monthly.

    Verify and debug

    When two parties each claim the other owns a failure, read the RACI row for the facet, not the org chart: the A decides and the R acts. When a change lands without the five steps, treat every consumer as suspect and re-run the stamp checker from the flow topic before debugging any single symptom.

    Pin-mux conflict: two functions drive the same pin, or the package pin map differs from the board design, because no row owned the pin database. The symptom is a signal on the wrong ball or contention at boot. Give the pin map one Accountable owner in the RACI, one source database that the pad ring, the package and the board team all read, and a checker against the board netlist.

    If asked how you handle a late change request, walk the five steps and give the alias story: the request, the four-party impact, the deferral, and the lint rule that shipped instead. Deciders who can say no are what the question is screening for.

    Check yourself PD wants the block owners to sign the top-level clock constraints. Which row decides, and what does it say?

    The top-level constraint merge row: the integrator is Responsible and Accountable, PD and the block owners are Consulted. Block owners sign their own per-block constraints, and PD signs closure, not ownership of the merged source constraints.

    Related topics

    • Interfaces as Contracts

    • Next: Hardware-Software Contract and Errata

    • The Integrator Role and Handoffs

    Previous

    13 / 289

    Next: Hardware-Software Contract and Errata

    Up next

    Up nextHardware-Software Contract and Errata

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error