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
  • Top-Level Verification and Bring-up21
  • Package, Pads and I/O18
  • Chip Signoff and Tapeout18
    • The Signoff Manifest
      • What Goes in the Manifest
      • Freezing a Baseline
      • The Manifest Checker
    • Waiver Governance
    • Closure Dashboards
    • Tapeout Readiness Review
    • ECO and Respin Risk
    • Errata and Post-Silicon
  • SoC Interview Prep16
  • Capstone: Integrate NanoSoC14
Loading lesson

←The Signoff Manifest
  1. Topics
  2. SoC Design
  3. Chip Signoff and Tapeout
  4. The Signoff Manifest
  5. What Goes in the Manifest
On this page

    Part 12 of 14, lesson 1 of 18Part 12 of 14/Chip Signoff and Tapeout/Lesson 1 of 18All levels

    What Goes in the Manifest

    Versions, derived databases, the tool-independent check list, results, waivers and owners: every row of the chip manifest.

    Why it matters

    A week before tapeout someone asks whether the power-aware simulation ran with isolation enabled, and nobody can answer without rerunning it, because the result was filed without the power-intent revision. The manifest exists so that question never needs asking: every result names the exact inputs it used. On NanoSoC the inputs are small enough to list in full, which makes this lesson concrete; on a large chip the same rows apply with longer version strings.

    The core idea

    A manifest has four kinds of row. Versions name every input that can change a result: the RTL revision, the map version from the address-map table, the constraint set, the power-intent revision, the firmware image used in co-simulation, and the collateral revisions for each third-party block. Derived databases name what the flow produced from those inputs and what signoff actually analysed: the synthesised netlist, the final layout database with its checksum, the extracted parasitics, the library and technology-file revisions and the tool versions. Checks name every signoff analysis in tool-independent words: static timing across the corner and mode matrix, physical verification, power and isolation checks, crossing checks, connectivity, equivalence after every netlist change, gate-level simulation. Results attach each check to the revisions it ran against, with pass or fail and the date. And waivers record every excused violation with its owner, expiry and evidence, so an excuse is never just a comment in a log.

    The difference between the first two kinds matters. Results from the front half of the flow (coverage, connectivity, crossing checks) name the RTL revision. Results from signoff (timing, physical verification, power on the netlist) run on the netlist, the layout and the parasitics, so they must name those too: a result tied only to RTL 214 does not identify the chip that was checked, and a checker that compares only RTL would pass with a different netlist or layout underneath.

    The NanoSoC manifest in miniature shows the shape. Fifteen RTL blocks and the PLL macro each carry a revision, from the interconnect decoder to the reset controller; the map version stamps the headers, the decoder and the verification model together; the constraint set covers the three domains at 192, 96 and 24 MHz plus the asynchronous boundaries between them. The check rows mirror the dashboard disciplines of the third topic: timing, power, physical verification, crossings, verification coverage, connectivity, equivalence and gate-level simulation. Nothing here is new analysis; it is the index over analyses owned elsewhere, which is why the integrator can own it without owning any tool. All revision labels in this section (rev 214, map 7, netlist n88, layout gds-31) are illustrative.

    NanoSoC as specified has no test logic, so its manifest has no DFT rows. A real chip with SRAMs adds scan, pattern and memory-test rows, plus power-grid IR and EM, ESD and antenna rows, each with an owner.

    Row kind

    NanoSoC example

    Owner

    Breaks when

    RTL version

    Top revision plus the DMA wrapper revision

    Integrator

    An ECO lands without bumping it

    Map version

    Address-map table revision on every header and the decoder

    Integrator

    Software builds against an older map

    Constraint set

    SDC revision covering clk_cpu, clk_sys, clk_per

    Timing owner

    A mode is added without re-constraining

    Power intent

    Power-intent revision with the 114 isolation cells

    Power owner

    A crossing is added without a clamp

    Derived database

    Netlist, layout checksum, parasitics, library and tool versions

    Implementation owner

    A rerun produces a new netlist and nobody records it

    Check result

    Timing, PV, power, crossings, coverage, connectivity, equivalence, gate-level simulation

    Each discipline owner

    Run against a different revision than recorded

    Waiver

    Excused violation with owner and expiry

    Granting owner

    Nobody owns it or it never expires

    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
    # Every manifest row names its owner and the revisions it ran on.
    # Revision labels are illustrative. A result is only evidence if every
    # revision it names equals the baseline entry.
    BASE = {"rtl": "214", "map": "7", "sdc": "12", "upf": "5",
            "netlist": "n88", "layout": "gds-31"}
    rows = [
        # name, owner, revisions the row names
        ("rtl-top", "integrator", {"rtl": "214"}),
        ("address-map", "integrator", {"map": "7"}),
        ("constraints", "timing owner", {"sdc": "12"}),
        ("power-intent", "power owner", {"upf": "5"}),
        ("netlist", "implementation owner", {"netlist": "n88"}),
        ("layout", "implementation owner", {"layout": "gds-31"}),
        ("timing-result", "timing owner",
         {"sdc": "12", "netlist": "n88", "layout": "gds-31"}),
        ("connectivity-result", "integration", {"rtl": "214", "map": "7"}),
        ("isolation-result", "power owner", {"upf": "5", "netlist": "n88"}),
        ("waiver-014", "cdc owner", {"rtl": "214"}),
    ]
    
    def problems(rows):
        bad = []
        for name, owner, revs in rows:
            if not owner or not revs:
                bad.append((name, "ownerless or unversioned"))
            for key, rev in revs.items():
                if BASE[key] != rev:
                    bad.append((name, key, rev))
        return bad
    
    assert problems(rows) == []
    
    # inject two violations: a result on last week's netlist, an ownerless row
    broken = list(rows)
    broken[6] = ("timing-result", "timing owner",
                 {"sdc": "12", "netlist": "n87", "layout": "gds-31"})
    broken.append(("pv-result", "", {"layout": "gds-31"}))
    found = problems(broken)
    assert ("timing-result", "netlist", "n87") in found
    assert ("pv-result", "ownerless or unversioned") in found
    assert len(found) == 2, found
    print("PASS: 10 rows owned and on baseline; stale netlist and ownerless row both caught")

    What the review looks for

    • Every check the dashboard shows has a manifest row with a revision, a result and a date.

    • Every signoff result names the netlist and layout it ran on, not only the RTL.

    • Every consumer of the map, headers, decoder and verification model, carries the same map version stamp.

    • Every third-party block names its collateral revision: what arrived, what was checked, what was waived.

    Verify and debug

    Diff the manifest against the repository tags: any revision the manifest names must exist as a tag, and any tag newer than the manifest on a taped path is either in the manifest or the baseline moved without a record. The checker in the third lesson automates exactly this; by hand, start from the map version, because headers and the decoder disagree first and loudest.

    A header generated from an old address map while the RTL moved on is a classic integration failure: every driver access hits the wrong address. The manifest row for the map version is the standing guard: the review refuses evidence built from a different map.

    If asked what a manifest contains, give the four kinds of row, then offer the NanoSoC miniature: fifteen RTL blocks and the PLL macro versioned, one stamped map, the netlist and layout the signoff ran on, and a result per dashboard discipline.

    Check yourself Why must results name the revision they ran against, not just pass or fail?

    Because a pass against last week's netlist says nothing about this week's chip. The revision turns a bare claim into evidence that can be re-executed.

    Related topics

    • Next: Freezing a Baseline

    • Physical Design: Tapeout Checklist

    • Physical Design: Revision Tagging and Reproducibility

    Previous

    232 / 289

    Next: Freezing a Baseline

    Up next

    Up nextFreezing a Baseline

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error

    See also

    • The Manifest Checker