Verification

UVM Verbosity Levels

By CourseTron Team ·  7 min read ·  Updated Oct 2026 💬 𝕏 in f
Table of Contents
    ? Print / Save as PDF

    In short: UVM verbosity levels (UVM_NONE, UVM_LOW, UVM_MEDIUM, UVM_HIGH, UVM_FULL, UVM_DEBUG) are numeric thresholds that let the report server filter which `uvm_info messages print, so you can crank detail up on one component for debug without drowning in log noise from the whole testbench.

    Every seasoned verification engineer has lived the same moment: a 400,000-line simulation log, a failing assertion somewhere inside it, and a deadline. The difference between a ten-minute triage and an afternoon of scrolling is almost always how well the testbench uses the UVM reporting system. Verbosity is the dial that controls that signal-to-noise ratio, and understanding it is a staple of any VLSI verification interview.

    What verbosity actually is

    In UVM, verbosity is not a severity. Severity answers "how bad is this?" (UVM_INFO, UVM_WARNING, UVM_ERROR, UVM_FATAL). Verbosity answers "how chatty is this?" The two are orthogonal. A message issued with `uvm_info("DRV", "sending packet", UVM_HIGH) carries informational severity but a high verbosity, meaning it only prints when the simulation is configured to be that talkative.

    The six predefined levels are a simple integer enum defined in uvm_object_globals.svh:

    SymbolValueTypical use
    UVM_NONE0Always prints; banners, test PASS/FAIL, config summaries
    UVM_LOW100Per-test milestones; a handful of lines per run
    UVM_MEDIUM200Default. Per-transaction headlines
    UVM_HIGH300Field-level detail inside drivers/monitors
    UVM_FULL400Internal state, loop iterations, debug-only
    UVM_DEBUG500Deepest firehose, rarely committed

    The default verbosity is UVM_MEDIUM (200). A message prints only when its level is less than or equal to the configured threshold. So at the default, everything tagged UVM_NONE, UVM_LOW and UVM_MEDIUM appears; UVM_HIGH and above stay silent.

    Default threshold 200: what prints UVM_NONE 0 prints UVM_LOW 100 prints UVM_MEDIUM 200 prints UVM_HIGH 300 silent UVM_FULL 400 silent UVM_DEBUG 500 silent dashed line = threshold 200 (UVM_MEDIUM) CourseTron · coursetron.com
    Against the default threshold of 200, UVM_NONE, UVM_LOW and UVM_MEDIUM print while UVM_HIGH, UVM_FULL and UVM_DEBUG stay silent.

    The filtering rule, with numbers

    The report server performs a single comparison per message. If you set the environment threshold to UVM_LOW (100), then a `uvm_info(..., UVM_MEDIUM) call (200) is dropped because 200 > 100. Flip the threshold to UVM_HIGH (300) and the same call now prints, because 200 ≤ 300. This is why the levels are spaced 100 apart — the gaps leave room, and because the comparison is numeric you can even pass custom integers like 250, though that hurts readability and is discouraged.

    One comparison per message: level ≤ threshold `uvm_info level = 300 (HIGH) Report server threshold = 200 300 ≤ 200 ? NO DROPPED `uvm_info level = 100 (LOW) Report server threshold = 200 100 ≤ 200 ? YES PRINTED CourseTron · coursetron.com
    The report server compares each message's level against the active threshold (default 200). Lower numbers survive; higher numbers are discarded before any string formatting cost is paid.

    Setting verbosity: command line vs. code

    The most common lever is the simulator command line, honored identically by Synopsys VCS, Cadence Xcelium and Siemens Questa:

    • +UVM_VERBOSITY=UVM_HIGH — raises the global threshold for the entire run.
    • +uvm_set_verbosity=uvm_test_top.env.agent.drv,_ALL_,UVM_FULL,time,0 — surgically raises verbosity for one component (and its ID filter) at a given phase and time.

    Inside the testbench you can call set_report_verbosity_level_hier(UVM_HIGH) on a component to raise the threshold for it and everything below it, or set_report_id_verbosity to target a single message ID. Doing this from build_phase is cleaner than hardcoding, because it keeps debug settings out of the DUT-facing logic.

    Because the verbosity check happens before the message is formatted, writing most of your trace output at UVM_HIGH or UVM_FULL costs almost nothing at the default MEDIUM level. The string concatenation and $sformatf work is skipped entirely for filtered messages — a real performance win in long gate-level runs.

    A worked driver example

    Consider an AXI driver. You want a one-line "beat sent" note for routine runs, but full address/data/strobe decode only when chasing a bug:

    • `uvm_info("AXI_DRV", $sformatf("beat %0d sent", i), UVM_MEDIUM) — visible by default.
    • `uvm_info("AXI_DRV", $sformatf("addr=%0h data=%0h wstrb=%b", a, d, s), UVM_HIGH) — silent until you ask for it.

    When regression passes, your log stays a tidy few hundred lines. When a single seed fails, you re-run that one seed with +uvm_set_verbosity=...drv,AXI_DRV,UVM_HIGH,time,0 and get the full decode for the driver alone — the scoreboard and other agents stay quiet. This targeted approach is the habit that separates efficient debug from log-grepping marathons, and it is exactly the discipline taught in professional industry VLSI training programs.

    Raising the threshold reveals deeper messages configured threshold NONE 0 LOW 100 MEDIUM 200 HIGH 300 FULL 400 DEBUG 500 Default = MEDIUM (200); bar sweeps from NONE up to DEBUG. CourseTron · coursetron.com
    As the configured threshold sweeps from NONE to DEBUG, progressively more of the testbench's instrumented messages pass the filter and reach the log.

    Verbosity and the UVM_INFO count

    A subtle interview favorite: filtered messages do not increment any report counter, and verbosity never affects warnings, errors or fatals — those always print regardless of level because they are controlled by their action/severity, not verbosity. So turning verbosity down to UVM_NONE will not hide a real UVM_ERROR; it only quiets the informational chatter. This decoupling is deliberate: you should never silence a failure just by lowering detail.

    Common pitfalls

    • Everything at UVM_MEDIUM. If all trace lines use the default, you lose the ability to dial detail up and down. Reserve MEDIUM for headlines, push detail to HIGH/FULL.
    • Relying on global verbosity in regression. A global +UVM_VERBOSITY=UVM_HIGH across 2,000 seeds can balloon logs into gigabytes and slow the farm. Prefer per-component overrides.
    • Confusing verbosity with the message ID filter. IDs (the first argument) and verbosity are separate knobs; set_report_id_verbosity combines them for precise control.

    The mechanics behind the `uvm_info/`uvm_warning family are worth a dedicated read — see our companion piece on UVM reporting macros, and if you are building a full environment, our walkthrough of the UVM report catcher and callbacks shows how to post-process messages the server has already generated.

    Ready to master verification debug end to end? Our CourseTron UVM & SystemVerilog course drills verbosity, phasing, scoreboards and real coverage closure on industry-grade testbenches.

    FAQ

    What is the default UVM verbosity level?

    UVM_MEDIUM, which has the integer value 200. Any message tagged at or below 200 (NONE, LOW, MEDIUM) prints unless you change the threshold.

    Does lowering verbosity hide UVM_ERROR messages?

    No. Verbosity only filters informational (UVM_INFO) messages. Warnings, errors and fatals are governed by severity and actions, so they still print even at UVM_NONE.

    How do I raise verbosity for just one component?

    Use the command-line switch +uvm_set_verbosity=,,,, or call set_report_verbosity_level_hier() on that component in build_phase. This avoids flooding the whole log.

    Is there a performance benefit to tagging messages UVM_HIGH?

    Yes. The report server checks the level before formatting the string, so high-verbosity messages cost almost nothing when the threshold is at the default — their $sformatf work is skipped entirely.

    Advertisement