2. UVM框架基础回顾:UVM核心概念、树形结构与phase机制

在进入硬件加速部署之前,必须牢固掌握UVM框架的核心概念。UVM(Universal Verification Methodology)基于SystemVerilog构建,其核心组件与机制构成了验证环境的基本骨架。本章将系统回顾UVM的四大核心组件(sequence、driver、monitor、scoreboard)、UVM树形结构以及phase机制,为后续的硬件加速部署打下坚实基础。

2.1 UVM核心组件

UVM验证环境由多个标准化的组件构成,每个组件承担特定的职责。下表列出了最核心的四个组件及其功能:

组件 基类 核心职责 典型操作
sequence uvm_sequence 生成并组织事务级激励 body() 任务中创建并发送 transaction
driver uvm_driver 将事务级激励转换为接口级信号 从 seq_item_port 获取 item,驱动到 DUT 接口
monitor uvm_monitor 被动采集接口信号并打包为事务 监测接口信号变化,组装 transaction 并发送至 analysis_port
scoreboard uvm_scoreboard 比对预期结果与实际结果 通过 analysis_export 接收 monitor 数据,执行比对
关键理解: sequence 负责“生成什么”,driver 负责“如何驱动”,monitor 负责“采集了什么”,scoreboard 负责“结果是否正确”。这四个组件构成了 UVM 验证环境的数据流闭环。

2.1.1 Sequence 与 Driver 的交互机制

sequence 与 driver 之间通过 sequencer 进行通信。sequence 在 body() 中创建 transaction 对象,并通过 start_item() 和 finish_item() 发送给 sequencer;driver 则通过 seq_item_port.get_next_item() 获取 item,驱动完成后调用 item_done() 通知 sequencer。这种握手机制保证了激励的有序传递。

// sequence 端示例
class my_sequence extends uvm_sequence #(my_transaction);
  `uvm_object_utils(my_sequence)
  task body();
    my_transaction tr;
    repeat(10) begin
      tr = my_transaction::type_id::create("tr");
      start_item(tr);
      // 随机化事务
      assert(tr.randomize());
      finish_item(tr);
    end
  endtask
endclass

// driver 端示例
class my_driver extends uvm_driver #(my_transaction);
  `uvm_component_utils(my_driver)
  task run_phase(uvm_phase phase);
    forever begin
      seq_item_port.get_next_item(req);
      // 将事务驱动到接口
      drive_transaction(req);
      seq_item_port.item_done();
    end
  endtask
endclass

2.1.2 Monitor 与 Scoreboard 的数据通路

monitor 通过 analysis_port 将采集到的 transaction 广播出去;scoreboard 则通过 analysis_export 接收这些 transaction。这种基于 TLM(Transaction-Level Modeling)的通信方式实现了组件间的松耦合。

// monitor 端示例
class my_monitor extends uvm_monitor;
  `uvm_component_utils(my_monitor)
  uvm_analysis_port #(my_transaction) ap;
  
  function new(string name, uvm_component parent);
    super.new(name, parent);
    ap = new("ap", this);
  endfunction
  
  task run_phase(uvm_phase phase);
    my_transaction tr;
    forever begin
      tr = my_transaction::type_id::create("tr");
      // 采集接口信号并填充 tr
      collect_transaction(tr);
      ap.write(tr);  // 发送至 scoreboard
    end
  endtask
endclass

// scoreboard 端示例
class my_scoreboard extends uvm_scoreboard;
  `uvm_component_utils(my_scoreboard)
  uvm_analysis_imp #(my_transaction, my_scoreboard) analysis_imp;
  
  function new(string name, uvm_component parent);
    super.new(name, parent);
    analysis_imp = new("analysis_imp", this);
  endfunction
  
  function void write(my_transaction tr);
    // 执行比对逻辑
    compare_transaction(tr);
  endfunction
endclass

2.2 UVM树形结构

