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

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • Logic Synthesis Glossary
  • Logic Synthesis Cheatsheet
  • Synthesis Foundations14
  • Logic Optimisation and Mapping20
  • Constraints and Timing15
  • Sequential, FSM and Memory19
  • Datapath Synthesis14
  • Area, Power and Test14
  • Verification, ECO and Handoff15
    • Equivalence Checking
    • Incremental Compile and ECO
    • Physical-Aware Synthesis and Handoff
      • Wire-Load Models and Placement Estimates
      • Congestion and Mapping Choices
      • Floorplan Assumptions
      • The Handoff Package
      • What Physical Design Changes
  • Flows and Debugging15
  • Interview and Judgment11
Loading lesson

‹Physical-Aware Synthesis and Handoff
  1. Topics
  2. Logic Synthesis
  3. Verification, ECO and Handoff
  4. Physical-Aware Synthesis and Handoff
  5. What Physical Design Changes

Part 7 · Verification, ECO and Handoff · Intermediate

What Physical Design Changes

What physical design may change after handoff, plus a netlist sanity checker.

On this page

    What stays fixed

    Function is fixed at handoff: the netlist must stay equivalent to the RTL it proved against. Equivalence is re-proven after every later patch.

    Constraint intent is fixed too. Physical design may meet it differently, but it may not redefine what correct means.

    What physical design changes

    Placement and routing replace estimates with reality, then reshape the netlist to fit it. Each change below is normal, and each must keep equivalence.

    Change

    Why it happens

    What to watch

    Buffering and sizing

    Real route lengths differ from estimates

    Area and power drift from the synthesis reports

    Local restructuring

    Congested spots need friendlier logic

    Correlation gap on touched paths

    Clock tree build

    Synthesis saw an ideal clock, not a tree

    Skew appears where none was modelled

    Threshold swaps

    Leakage and speed traded per path

    Library views must cover every swap

    Timing correlation

    Synthesis timing and routed timing disagree by construction. Estimates, ideal clocks, and missing parasitics separate them.

    The gap is tracked, not wished away. A path with 0.05 slack in synthesis and 0.4 extra route delay was never really closed.

    A netlist sanity checker

    The program below checks three handoff rules on an inline netlist: unique instance names, no unconnected pins, and no behavioural assign statements. It must clear the clean netlist and flag exactly three faults in the broken one.

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    import sys
    
    GOOD = """
    module top(input a, input b, input c, output y);
    wire n1;
    NAND2 g1 (.A(a), .B(b), .Y(n1));
    NOR2 g2 (.A(n1), .B(c), .Y(y));
    endmodule
    """
    
    BAD = """
    module top(input a, input b, input c, output y);
    wire n1;
    NAND2 g1 (.A(a), .B(b), .Y(n1));
    NOR2 g1 (.A(n1), .B(), .Y(y));
    assign y = n1;
    endmodule
    """
    
    def check_netlist(src):
        issues = []
        names = {}
        for lineno, raw in enumerate(src.splitlines(), start=1):
            line = raw.strip()
            if not line:
                continue
            if line.startswith("module") or line.startswith("endmodule"):
                continue
            if line.startswith("input") or line.startswith("output") or line.startswith("wire"):
                continue
            if line.startswith("assign"):
                issues.append("assign statement at line " + str(lineno))
                continue
            if "(" in line and line.endswith(";"):
                head = line.split("(")[0].strip().split()
                if len(head) >= 2:
                    inst = head[-1]
                    if inst in names:
                        issues.append("duplicate instance " + inst + " at line " + str(lineno))
                    else:
                        names[inst] = lineno
                nospace = line.replace(" ", "")
                if "()" in nospace:
                    issues.append("unconnected pin at line " + str(lineno))
        return issues
    
    good_issues = check_netlist(GOOD)
    if len(good_issues) != 0:
        print("FAIL: clean netlist raised " + str(len(good_issues)) + " issues")
        sys.exit(1)
    
    bad_issues = check_netlist(BAD)
    if len(bad_issues) != 3:
        print("FAIL: broken netlist raised " + str(len(bad_issues)) + " issues, want 3")
        sys.exit(1)
    
    joined = " ".join(bad_issues)
    for kind in ["duplicate", "unconnected", "assign"]:
        if kind not in joined:
            print("FAIL: broken netlist missing a " + kind + " fault")
            sys.exit(1)
    
    print("PASS: checker clears the clean netlist and flags 3 faults")

    Common pitfall

    Assuming the routed netlist still matches the RTL skips the proof. Re-run equivalence after physical changes, or a buffering pass owns an unverified function.

    Interview

    Likely probes: what physical design may touch, and what guards it.

    • Buffers, sizes, local structure, clock tree, and thresholds may all move.

    • Function and constraint intent may not: equivalence is re-proven.

    • A sanity checker catches handoff-shape faults before the tools do.

    Check yourself The router buffers a critical path and timing improves. Is anything owed back to verification?

    Yes: an equivalence re-proof. Any netlist edit, however helpful, needs the miter to agree again.

    Check yourself In the checker, why does the broken netlist raise exactly three issues?

    One duplicate instance name, one empty pin connection, and one assign statement. Each rule fires once.

    Related topics

    • Equivalence checking

    • Debugging QoR

    • Physical design course hub

    Previous

    113 / 139

    Next: Flows and Debugging

    Up next

    Up nextFlows and Debugging

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Wire-Load Models and Placement Estimates
    • Congestion and Mapping Choices
    • Floorplan Assumptions