UVM is not a separate tool you install like a simulator - it's a SystemVerilog class library that your simulator compiles alongside your testbench code. So "installing UVM" really means getting a copy of the UVM source files (or using the one already bundled with your simulator) and pointing your compile command at it.

This article walks through both routes: using the UVM library that ships with your simulator, and downloading the official Accellera reference implementation yourself when you need a specific version or want to run on EDA Playground.

5 min read | Intermediate Level

What You'll Learn

  • Why UVM doesn't need a traditional "installer"
  • Where to get the official UVM source code from Accellera
  • How to point your simulator at the UVM library using -incdir and $UVM_HOME
  • The easiest way to start running UVM code with zero setup

UVM Is a Library, Not an Application

Most commercial simulators - Synopsys VCS, Siemens (formerly Mentor) Questa, and Cadence Xcelium - ship with a built-in copy of UVM, so in many cases there's nothing to download at all. You just tell the simulator which UVM version to use, and it compiles uvm_pkg.sv from its own installation directory.

You only need to manually download UVM when:

  • Your simulator doesn't bundle UVM (or bundles an older version than you need)
  • You want to use a specific UVM release for compatibility with existing code
  • You're setting up a lightweight or open-source simulation flow

The current standard release is UVM 2020.3.1, the IEEE 1800.2 reference implementation maintained by Accellera. Older versions like UVM 1.2 still work and are widely seen in legacy codebases, but new projects should generally start with the current 1800.2 release unless your simulator or company standard says otherwise.

Where to Download UVM

The official source is the Accellera Systems Initiative downloads page. There are two ways to get the same code:

Option 1: Accellera Tarball

Go to accellera.org/downloads/standards/uvm and download the UVM v2020.3.1 Library Code for IEEE 1800.2. This is a .tar.gz archive, the same format UVM has always shipped in.

Option 2: Accellera's Official GitHub Repository

Accellera also publishes the same releases on GitHub at github.com/accellera-official/uvm-core. If you're comfortable with git, this is convenient for pulling a specific tagged release or staying current with bug-fix patches between releases.

If your company or coursework still targets UVM 1.2, Accellera keeps every past release available under "Previous Releases" on the same downloads page - you don't need to hunt for an old mirror.

Installing UVM on Linux

Once you have the archive, the process is the same regardless of which UVM version you picked.

Step 1: Transfer the file

Copy the downloaded .tar.gz file into your Linux workarea using scp, WinSCP, or any file transfer tool you normally use.

Step 2: Extract it

From a terminal in your workarea, run:

$> tar -xvf UVM-1800.2-2020.3.1.tar.gz

This creates a folder containing the UVM source - the exact folder name depends on the release you downloaded (for example, UVM-1800.2-2020.3.1).

Step 3: Point your simulator at it

Your simulator needs the path to UVM's source directory so it can find uvm_pkg.sv and uvm_macros.svh. Most simulators accept an include-directory switch for this, for example -incdir [path to UVM folder]/src.

Rather than retyping the full path every time, it's common to set an environment variable, usually called $UVM_HOME, that points to your extracted UVM folder.

Step 4: Find your shell

$> echo $0

This tells you whether you're running bash, tcsh, or something else, since the syntax for setting an environment variable differs between shells.

Step 5: Set the environment variable

# For tcsh
$> setenv UVM_HOME [path_to_your_workarea]/UVM-1800.2-2020.3.1

# For bash
$> export UVM_HOME=[path_to_your_workarea]/UVM-1800.2-2020.3.1

Now you can compile with -incdir $UVM_HOME/src instead of typing out the full path each time. Check your specific simulator's documentation for the exact compile-time switches it expects, since the flag name (-incdir, +incdir+, etc.) varies between tools.

Adding $UVM_HOME to your shell's startup file (like .bashrc) makes it persist across terminal sessions. If you only set it with export in a single terminal, it disappears once you close that terminal.

Easier Ways to Practice UVM

If your goal is just to learn UVM and run small examples - not set up a production verification flow - downloading and configuring the library yourself is more setup than you need. Three lower-friction options:

1. EDA Playground (Recommended for Beginners)

EDA Playground is a free, browser-based simulation environment. Pick a simulator from the Tools & Simulators menu, then select UVM/OVM from the methodology dropdown - no download, no environment variables, no local installation. This is the fastest way to try the code examples throughout this tutorial.

2. Simulator with UVM Already Bundled

If your university or company already has a license for VCS, Questa, or Xcelium, check the installation directory first. There's a very good chance UVM is already sitting in a subfolder like $VCS_HOME/etc/uvm or similar, and you can skip the Accellera download entirely.

3. Open-Source Simulators

Open-source tools like Verilator have been adding SystemVerilog class support, though UVM compatibility varies by tool and version. If you're exploring this route, check the simulator's current documentation for UVM support status before committing to it for coursework or a project.

Common Mistakes

Mistake #1: Assuming UVM Needs a Traditional Installer

There's no install.sh or setup wizard. UVM is just SystemVerilog source files that get compiled into your testbench like any other package. If you're searching for an "installer," you're looking for the wrong thing - you need the source tarball and a compile-time include path.

Mistake #2: Forgetting to Persist $UVM_HOME

Wrong: Setting $UVM_HOME with export in one terminal, then opening a new terminal later and wondering why the variable is gone.
Right: Add the export or setenv line to your shell's startup file (.bashrc, .cshrc, etc.) so it's set automatically every time you open a terminal.

Why? Environment variables set in a terminal session only exist for that session unless they're written into a startup file that runs automatically.

Mistake #3: Mixing UVM Versions Across a Project

If one engineer compiles against UVM 1.2 and another against UVM 2020.3.1 in the same project, you can hit subtle compatibility issues - some APIs were deprecated or changed behavior between major releases. Agree on one UVM version per project and make sure everyone's $UVM_HOME points to the same release.

Where Does This Matter in Real Projects?

Large verification teams often pin their entire project to one specific UVM release for the life of the project, even after a newer version comes out. Re-validating an entire regression suite against a new UVM release takes real engineering time, so teams upgrade deliberately rather than automatically.

Practice Exercise

Challenge: Set Up Your First UVM Environment

Open EDA Playground, create a new playground, select a simulator that supports UVM (such as Aldec Riviera-PRO, which doesn't require account validation), and select UVM from the methodology dropdown. Paste in a one-line test that just prints a message using `uvm_info and run it.

Hint

You'll need a minimal module that includes uvm_macros.svh and imports uvm_pkg::* before you can call `uvm_info.

Solution

`include "uvm_macros.svh"
import uvm_pkg::*;

module test;
  initial begin
    `uvm_info("TEST", "UVM environment is working!", UVM_LOW)
  end
endmodule

If this prints a UVM_INFO line in the results pane, your UVM setup is working correctly.

Summary

In this tutorial, you learned:

  • UVM is a SystemVerilog class library, not a standalone application - there's no traditional installer
  • Most commercial simulators already bundle a UVM library, so check there before downloading anything
  • The official source is Accellera's downloads page, with the current release being UVM 2020.3.1 (IEEE 1800.2)
  • You point your simulator at UVM using an include-directory switch, commonly paired with a $UVM_HOME environment variable
  • EDA Playground is the fastest way to start running UVM code with no local setup at all
Did you find what you were looking for?

Quiz

Test Your Knowledge

1 of 5 Score: 0 / 5