第1章:UVM环境搭建——从零开始跑起你的第一个Hello World
各位同学好,我是老李。做芯片验证十几年了,UVM这东西从2008年刚冒头我就开始折腾。今天咱们聊聊环境搭建——说白了,就是让你电脑能跑UVM。
很多新手一上来就卡在环境上,装了半天跑不通,心态直接崩了。我当年也踩过这个坑,所以这一章咱们把每一步都掰开揉碎了讲清楚。
1.1 UVM库的获取与安装
UVM库其实就是一个SystemVerilog的类库包。你不需要自己写,直接用现成的就行。
从哪里获取?
- Accellera官网:UVM标准制定组织,下载最新版(目前是UVM 1.2)
- EDA工具自带:VCS、QuestaSim都内置了UVM库,路径一般在安装目录下
- GitHub:有些开源版本,但我建议用官方标准版
安装步骤(以Linux环境为例):
# 下载UVM-1.2.tar.gz
tar -xzvf UVM-1.2.tar.gz
cd UVM-1.2
# 编译库文件(可选,大部分工具直接引用源码)
make
我的习惯:我一般把UVM库放在
/tools/uvm/ 下,然后在每个项目里用软链接引用。这样升级库版本时,改一个地方就行。
1.2 仿真工具配置
目前主流工具就两个:Synopsys的VCS和Mentor(现Siemens)的QuestaSim。我两个都用过,各有千秋。
1.2.1 VCS配置
VCS是商业工具,需要license。配置其实不复杂:
# 设置环境变量
export VCS_HOME=/tools/synopsys/vcs/O-2018.09
export PATH=$VCS_HOME/bin:$PATH
export UVM_HOME=/tools/uvm/uvm-1.2
# 编译UVM测试
vcs -sverilog -ntb_opts uvm-1.2 \
-f filelist.f \
-l compile.log
这里有个坑:-ntb_opts uvm-1.2 这个选项,不同VCS版本支持的UVM版本不一样。我遇到过同事用VCS 2016去编译UVM 1.2的代码,结果报了一堆错。后来查文档才发现,VCS 2016默认只支持到UVM 1.1d。
避坑指南:我曾经因为版本不匹配,浪费了整整一天。建议先用
vcs -help | grep uvm 看看你的工具支持哪个UVM版本。
1.2.2 QuestaSim配置
QuestaSim相对友好一些,尤其是对于教学和调试:
# 设置环境变量
export QUESTA_HOME=/tools/mentor/questa/2020.1
export PATH=$QUESTA_HOME/bin:$PATH
# 编译UVM库(只需一次)
vlib work
vlog -work work $QUESTA_HOME/verilog_src/uvm-1.2/src/uvm_pkg.sv
# 编译你的测试
vlog -sv -work work \
-L mtiAvm \
-L mtiUvm \
-L mtiOvm \
top.sv
我个人更喜欢QuestaSim的GUI界面,调试时能看到波形和变量值,非常直观。VCS虽然也能用DVE或Verdi,但配置起来稍微麻烦点。
1.3 第一个UVM Hello World
好了,环境搭好了,咱们写个最简单的UVM程序。别怕,就几行代码。
文件结构:
hello_uvm/
├── test.sv # 测试用例
├── top.sv # 顶层模块
└── filelist.f # 文件列表
test.sv:
// 引入UVM包
`include "uvm_macros.svh"
import uvm_pkg::*;
// 定义一个最简单的测试类
class hello_test extends uvm_test;
`uvm_component_utils(hello_test)
function new(string name, uvm_component parent);
super.new(name, parent);
endfunction
// 在build_phase中打印信息
function void build_phase(uvm_phase phase);
super.build_phase(phase);
`uvm_info("HELLO", "Hello, UVM World!", UVM_LOW)
endfunction
endclass
// 顶层模块
module top;
initial begin
// 运行测试
run_test("hello_test");
end
endmodule
编译与运行:
# VCS
vcs -sverilog -ntb_opts uvm-1.2 test.sv top.sv
./simv
# QuestaSim
vlib work
vlog -sv test.sv top.sv
vsim -c -do "run -all; quit" top
运行成功后,你会看到类似这样的输出:
UVM_INFO @ 0: reporter [HELLO] Hello, UVM World!
嗯,这里要注意:
run_test() 这个函数是UVM自带的,它会自动创建你指定的测试类,并调用它的各个phase。你不需要手动new对象。
1.4 知识体系总览
为了让你对整个UVM环境搭建有个全局认识,我画了张图:
1.5 常见问题与调试技巧
你想想看,环境搭建最怕什么?就是编译报错。我总结几个高频问题:
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
Cannot find package uvm_pkg |
UVM库路径未正确设置 | 检查 UVM_HOME 环境变量,或使用 -uvmhome 选项 |
Unrecognized option -ntb_opts |
VCS版本太老,不支持该选项 | 升级VCS,或改用 -uvm 选项 |
run_test() not found |
未正确导入UVM包 | 确认写了 import uvm_pkg::*; |
License checkout failed |
VCS/QuestaSim license不可用 | 检查 LM_LICENSE_FILE 或 SNPSLMD_LICENSE_FILE |
调试小技巧:如果编译报错看不懂,试试加
-l compile.log 把日志输出到文件,然后用 grep -i error compile.log 过滤。我每次都是这么干的,比在终端里翻屏快多了。
好了,这一章的内容就到这儿。环境搭好了,Hello World也跑通了,后面咱们就可以开始真正写UVM组件了。
可可精品资料库