当前位置: 首页 > article >正文

3.4 学习UVM中的uvm_monitor类分为几步?

文章目录

  • 前言
  • 1. 定义
  • 2. 核心功能
  • 3. 适用场景
  • 4. 使用方法
  • 5. 完整代码示例
    • 5.1 事务类定义
    • 5.2 Monitor 类定义
    • 5.3 Scoreboard 类定义
    • 5.4 测试平台
  • 6. 代码说明
  • 7. 总结


前言

以下是关于 UVM 中 uvm_monitor 的详细解释、核心功能、适用场景、使用方法以及一个完整的代码示例:


1. 定义

uvm_monitor 是 UVM(Universal Verification Methodology)中的一个重要组件类,用于监控 DUT(Design Under Test)的接口行为。它负责采集 DUT 的信号活动并将其转换为高层次的事务(transaction),然后将这些事务发送给其他组件(如 uvm_scoreboarduvm_subscriber)进行分析和检查。

uvm_monitor 的主要特点:

  • 被动组件,不驱动信号,仅监控信号。
  • 将信号活动转换为事务。
  • 是 UVM 测试平台中用于数据采集和分析的关键组件。

2. 核心功能

uvm_monitor 提供了以下核心功能:

  • 信号监控:监控 DUT 的接口信号,捕捉信号变化。
  • 事务转换:将捕捉到的信号转换为高层次的事务。
  • 数据广播:通过 Analysis Port(uvm_analysis_port)将事务广播给其他组件(如 uvm_scoreboard)。
  • 协议检查:在监控过程中检查协议是否符合预期。

3. 适用场景

uvm_monitor 通常用于以下场景:

  • 接口监控:监控 DUT 的输入或输出接口(如 AXI、APB、SPI 等)。
  • 协议检查:检查接口信号是否符合协议规范。
  • 数据采集:采集 DUT 的行为数据,用于功能覆盖率和性能分析。
  • 事务广播:将采集到的事务发送给其他组件进行进一步处理。

4. 使用方法

使用 uvm_monitor 的步骤如下:

  1. 定义类:从 uvm_monitor 派生一个类,并定义其属性和方法。
  2. 实现监控逻辑:在 run_phase 中实现信号监控和事务转换逻辑。
  3. 广播事务:通过 uvm_analysis_port 将事务广播给其他组件。
  4. 连接组件:在测试平台中将 uvm_monitor 与其他组件(如 uvm_scoreboard)连接。

5. 完整代码示例

以下是一个完整的代码示例,展示如何使用 uvm_monitor 监控 DUT 的接口行为。

5.1 事务类定义

