UVM 核心类库详解
UVM(Universal Verification Methodology)的核心类库提供了一套标准化的验证组件和机制,是构建高效、可重用验证环境的基础。以下从基类继承关系、核心类功能及关键机制三个维度进行详细解析:
一、基类继承关系
UVM 类库的基类分为 uvm_object 和 uvm_component,二者共同构成验证环境的对象模型:
uvm_void (抽象基类)
├── uvm_object // 轻量级对象(动态创建,无层次结构)
│ ├── uvm_transaction
│ ├── uvm_sequence_item
│ └── uvm_reg_item // 寄存器模型相关
│
└── uvm_component // 重量级组件(静态层次结构,与Phase绑定)
├── uvm_driver
├── uvm_monitor
├── uvm_sequencer
├── uvm_agent
├── uvm_env
└── uvm_test
1. uvm_object 与 uvm_component 的区别
| 特性 | uvm_object | uvm_component |
|---|---|---|
| 生命周期 | 动态创建和销毁(如Transaction) | 仿真开始时创建,结束时销毁 |
| 层次结构 | 无 | 树状结构(通过 parent 参数构建) |
| Phase 机制 | 不参与 | 参与Phase流程(如build/connect) |
| 典型用途 | 事务(Transaction)、配置对象 | 验证组件(Driver、Monitor等) |
二、核心类功能详解
1. uvm_sequence_item
- 作用:事务(Transaction)的基类,封装与DUT交互的数据和协议信息。
- 关键方法:
create():通过Factory创建对象。copy()/clone():对象复制。compare():事务比对。
- 示例:
class my_transaction extends uvm_sequence_item; rand logic [31:0] addr; rand logic [31:0] data; `uvm_object_utils(my_transaction) endclass
2. uvm_sequence
- 作用:生成事务流,控制测试场景。
- 核心方法:
body():定义事务生成逻辑。start():启动Sequence并绑定到Sequencer。
- 示例:
class my_sequence extends uvm_sequence; task body(); `uvm_do_with(req, {req.addr inside {[0x100:0x200];}) endtask endclass
3. uvm_driver
- 作用:将事务转换为DUT接口信号。
- 关键机制:
- 通过
seq_item_port与Sequencer通信。 get_next_item()获取事务,item_done()完成处理。
- 通过
- 示例:
class my_driver extends uvm_driver; virtual task run_phase(uvm_phase phase); forever begin seq_item_port.get_next_item(req); vif.drive(req); seq_item_port.item_done(); end endtask endclass
4. uvm_monitor
- 作用:监测DUT接口,捕获事务并广播。
- 关键机制:
- 使用
uvm_analysis_port发送事务。
- 使用
- 示例:
class my_monitor extends uvm_monitor; uvm_analysis_port #(my_transaction) ap; virtual task run_phase(uvm_phase phase); forever begin @(vif.cb); tr = my_transaction::type_id::create("tr"); ap.write(tr); // 广播事务 end endtask endclass
5. uvm_agent
- 作用:封装Driver、Monitor和Sequencer,支持Active/Passive模式。
- 配置参数:
is_active = UVM_ACTIVE:启用Driver和Sequencer。
- 示例:
class my_agent extends uvm_agent; my_driver driver; my_sequencer sequencer; my_monitor monitor; function void build_phase(uvm_phase phase); if (is_active == UVM_ACTIVE) begin driver = my_driver::type_id::create("driver", this); sequencer = my_sequencer::type_id::create("sequencer", this); end monitor = my_monitor::type_id::create("monitor", this); endfunction endclass
6. uvm_env
- 作用:验证环境的容器,集成多个Agent、Scoreboard等。
- 典型结构:
class my_env extends uvm_env; my_agent agent; my_scoreboard scb; function void build_phase(uvm_phase phase); agent = my_agent::type_id::create("agent", this); scb = my_scoreboard::type_id::create("scb", this); endfunction function void connect_phase(uvm_phase phase); agent.monitor.ap.connect(scb.analysis_export); endfunction endclass
7. uvm_test
- 作用:测试用例的顶层类,配置环境并启动测试。
- 关键任务:
- 通过
uvm_config_db设置全局配置。 - 启动主Sequence。
- 通过
- 示例:
class my_test extends uvm_test; my_env env; function void build_phase(uvm_phase phase); env = my_env::type_id::create("env", this); uvm_config_db#(virtual dut_if)::set(this, "env.agent", "vif", dut_if_handle); endfunction task run_phase(uvm_phase phase); my_sequence seq = my_sequence::type_id::create("seq"); seq.start(env.agent.sequencer); endtask endclass
三、关键机制类
1. uvm_factory
- 作用:动态创建对象和组件,支持类型覆盖(Override)。
- 核心方法:
create_object_by_type()/create_component_by_type()。set_type_override()/set_inst_override()。
2. uvm_config_db
- 作用:全局配置数据库,跨组件传递参数。
- 核心方法:
set():设置配置。get():获取配置。
- 示例:
uvm_config_db#(int)::set(this, "env.agent", "max_trans", 100); uvm_config_db#(int)::get(this, "", "max_trans", max_trans);
3. uvm_report_handler
- 作用:控制UVM消息报告(信息、警告、错误)。
- 关键方法:
set_report_verbosity_level():设置消息详细度。set_report_severity_action():指定严重级别的行为(如忽略警告)。
四、核心类协作示意图
+----------------+ +-----------------+ +------------------+
| uvm_test | | uvm_sequence | | uvm_driver |
| (启动测试环境) |------>| (生成事务流) |<----->| (驱动DUT接口) |
+----------------+ +-----------------+ +------------------+
| | |
v v v
+----------------+ +-----------------+ +------------------+
| uvm_env | | uvm_sequencer | | uvm_monitor |
| (集成子组件) |<------| (协调事务顺序) | | (监测DUT输出) |
+----------------+ +-----------------+ +------------------+
|
v
+----------------+
| uvm_agent |
| (管理Driver/ |
| Monitor) |
+----------------+
五、最佳实践与常见问题
1. 类选择指南
- 需要层次结构 → 继承
uvm_component(如Driver、Agent)。 - 仅需数据封装 → 继承
uvm_object(如Transaction、配置对象)。
2. 常见错误
- 未注册到Factory:未使用
uvm_component_utils或uvm_object_utils宏。 - Phase执行顺序错误:在
build_phase中访问未创建的组件。 - 端口未连接:忘记在
connect_phase中连接TLM端口。
3. 调试技巧
- 打印组件层次:在Test中调用
print_topology()。 - 检查Factory覆盖:使用
factory.print()查看类型替换信息。
六、总结
UVM核心类库通过清晰的继承关系和职责划分,为验证工程师提供了标准化、模块化的开发框架。理解以下要点可快速掌握其精髓:
| 核心类 | 核心职责 | 关键方法/机制 |
|---|---|---|
uvm_component | 构建验证环境层次结构 | Phase机制、Factory创建 |
uvm_sequence | 动态生成事务流 | body()、uvm_do宏 |
uvm_config_db | 跨组件配置传递 | set()/get() |
uvm_factory | 动态对象创建与类型覆盖 | set_type_override() |
通过灵活组合这些类与机制,可高效构建适应复杂场景的验证平台,显著提升验证效率与代码复用性。

344

被折叠的 条评论
为什么被折叠?



