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)、接口信息等。

UVM Agent Architecture
图1: UVM Agent基本架构图

2. 被动Agent (Passive Agent) 的设计

被动Agent是最简单的Agent形式,它只包含一个Monitor,用于“只听不说”。

2.1 设计场景

  • 当验证平台需要监控一个从设备接口,而激励由其他组件(如另一个主设备Agent)产生时。
  • 在顶层环境中集成一个纯粹的协议检查器(Protocol Checker)。

2.2 实现要点

  1. 配置对象:通过配置对象中的一个is_active标志位来控制Agent的模式。

    class my_agent_config extends uvm_object;
      uvm_active_passive_enum is_active = UVM_PASSIVE;
      // ... 其他配置
    endclass
    
  2. 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 实现要点

  1. 组件实例化:在build_phase中,当is_activeUVM_ACTIVE时,实例化所有三个核心组件。

  2. 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
    
  3. 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


参考文献

  1. IEEE Standard for Universal Verification Methodology (UVM), IEEE Std 1800.2-2020.
  2. Spear, C., & Tumbush, G. (2012). SystemVerilog for Verification: A Guide to Learning the Testbench Language Features. Springer Science & Business Media.
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