UVMAgent架构设计:从简单到复杂的完整实现
本文将作为一篇全面的技术指南,系统性地探讨UVM Agent的架构设计,从最简单的被动(Passive)Agent,到包含激励器(Sequencer)、驱动器(Driver)和监控器(Monitor)的主动(Active)Agent,再到更复杂的双向Agent,层层递进,帮助读者完整掌握Agent的设计精髓。作为一名资深的数字IC验证专家,我将结合实际项目经验,分享Agent设计中的最佳实践和常见
UVM Agent架构设计:从简单到复杂的完整实现
作者:bc宝懂一点IC
引言
在UVM(Universal Verification Methodology)验证平台中,Agent 是最核心、最基本的组件之一。它封装了对某一特定接口或协议进行激励、监控和检查的完整逻辑,是实现验证环境模块化和可复用性的关键。一个设计良好的Agent能够极大地提高验证平台的搭建效率和可维护性。
本文将作为一篇全面的技术指南,系统性地探讨UVM Agent的架构设计,从最简单的被动(Passive)Agent,到包含激励器(Sequencer)、驱动器(Driver)和监控器(Monitor)的主动(Active)Agent,再到更复杂的双向Agent,层层递进,帮助读者完整掌握Agent的设计精髓。作为一名资深的数字IC验证专家,我将结合实际项目经验,分享Agent设计中的最佳实践和常见误区。
如果您希望系统性学习UVM或对AXI、SystemVerilog等技术感兴趣,欢迎访问我的个人网站 bc宝懂一点IC 或在B站搜索同名频道,那里有更丰富的视频教程和技术文章等着你。
1. UVM Agent的核心职责与基本构成
UVM Agent的核心职责是模拟、监控并验证一个特定接口的行为。根据接口的特性和验证需求,Agent可以被配置为两种主要模式:
- 主动模式 (Active Mode):在此模式下,Agent会主动产生事务(Transaction),并通过Driver将这些事务驱动到DUT的接口上。它通常用于模拟与DUT交互的主设备(Master)。
- 被动模式 (Passive Mode):在此模式下,Agent只负责监控接口上的信号活动,捕获数据并将其转换为事务,但不会主动驱动任何激励。它通常用于模拟与DUT交互的从设备(Slave)或纯粹的协议监视器。
一个标准的UVM Agent通常由以下几个核心组件构成:
| 组件 | 描述 |
|---|---|
| Sequencer (激励器) | 负责从Sequence获取事务,并将其传递给Driver。是事务级激励生成的核心。 |
| Driver (驱动器) | 从Sequencer接收事务,并根据协议要求将其转换为具体的引脚级信号,驱动到DUT接口。 |
| Monitor (监控器) | 持续监控接口的引脚级信号,根据协议规范将信号活动解析为事务,并将其广播出去。 |
| Agent配置对象 | 一个uvm_object,用于控制Agent的运行模式(Active/Passive)、接口信息等。 |