UVM采用树形层次结构来组织验证环境中的所有组件。每个组件都有一个唯一的父节点(root节点为uvm_top),通过 create() 方法创建时指定父节点指针。这种树形结构带来了以下优势:

  • 自动资源管理: 父节点负责子节点的创建、配置和销毁
  • 层次化配置: 配置可以沿树形结构向下传递
  • 统一phase调度: phase机制沿树形结构自上而下或自下而上执行
  • 工厂覆盖: 树形结构支持按层次进行类型覆盖
树形结构核心规则: 所有 uvm_component 派生类在构建时都必须指定 parent 参数。只有 uvm_test 的 parent 为 null,其余组件均以 uvm_test 为根节点形成树。

下图展示了典型的UVM验证环境树形结构:

UVM验证环境树形结构 my_test (uvm_test) my_env (uvm_env) my_agent (uvm_agent) my_sb (uvm_scoreboard) sequencer (uvm_sequencer) driver (uvm_driver) monitor (uvm_monitor) 树形结构关键规则: • 每个组件有且仅有一个父节点(root节点为 uvm_top) • 组件通过 new() 函数中的 parent 参数建立父子关系 • phase 调度沿树形结构执行:build_phase 自上而下,connect_phase 自下而上 • 配置数据库 (uvm_config_db) 支持按树形路径进行层次化配置

2.3 UVM Phase机制

UVM phase机制为验证环境的启动、运行和关闭提供了统一的时序控制。所有组件按照预定义的phase顺序执行,确保环境初始化和数据流建立的正确性。Phase分为两大类:

Phase类别 执行顺序 典型用途 是否消耗仿真时间
build_phase 自上而下 创建子组件、配置对象 否(function)
connect_phase 自下而上 连接TLM端口、建立通信通路 否(function)
end_of_elaboration_phase 自上而下 打印环境拓扑、最终配置检查 否(function)
start_of_simulation_phase 自上而下 初始化仿真状态、打印横幅 否(function)
run_phase 并行执行 驱动激励、采集数据、执行比对 是(task)
extract_phase 自下而上 从组件中提取最终数据 否(function)
check_phase 自下而上 检查断言、报告错误计数 否(function)
report_phase 自上而下 生成最终测试报告 否(function)
final_phase 自上而下 清理资源、关闭文件 否(function)
硬件加速部署关键点: run_phase 是唯一消耗仿真时间的 phase,也是硬件加速器需要重点处理的阶段。在硬件加速环境中,run_phase 中的循环和等待操作需要被映射到硬件时钟域,而其他 function phase 仍可在软件侧执行。

下图展示了UVM phase的执行流程:

UVM Phase 执行流程 build_phase (自上而下) connect_phase (自下而上) end_of_elaboration_phase start_of_simulation_phase run_phase (并行执行,消耗仿真时间) 包含 reset / configure / main / shutdown 等子phase extract_phase → check_phase report_phase → final_phase 硬件加速部署时,run_phase 需要被映射到硬件时钟域,其余 function phase 保留在软件侧执行。

2.4 核心概念在硬件加速中的映射

在硬件加速部署场景下,UVM核心概念需要重新审视其实现方式:

  • Sequence → 硬件序列生成器: sequence 的随机化和事务生成逻辑需要被综合到硬件中,或通过预生成的事务列表驱动
  • Driver → 硬件驱动逻辑: driver 的时序驱动逻辑直接映射为硬件状态机,与DUT接口紧密耦合
  • Monitor → 硬件采集逻辑: monitor 的信号采集逻辑需要与DUT时钟域同步,避免亚稳态
  • Scoreboard → 硬件比对器: scoreboard 的比对逻辑可以部分硬件化,但复杂比对仍需软件辅助
  • 树形结构 → 硬件层次映射: 树形结构指导硬件加速器的模块划分和接口定义
  • Phase机制 → 软硬件协同调度: function phase 在软件侧执行,run_phase 在硬件侧执行