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
-incdirand$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_HOMEenvironment variable - EDA Playground is the fastest way to start running UVM code with no local setup at all