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:
| Symbol | Value | Typical use |
|---|---|---|
| UVM_NONE | 0 | Always prints; banners, test PASS/FAIL, config summaries |
| UVM_LOW | 100 | Per-test milestones; a handful of lines per run |
| UVM_MEDIUM | 200 | Default. Per-transaction headlines |
| UVM_HIGH | 300 | Field-level detail inside drivers/monitors |
| UVM_FULL | 400 | Internal state, loop iterations, debug-only |
| UVM_DEBUG | 500 | Deepest 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.
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.
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.
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_HIGHacross 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_verbositycombines 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.