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

  • UVM Foundations6
  • UVM Phases & Simulation Lifecycle78
  • Factory & Configuration30
  • Transaction-Level Modeling (TLM)30
  • UVM Sequences & Stimulus30
  • UVM Agents & Protocol VIP54
  • Environment & Test Classes48
  • Scoreboards, Models & Coverage in UVM26
    • Scoreboard Architecture: Expected vs Actual
    • Reference Models: Choosing the Right Fidelity
    • Predictors: uvm_reg_predictor & Bus-to-RAL
    • Functional Coverage in UVM Environments
    • UVM Reporting, Verbosity & Message IDs
      • UVM Reporting Architecture
      • Severities and Actions
      • Message IDs and Verbosity Control
      • Report Catchers
      • PASS/FAIL, Max Quit Count, and Debug Playbook
  • UVM Register Abstraction Layer (RAL)36
  • Advanced UVM Topics32
  • Senior UVM Prep & Interviews72
  • Coding Practice47
Loading lesson

‹UVM Reporting, Verbosity & Message IDs
  1. Topics
  2. UVM Verification
  3. Scoreboards, Models & Coverage in UVM
  4. UVM Reporting, Verbosity & Message IDs
  5. Report Catchers

Part 8 · Checking & Coverage · Intermediate

Report Catchers

uvm_report_catcher demote/promote, THROW vs CAUGHT, and VIP noise management.

On this page

    What catchers do

    A uvm_report_catcher intercepts messages between the report handler and the report server. Use catchers to demote known-benign VIP errors to warnings, suppress internal VIP debug noise, or promote warnings to errors for specific IDs you want to fail on.

    Diagram
    Legend: [UVM]
    
      CATCHER FLOW
    
      uvm_error("VIP_KNOWN_ERR", "benign timeout in VIP")
           │
           ▼
      report_handler (passes — uvm_error not verbosity-gated)
           │
           ▼
      vip_catcher.catch()
           │
           ├─ get_id() == "VIP_KNOWN_ERR"?
           │     YES → set_severity(UVM_WARNING)  ← demote
           │           return THROW
           │
           ▼
      report_server
           │
           ├─ UVM_WARNING count++ (not UVM_ERROR)
           └─ Test may still PASS ✓
    
      If return CAUGHT instead of THROW:
           └─ Message never reaches server → no count at all

    Catcher implementation

    design.sv
    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
    class vip_catcher extends uvm_report_catcher;
      `uvm_object_utils(vip_catcher)
    
      function new(string name = "vip_catcher");
        super.new(name);
      endfunction
    
      function action_e catch();
        // Demote known benign VIP error to warning
        if (get_severity() == UVM_ERROR && get_id() == "VIP_KNOWN_ERR") begin
          set_severity(UVM_WARNING);
          set_message({"[DEMOTED] ", get_message()});
          return THROW;  // modified message continues to server
        end
    
        // Suppress internal VIP debug entirely
        if (get_id() == "VIP_INTERNAL")
          return CAUGHT;  // swallow — no server update
    
        return THROW;  // all other messages pass through unchanged
      endfunction
    endclass
    
    // Register globally in test build_phase
    function void build_phase(uvm_phase phase);
      super.build_phase(phase);
      uvm_report_cb::add(null, vip_catcher::type_id::create("vip_c"));
    endfunction

    THROW vs CAUGHT and audit discipline

    Return value semantics

    Diagram
    Return value    Message reaches server?   Counter updated?
    ──────────────────────────────────────────────────────────────────
    THROW           YES (possibly modified)     YES (at new severity)
    CAUGHT          NO                          NO
    
    Use THROW when: demoting error→warning (still want visibility)
    Use CAUGHT when: suppressing known noise entirely (VIP internal debug)

    Catcher audit checklist

    1. Document every catcher with the VIP release version and known issue ID.

    2. Review catchers at each VIP upgrade — the known issue may be fixed.

    3. Never catch real DUT bug IDs (SCB_MISMATCH, RAL_MIRROR_FAIL).

    4. Log demoted messages at UVM_LOW so audit trail exists in regression logs.

    5. Count active catchers in report_phase — unexpected catcher count = config bug.

    • THROW — message continues to server (possibly demoted); counter updated at new severity.

    • CAUGHT — swallow message entirely; no counter increment.

    • Register with uvm_report_cb::add(null, catcher) for global effect.

    • Audit catchers at VIP upgrades — demoted bugs hide real failures.

    Key takeaways

    • Catchers for known benign VIP errors — not for real DUT bug IDs.

    • THROW for demotion (keep visibility); CAUGHT for suppression (silent).

    • Document and audit catchers — they directly affect PASS/FAIL counts.

    Common pitfalls

    • Catcher on SCB_MISMATCH or RAL_MIRROR_FAIL — hides real DUT bugs.

    • CAUGHT on uvm_error — error count never increments, test falsely passes.

    • Stale catcher after VIP fix — real new bug demoted to warning silently.

    Previous

    301 / 489

    Next: PASS/FAIL, Max Quit Count, and Debug Playbook

    Up next

    Up nextPASS/FAIL, Max Quit Count, and Debug Playbook

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • UVM Reporting Architecture
    • Severities and Actions