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
    • Clock Sources and PLLs
    • Dividers, Muxes and Glitch-Free Switching
    • Clock Gating Architecture
    • Clock Domain Planning
    • Top-Level Crossings
      • The Ten Crossings
      • Choosing a Mechanism per Crossing
      • Crossing Review Checklist
    • Always-On Domain, Wake Policy and a Timer Extension
    • Reset Sources and Reset Tree
    • Reset Sequencing and Release
  • 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

←Top-Level Crossings
  1. Topics
  2. SoC Design
  3. Clock and Reset Architecture
  4. Top-Level Crossings
  5. Crossing Review Checklist
On this page

    Part 5 of 14, lesson 15 of 24Part 5 of 14/Clock and Reset Architecture/Lesson 15 of 24All levels

    Crossing Review Checklist

    The review that closes the crossings: inventory, mechanism, constraints, ratio sweeps and signoff evidence.

    Why it matters

    Crossings close not when the RTL is written but when the review can answer five questions with evidence: is the inventory complete, is each mechanism right, do the constraints match, were the ratios swept, and is signoff clean. An unchecked crossing is a field failure with a long fuse, so the checklist is explicit and the evidence is attached, not promised. This lesson is that checklist. Its one job is the review; everything it checks was taught in the two previous lessons.

    The core idea

    First, inventory: the CDC tool's found crossings diffed against the ten rows, with any extra row explained and any missing row convicted as a tool-setup bug. Second, mechanism: each row's class-to-mechanism mapping restated, with depth arithmetic for the FIFOs and hold times for the levels. Third, constraints: the pair is declared asynchronous in the constraints (one clock-group declaration), the only extra constraints are the bounded-delay and skew limits on FIFO pointers and handshake data, and no other false path or multicycle crosses the pair; the exception audit from the switching lesson is rerun here. Fourth, ratio sweeps: each crossing simulated at the worst phase alignment, because NanoSoC ratios are fixed but phase is not. Fifth, signoff: the CDC methodology run clean with waivers that carry evidence and expiry, following CDC Signoff Methodology, and reset-domain crossing checked alongside, since reset releases cross these same boundaries.

    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
    # Audit model: the inventory every review re-runs. Each row has from, to and
    # a mechanism, and the mechanism must match the signal class.
    DOMAINS = {"clk_cpu", "clk_sys", "clk_per", "pad"}
    INVENTORY = [
        ("X1", "clk_cpu", "clk_sys", "fifo", "multi"),
        ("X2", "clk_sys", "clk_cpu", "fifo", "multi"),
        ("X3", "clk_sys", "clk_per", "handshake", "multi"),
        ("X4", "clk_per", "clk_sys", "handshake", "multi"),
        ("X5", "clk_sys", "clk_per", "level-2flop", "single"),
        ("X6", "clk_per", "clk_cpu", "level-2flop", "single"),
        ("X7", "clk_per", "clk_sys", "level-2flop", "single"),
        ("X8", "clk_per", "clk_cpu", "level-2flop", "single"),
        ("X9", "pad", "clk_per", "level-2flop", "single"),
        ("X10", "clk_per", "clk_sys", "level-2flop", "single"),
    ]
    OK = {"multi": {"fifo", "handshake"}, "single": {"level-2flop"}}
    
    def audit(rows):
        errors = []
        if len({r[0] for r in rows}) != len(rows):
            errors.append("duplicate crossing id")
        for x, src, dst, mech, cls in rows:
            if src not in DOMAINS or dst not in DOMAINS:
                errors.append(x + ": clock not in the domain table")
            if src == dst:
                errors.append(x + ": not a crossing")
            if mech not in OK[cls]:
                errors.append(x + ": " + mech + " is wrong for a " + cls + "-bit signal")
        return errors
    
    assert audit(INVENTORY) == []
    kinds = [m for _, _, _, m, _ in INVENTORY]
    assert (kinds.count("fifo"), kinds.count("handshake"), kinds.count("level-2flop")) == (2, 2, 6)
    assert len(INVENTORY) == 10
    # The audit can fail: a bus on two flops, an unknown clock, a same-clock row.
    assert audit([("X1", "clk_cpu", "clk_sys", "level-2flop", "multi")]) != []
    assert audit([("X1", "clk_cpu", "clk_dma", "fifo", "multi")]) != []
    assert audit([("X1", "clk_sys", "clk_sys", "fifo", "multi")]) != []
    print("PASS: 10 crossing groups, mechanisms match signal class; 3 bad rows rejected")

    What the review looks for

    • The tool-versus-table diff with zero unexplained rows, attached to the review record.

    • The FIFO depth lines, the level hold lines and the exception audit, each current.

    • A clean signoff report or waivers with evidence and expiry; a waiver without either is an open item, not a pass.

    Verify and debug

    Re-run the audit after every hierarchy or constraint change; crossings rot when constraints are edited without it. Treat a late-appearing eleventh crossing as a process failure, not a circuit problem: find which edit added the signal and why the inventory did not move with it, then fix the process that allowed the split.

    Quasi-static configuration crossings forgotten: clock-controller and pad-configuration registers that change rarely but still cross domains. They need the same handshake or level treatment as any control, linked from the CDC course's quasi-static rules. Audit the controller register file explicitly.

    If asked how you sign off crossings, answer with the five evidence items in order: diff, mapping, constraints, sweeps, report. Interviewers promote this into waivers: know what a good waiver carries.

    Check yourself The CDC report is clean but the inventory table was not updated after a hierarchy change. Is signoff valid?

    No. A clean report against a stale setup proves the wrong design. Update the table, rerun the audit and the tool, and only then claim signoff.

    Related topics

    • Choosing a Mechanism per Crossing

    • CDC and RDC: CDC Signoff Methodology

    • Release Order and Timing

    Previous

    105 / 289

    Next: Power Architecture

    Up next

    Up nextPower Architecture

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error

    See also

    • The Ten Crossings