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. Freezing a Baseline
On this page

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

    Freezing a Baseline

    What freezing means, the two named milestones, what may still change, and proving the freeze reproducible from contents.

    Why it matters

    Signoff week without a freeze is a queue that never empties: timing closes on Monday's netlist while an ECO lands on Tuesday and the power rerun on Wednesday covers neither. The freeze stops the drift by declaring one set of revisions the tapeout candidate, so every check result means the same chip. Its one job is the discipline of the freeze; the script that enforces it is next.

    The core idea

    A baseline is the frozen tuple of every versioned input and every derived database a result was run on: RTL, map, constraints, power intent, firmware and collateral, plus the synthesised netlist, the final layout database (with its checksum), the extracted parasitics, the library and technology-file revisions, and the tool versions. Results from the front half of the flow name the RTL revision; results from signoff name the netlist and layout revision as well. Freezing means three things at once: the revisions are recorded in the manifest, the sources are tagged so they can be retrieved exactly, and any change after the freeze follows the ECO discipline of the fifth topic instead of landing silently.

    The word freeze covers two different dates, so this section uses two named milestones. The design freeze is when RTL, map, constraints, power intent and firmware are stable; after it only reviewed fixes enter, each logged as a post-freeze change with a reason, a risk note and re-verification. The signoff-complete date is the tapeout date: every open violation closed or waived, the implementation databases (netlist, layout, parasitics) frozen as the candidate. Between the two, closure fixes still move the netlist and layout, so results on those databases are rerun and the manifest moves; the design inputs do not move without the ECO gates. Entry rule for the design freeze: map and constraints stable and all disciplines reporting. Freezing too early multiplies ECOs; freezing too late means nothing was ever verified together.

    On NanoSoC (illustrative dates) the design freeze falls on day 130. The pre-freeze weeks close the map at revision 7 and the constraints at revision 12; the freeze tags all fifteen RTL block revisions and the PLL macro, the decoder generated from the map, and the firmware image used in co-simulation, which is the 8 KB image loaded over SPI in the 12.581 ms boot. After the freeze, the only allowed edits are ECO-class changes with equivalence re-proven. Firmware is a signoff input, because the boot ROM self-test, the 64-word DMA self-test (a 750 ns job inside an 8.385 us ROM step) and the power-state walk all ran against that image.

    How owners iterate until the manifest checker is green and the baseline is frozen.
    How owners iterate until the manifest checker is green and the baseline is frozen.

    A digest of the tuple makes the freeze checkable in one line, but only if it covers contents. Hashing revision names alone cannot catch a rebuilt firmware image or layout that keeps its name and changes its bytes, which is the classic silent drift. The digest must cover content hashes, not only names, and it must not depend on the order the keys are listed in.

    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
    # A frozen baseline is a tuple; a result is valid only if its input
    # tuple equals the frozen one. The digest covers CONTENT hashes, and is
    # tested with a reversed key order and with a same-name rebuild.
    import hashlib
    
    def sha(data):
        return hashlib.sha256(data).hexdigest()[:12]
    
    def entry(name, content):
        return name + ":" + sha(content)
    
    frozen = {
        "rtl": "214", "map": "7", "sdc": "12", "upf": "5",
        "fw": entry("boot-img-33", b"image bytes v33"),
        "netlist": entry("n88", b"netlist bytes 88"),
        "layout": entry("gds-31", b"layout bytes 31"),
    }
    
    def digest(d):
        body = "|".join(k + "=" + d[k] for k in sorted(d))
        return hashlib.sha256(body.encode()).hexdigest()[:16]
    
    d1 = digest(frozen)
    shuffled = {k: frozen[k] for k in reversed(list(frozen))}
    assert list(shuffled) != list(frozen)      # the order really differs
    assert digest(shuffled) == d1              # and cannot change the digest
    
    drifted = dict(frozen, sdc="13")
    assert digest(drifted) != d1               # a new constraint revision moves it
    rebuilt = dict(frozen, fw=entry("boot-img-33", b"image bytes v33 REBUILT"))
    assert rebuilt["fw"].split(":")[0] == "boot-img-33"  # same name
    assert digest(rebuilt) != d1               # new contents still move the digest
    print("PASS: digest stable under reorder, moves on drift and on a same-name rebuild")

    What the review looks for

    • The design-freeze date, the signoff-complete date and the frozen tuple are written in the manifest, with tags that retrieve every input.

    • No check result predates the design freeze on any design input it names, and every signoff result names the current netlist and layout; anything older was rerun or is waived explicitly.

    • The firmware image, the netlist and the layout are identified by content hash as well as by name.

    Verify and debug

    Retrieve the tag on a clean checkout and rerun the fastest check, the map alignment and overlap script: if it disagrees with the recorded result, the freeze is broken and nothing else can be trusted. Then confirm the firmware image hash against the boot log; a rebuilt image with the same name but new contents is the classic silent drift.

    A netlist that no longer matches the RTL is what an unverified late change leaves behind: gate-level simulation disagrees with RTL and nobody knows which edit did it. The freeze plus mandatory equivalence after every netlist change is the fix; the review treats a missing equivalence run as a red metric, not a gap in paperwork.

    If asked when you would freeze, answer with the two milestones: design freeze when map and constraints are stable and every discipline is reporting, signoff-complete when every open item is closed or waived, and say that fixes between the two are post-freeze changes that pass the ECO gates.

    Check yourself A block owner asks to land a cleanup after the design freeze that touches nothing functional. What do you say?

    No, unless it follows ECO discipline: equivalence re-proven and affected checks rerun. After the freeze there are no cleanups, only logged changes, because functional intent is not something a diff can prove by inspection.

    Related topics

    • What Goes in the Manifest

    • Next: The Manifest Checker

    • Verification: Sign-Off Criteria

    Previous

    233 / 289

    Next: The Manifest Checker

    Up next

    Up nextThe Manifest Checker

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error