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
  • 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
    • IP Collateral and Versioning
      • What an IP Delivery Contains
      • Versioning and Change Notices
      • The Acceptance Gate and Redelivery
    • Wrappers and Adapters
    • Integration Lint and Connectivity Checks
    • Top-Level SDC and Constraint Merge
    • DFT Integration
    • Debug Infrastructure
    • Safety and Fault Architecture
  • Top-Level Verification and Bring-up21
  • Package, Pads and I/O18
  • Chip Signoff and Tapeout18
  • SoC Interview Prep16
  • Capstone: Integrate NanoSoC14
Loading lesson

←IP Collateral and Versioning
  1. Topics
  2. SoC Design
  3. IP Integration and Handoff
  4. IP Collateral and Versioning
  5. Versioning and Change Notices
On this page

    Part 9 of 14, lesson 2 of 21Part 9 of 14/IP Integration and Handoff/Lesson 2 of 21All levels

    Versioning and Change Notices

    Three-part versions, what each part promises, change notices, and what a bump invalidates downstream.

    Why it matters

    Mid-project, the DMA team fixes a corner-case bug and ships version 2.4.0 over 2.3.0. The fix touches the STATUS clear timing by half a cycle, the interconnect timing was closed against the old behaviour, and the driver relied on reading DONE in the same cycle the last beat appears. One quiet redelivery invalidates timing, software and verification at once. The way out is to make version bumps boring: a numbering contract that says what changed, a notice that says what to recheck, and a checker that enforces it.

    The core idea

    Versions have three parts and each part is a promise. The major part changes only when the interface changes: ports added, removed or redefined, register offsets moved, protocol changed. Absorbing a major bump means re-verifying the interface and regenerating headers, and it is a project decision, never a quiet swap. The minor part changes when behaviour or features change behind a stable interface: a bug fix, a new mode, a timing change. Absorbing it means rerunning the block's tests in the integrated top and rechecking anything that depended on the old behaviour. The patch part changes for documentation, constraint or collateral-only updates with no RTL change; the checker below compares the file revisions of the two deliveries and refuses a patch bump whose RTL revisions differ, and only an unchanged RTL makes the patch bump a rebuild rather than a re-verification.

    Every bump arrives with a change notice naming four things: what changed and why, which interfaces or behaviours are affected, what the integrator must recheck, and the earliest version the notice applies to. The notice for the STATUS-timing fix would name the STATUS register, the DONE-in-same-cycle behaviour the NanoSoC driver relies on, and demand a rerun of the DMA job test plus a timing recheck of the status path. A bump without that notice is refused at the gate, which is the next lesson.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    def parse(ver):
        major, minor, patch = (int(p) for p in ver.split("."))
        return major, minor, patch
    
    def rtl_changed(old_files, new_files):
        """Files whose revision differs; inputs map path -> revision."""
        return {f: r for f, r in new_files.items()
                if f.endswith(".sv") and old_files.get(f) != r}
    
    def absorb(old, new, old_files, new_files):
        # Returns the recheck level the integrator owes after the bump.
        om, on, op = parse(old)
        nm, nn, np = parse(new)
        assert (nm, nn, np) > (om, on, op), "version must move forward"
        if nm != om:
            return "major: re-verify interface, regenerate headers, project decision"
        if nn != on:
            return "minor: rerun block tests in the top, recheck dependents"
        changed = rtl_changed(old_files, new_files)
        if changed:
            raise ValueError("mislabelled patch bump, RTL changed: " + ", ".join(changed))
        return "patch: rebuild only, collateral changed"
    
    V23 = {"dma_dut.sv": "r41", "nano_dma.sdc": "r7"}
    V231 = {"dma_dut.sv": "r41", "nano_dma.sdc": "r8"}     # only the constraints moved
    V231_BAD = {"dma_dut.sv": "r42", "nano_dma.sdc": "r8"}  # RTL moved under a patch number
    assert absorb("2.3.0", "3.0.0", V23, V231).startswith("major")
    assert absorb("2.3.0", "2.4.0", V23, V231_BAD).startswith("minor")
    assert absorb("2.3.0", "2.3.1", V23, V231).startswith("patch")
    try:
        absorb("2.3.0", "2.3.1", V23, V231_BAD)
        raise SystemExit("mislabelled patch bump was not caught")
    except ValueError as e:
        assert "dma_dut.sv" in str(e)
    
    FIELDS = ("what_changed", "affected", "recheck", "applies_from")
    def notice_gaps(n):
        return [f for f in FIELDS if not n.get(f)]
    good = {"what_changed": "STATUS clear timing", "affected": "DONE same-cycle rule",
            "recheck": "rerun job test, recheck status path", "applies_from": "2.4.0"}
    assert notice_gaps(good) == []
    assert notice_gaps({k: v for k, v in good.items() if k != "recheck"}) == ["recheck"]
    print("PASS: revisions drive the recheck level; mislabelled patch and incomplete notice are caught")

    What the review looks for

    • The version string recorded in the integration manifest matches every file stamp from the previous lesson.

    • The change notice names affected interfaces and the exact rechecks owed; the rechecks are scheduled, not assumed.

    • A major bump has a project-level approval with regenerated headers and interface tests; a minor bump has its rerun results attached.

    Verify and debug

    When a regression appears after a redelivery, diff the RTL file revisions before debugging the failure: a patch bump with changed RTL is a mislabelled minor and the whole recheck level was wrong. Keep the previous version's integration results so the rerun has a baseline; a minor bump whose rerun produces new warnings has changed more than its notice admits. For the conceptual background see Versioning and Compatibility.

    Silent tie-offs by a generator or a redelivered wrapper: an undocumented port change quietly tied to zero, classically the upper bits of an address bus, so high addresses alias onto low memory. The version check that catches it is the port-list diff between versions, reviewed line by line, plus a directed high-address test; the connectivity topic makes this mechanical.

    If asked whether you would absorb a minor bump a week before tapeout, answer with the recheck price: rerun block tests in the top, recheck every dependent behaviour the notice names, and reclose timing on touched paths. Then say when the answer is no: when any recheck cannot finish before the freeze, the bump waits for the respin.

    Check yourself A redelivery changes only the SDC file but keeps the version string. Acceptable?

    No. A collateral-only change is exactly what the patch part exists to record; reusing the version string means two different deliveries share one identity and no checker can tell them apart. Demand the patch bump and the file-revision diff.

    Related topics

    • What an IP Delivery Contains

    • Next: The Acceptance Gate and Redelivery

    • PD: SDC Versioning and Constraint Handoff

    Previous

    170 / 289

    Next: The Acceptance Gate and Redelivery

    Up next

    Up nextThe Acceptance Gate and Redelivery

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error