图1: UVM Agent基本架构图
2. 被动Agent (Passive Agent) 的设计
被动Agent是最简单的Agent形式,它只包含一个Monitor,用于“只听不说”。
2.1 设计场景
- 当验证平台需要监控一个从设备接口,而激励由其他组件(如另一个主设备Agent)产生时。
- 在顶层环境中集成一个纯粹的协议检查器(Protocol Checker)。
2.2 实现要点
-
配置对象:通过配置对象中的一个
is_active标志位来控制Agent的模式。class my_agent_config extends uvm_object; uvm_active_passive_enum is_active = UVM_PASSIVE; // ... 其他配置 endclass -
Agent实现:在
build_phase中,根据is_active的值来决定是否实例化Sequencer和Driver。class my_agent extends uvm_agent; my_agent_config m_cfg; my_monitor m_monitor; // ... function void build_phase(uvm_phase phase); super.build_phase(phase); m_monitor = my_monitor::type_id::create("m_monitor", this); if (m_cfg.is_active == UVM_ACTIVE) begin // 只有Active模式才创建Sequencer和Driver m_sequencer = my_sequencer::type_id::create("m_sequencer", this); m_driver = my_driver::type_id::create("m_driver", this); end endfunction // ... endclass
3. 主动Agent (Active Agent) 的设计
主动Agent是功能最完整的形式,包含了Sequencer、Driver和Monitor。
3.1 设计场景
- 模拟一个主设备,如CPU、DMA控制器等,需要主动向DUT发起读写请求。
- 构建一个能够独立完成激励生成和响应检查的验证IP(VIP)。
3.2 实现要点
-
组件实例化:在
build_phase中,当is_active为UVM_ACTIVE时,实例化所有三个核心组件。 -
TLM连接:在
connect_phase中,建立Sequencer和Driver之间的TLM(Transaction-Level Modeling)连接。class my_agent extends uvm_agent; // ... function void connect_phase(uvm_phase phase); if (m_cfg.is_active == UVM_ACTIVE) begin m_driver.seq_item_port.connect(m_sequencer.seq_item_export); end endfunction // ... endclass -
Monitor的广播:Monitor通过其
analysis_port将捕获到的事务广播出去,供Scoreboard或其他订阅者使用。class my_monitor extends uvm_monitor; uvm_analysis_port #(my_transaction) analysis_port; function new(string name, uvm_component parent); super.new(name, parent); analysis_port = new("analysis_port", this); endfunction task run_phase(uvm_phase phase); forever begin my_transaction tr; // 监控引脚,解析事务... analysis_port.write(tr); end endtask endclass
4. 复杂Agent设计:双向与分层
4.1 双向Agent
对于一些复杂的协议(如USB、PCIe),接口既可以作为主设备也可以作为从设备,或者同时具有双向数据流。此时,Agent的设计也需要相应地变得更加复杂。
一种常见的实现方式是在一个Agent中包含两个Driver/Sequencer对,一个用于主设备行为,一个用于从设备行为,并根据配置或运行时状态来决定哪个处于活动状态。
4.2 分层Agent (Layered Agent)
对于分层协议(如以太网协议栈),可以设计分层Agent。高层Agent负责产生高层协议的事务(如TCP包),然后将其传递给底层Agent。底层Agent(如MAC层Agent)再将高层事务分解为底层协议的事务(如以太网帧)并驱动到物理接口。
这种分层结构极大地提高了代码的复用性和可维护性,使得不同层次的协议可以被独立地验证和修改。
结论与最佳实践
设计一个健壮、可复用的UVM Agent是构建高效验证平台的基石。以下是一些关键的最佳实践总结:
- 始终使用配置对象:将Agent的配置(如Active/Passive模式、接口名、时序参数等)集中在配置对象中管理,通过
uvm_config_db传递。 - 清晰的职责划分:确保Driver只负责时序驱动,Monitor只负责协议监控,Sequencer只负责事务中继。不要将协议检查逻辑放在Driver或Monitor中,应由独立的Scoreboard或Checker完成。
- 接口的虚拟化:Agent应通过虚拟接口(Virtual Interface)与物理DUT接口解耦,这是实现可复用性的前提。
- 参数化设计:尽可能地将Agent参数化(如地址位宽、数据位宽),以适应不同配置的DUT。
掌握UVM Agent的设计是每位验证工程师的必备技能。希望本文能为您提供一个清晰的路线图。想要深入探索更多UVM高级话题和实战案例,请务必关注我的B站频道 “bc宝懂一点IC” 和个人网站 bcbao.club。
参考文献
- IEEE Standard for Universal Verification Methodology (UVM), IEEE Std 1800.2-2020.
- Spear, C., & Tumbush, G. (2012). SystemVerilog for Verification: A Guide to Learning the Testbench Language Features. Springer Science & Business Media.
更多推荐



所有评论(0)