// 定义一个从 uvm_sequence_item 派生的事务类
class my_transaction extends uvm_sequence_item;

  bit [7:0] data;
  bit [3:0] addr;
  bit       valid;

  // 注册类到 UVM 工厂
  `uvm_object_utils(my_transaction)

  // 构造函数
  function new(string name = "my_transaction");
    super.new(name);
  endfunction

  // 实现 print 方法
  virtual function void do_print(uvm_printer printer);
    printer.print_field("data",  this.data,  8);
    printer.print_field("addr",  this.addr,  4);
    printer.print_field("valid", this.valid, 1);
  endfunction

endclass

5.2 Monitor 类定义

// 定义一个从 uvm_monitor 派生的监控类
class my_monitor extends uvm_monitor;

  // 定义 analysis port
  uvm_analysis_port #(my_transaction) ap;

  // 虚拟接口(用于访问 DUT 信号)
  virtual my_interface vif;

  // 注册类到 UVM 工厂
  `uvm_component_utils(my_monitor)

  // 构造函数
  function new(string name, uvm_component parent);
    super.new(name, parent);
    ap = new("ap", this);
  endfunction

  // 实现 run_phase
  virtual task run_phase(uvm_phase phase);
    forever begin
      my_transaction tx;

      // 等待信号有效
      @(posedge vif.clock iff vif.valid);

      // 创建事务对象
      tx = my_transaction::type_id::create("tx");

      // 捕捉信号并转换为事务
      tx.data  = vif.data;
      tx.addr  = vif.addr;
      tx.valid = vif.valid;

      // 打印事务
      `uvm_info("MONITOR", $sformatf("Captured transaction: data=0x%0h, addr=0x%0h, valid=%b", 
                                    tx.data, tx.addr, tx.valid), UVM_LOW)

      // 通过 analysis port 广播事务
      ap.write(tx);
    end
  endtask

endclass

5.3 Scoreboard 类定义

// 定义一个从 uvm_scoreboard 派生的记分板类
class my_scoreboard extends uvm_scoreboard;

  // 注册类到 UVM 工厂
  `uvm_component_utils(my_scoreboard)

  // 构造函数
  function new(string name, uvm_component parent);
    super.new(name, parent);
  endfunction

  // 实现 write 方法(用于接收事务)
  virtual function void write(my_transaction tx);
    `uvm_info("SCOREBOARD", $sformatf("Received transaction: data=0x%0h, addr=0x%0h, valid=%b", 
                                     tx.data, tx.addr, tx.valid), UVM_LOW)
    // 在这里添加事务检查逻辑
  endfunction

endclass

5.4 测试平台

// 测试平台
module testbench;
  initial begin
    // 创建 env 类
    class my_env extends uvm_env;
      my_monitor    monitor;
      my_scoreboard scoreboard;

      // 注册类到 UVM 工厂
      `uvm_component_utils(my_env)

      // 构造函数
      function new(string name, uvm_component parent);
        super.new(name, parent);
      endfunction

      // 构建组件
      virtual function void build_phase(uvm_phase phase);
        monitor    = my_monitor::type_id::create("monitor", this);
        scoreboard = my_scoreboard::type_id::create("scoreboard", this);
      endfunction

      // 连接组件
      virtual function void connect_phase(uvm_phase phase);
        monitor.ap.connect(scoreboard.write);
      endfunction
    endclass

    // 创建测试类
    class my_test extends uvm_test;
      my_env env;

      // 注册类到 UVM 工厂
      `uvm_component_utils(my_test)

      // 构造函数
      function new(string name, uvm_component parent);
        super.new(name, parent);
      endfunction

      // 构建组件
      virtual function void build_phase(uvm_phase phase);
        env = my_env::type_id::create("env", this);
      endfunction

      // 运行测试
      virtual task run_phase(uvm_phase phase);
        phase.raise_objection(this);
        #100; // 模拟测试运行时间
        phase.drop_objection(this);
      endtask
    endclass

    // 启动测试
    initial begin
      run_test("my_test");
    end
  end
endmodule

6. 代码说明

  • 事务类my_transaction 定义了事务的属性和方法。
  • Monitor 类my_monitoruvm_monitor 派生,实现了信号监控和事务转换逻辑,并通过 uvm_analysis_port 广播事务。
  • Scoreboard 类my_scoreboard 用于接收事务并进行检查。
  • 测试平台my_envmy_test 类用于构建和运行测试环境。

7. 总结

uvm_monitor 是 UVM 中用于监控 DUT 接口行为的关键组件。它负责采集信号并将其转换为事务,然后将事务广播给其他组件进行分析和检查。以上示例展示了如何定义和使用 uvm_monitor,适用于实际的验证场景。


http://www.kler.cn/a/542855.html

相关文章:

  • 深度学习入门--python入门1
  • 初识 Express
  • vscode怎么更新github代码
  • keepalived+timescaladb主备切换高可用方案
  • 鸿蒙harmony 手势密码
  • 强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略
  • 【论文笔记】Are Self-Attentions Effective for Time Series Forecasting? (NeurIPS 2024)
  • 移植BOA服务器到GEC2440开发板
  • 图解72个机器学习基础知识点
  • Flink怎么保证Exactly - Once 语义
  • 大型语言模型(LLM)中的自适应推理预算管理:基于约束策略优化的解决方案
  • 人工智能与低代码如何重新定义企业数字化转型?
  • Windows11系统笔记本电脑真的关机了么
  • Ubuntu指令学习(个人记录、偶尔更新)
  • 利用爬虫获取1688商品详情的实战案例指南
  • android的Jetpack简介
  • JavaScript系列(70)--响应式编程进阶详解
  • 机器学习-使用大规模的平行语料
  • mysql学习笔记-锁
  • 畅聊deepseek-r1,SiliconFlow 硅基流动注册+使用
  • 基于YoloV11和驱动级鼠标模拟实现Ai自瞄
  • 鸿蒙oh-package.json版本号
  • 【数据结构】_堆的向上调整和向下调整建堆法
  • Lucene 中的并发错误:如何修复乐观并发失败
  • 工业4.0时代,3D开发工具HOOPS如何赋能塑计量行业自动化与数据可视化?
  • Visual Studio Code中文出现黄色框子的解决办法