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

  • How to Use This Course
  • Reading Path
  • STA Glossary
  • STA Metrics Reference
  • STA Mastery Cheatsheet
  • Timing Paths and Checks16
  • Constraints & SDC Fundamentals20
  • Delay Graph & Path Analysis16
  • Beyond Setup and Hold16
  • Multi-Corner Multi-Mode Signoff16
    • Corner and Mode Matrix Design
    • Library Sets and Operating Conditions
    • Signoff vs Implementation Views
    • MMMC Debug Playbook
      • Symptoms to Views
      • Per-View Triage
      • Scenario Bisect
      • Reporting by View
  • OCV, AOCV, POCV and Variation16
  • Crosstalk and Noise16
  • ECO and Closure16
  • STA Debug Playbook16
  • STA Interview Prep26
  • Capstone Timing Signoff Lab4
Loading lesson

‹MMMC Debug Playbook
  1. Topics
  2. Static Timing Analysis
  3. Multi-Corner Multi-Mode Signoff
  4. MMMC Debug Playbook
  5. Reporting by View

Part 5 · Multi-Corner Multi-Mode · All levels

Reporting by View

Per-view WNS, TNS and violation counts, plus a union row computed from the worst slack per endpoint, so nothing is counted twice.

On this page

    Why it matters

    Summaries drive decisions, and a wrong summary drives a wrong one. Adding up per-view totals counts an endpoint once for every view it fails in. A union summary counts each endpoint once, at its worst slack. Both are useful, and neither should be mistaken for the other.

    Worked example

    example.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    views = {
        "V1": [-0.05, -0.02, 0.10, 0.20],
        "V2": [-0.03, -0.04, 0.05, 0.30],
        "V3": [0.02, -0.01, 0.00, -0.06],
    }
    def stats(vals):
        neg = [x for x in vals if x < 0]
        return {"wns": round(min(vals), 3), "tns": round(sum(neg), 3), "nvp": len(neg)}
    per_view = {v: stats(s) for v, s in views.items()}
    assert per_view["V1"] == {"wns": -0.05, "tns": -0.07, "nvp": 2}
    assert per_view["V2"] == {"wns": -0.04, "tns": -0.07, "nvp": 2}
    assert per_view["V3"] == {"wns": -0.06, "tns": -0.07, "nvp": 2}
    union_vals = [min(col) for col in zip(*views.values())]        # worst slack per endpoint over all views
    union = stats(union_vals)
    assert union == {"wns": -0.06, "tns": -0.15, "nvp": 3}
    naive_tns = round(sum(p["tns"] for p in per_view.values()), 3)
    naive_nvp = sum(p["nvp"] for p in per_view.values())
    assert (naive_tns, naive_nvp) == (-0.21, 6)
    print("PASS: union", union, "; naive sum would say TNS", naive_tns, "and", naive_nvp, "violating endpoints")

    Row

    WNS (ns)

    TNS (ns)

    Violating endpoints

    V1

    -0.05

    -0.07

    2

    V2

    -0.04

    -0.07

    2

    V3

    -0.06

    -0.07

    2

    Union (worst per endpoint)

    -0.06

    -0.15

    3

    Naive sum of views

    n/a

    -0.21

    6

    Four endpoints in three views give a union of three violating endpoints with TNS of -0.15 ns, but adding the three per-view rows claims six violations and -0.21 ns. The union is the number of endpoints that must be fixed; the per-view rows show where to look. Overall WNS is the same either way, the minimum over everything (-0.06 ns).

    What the review looks for

    • Summaries state whether they are per view or union; the headline number is the union.

    • Setup and hold are never mixed in one total.

    • The trend of the union number over runs is the closure indicator, not any single run's number.

    Common pitfall

    Quoting the sum of per-view TNS as the total. It overstates the work and confuses comparisons between runs with different view lists.

    Interview

    Give the definition of union TNS: sum over endpoints of the worst negative slack across views.

    Check yourself Why are the per-view WNS values useful even though the union row exists?

    They show which view owns the worst slack: the union hides that, and it is the view where the fix should be checked first.

    Related topics

    • Scenario Bisect

    Previous

    89 / 183

    Next: OCV, AOCV, POCV and Variation

    Up next

    Up nextOCV, AOCV, POCV and Variation

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Symptoms to Views
    • Per-View Triage