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

3.3 学习UVM中的uvm_driver 类分为几步?

文章目录

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


前言


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


1. 定义

uvm_driver 是 UVM(Universal Verification Methodology)中的一个重要组件类,用于驱动事务(transaction)到设计(DUT)的接口。它通常与 uvm_sequencer 配合使用,从 uvm_sequencer 获取事务并将其转换为信号级别的激励,施加到 DUT 的接口上。

uvm_driver 的主要特点:

  • uvm_sequencer 获取事务。
  • 将事务转换为信号级别的激励。
  • 是 UVM 测试平台中与 DUT 交互的关键组件。

2. 核心功能

uvm_driver 提供了以下核心功能:

  • 事务获取:通过 get_next_item()try_next_item() 方法从 uvm_sequencer 获取事务。
  • 事务处理:将事务转换为信号级别的激励,并驱动到 DUT 的接口。
  • 事务完成:通过 item_done() 方法通知 uvm_sequencer 当前事务处理完成。
  • 与 Sequencer 的通信:管理与 uvm_sequencer 的通信,确保事务的顺序和同步。

3. 适用场景

uvm_driver 通常用于以下场景:

  • 接口驱动:用于驱动 DUT 的输入接口(如 AXI、APB、SPI 等)。
  • 协议实现:实现特定的总线协议或通信协议。
  • 激励生成:将高层次的事务转换为低层次的信号激励。

4. 使用方法

使用 uvm_driver 的步骤如下:

  1. 定义类:从 uvm_driver 派生一个类,并定义其属性和方法。
  2. 实现 run_phase:在 run_phase 中实现事务的获取、处理和完成逻辑。
  3. 与 Sequencer 连接:在测试平台中将 uvm_driveruvm_sequencer 连接。
  4. 驱动事务:在 run_phase 中将事务转换为信号激励并驱动到 DUT。

5. 完整代码示例

以下是一个完整的代码示例,展示如何使用 uvm_driver 驱动事务到 DUT 的接口。

5.1 事务类定义

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

  rand bit [7:0] data;
  rand 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 Driver 类定义

// 定义一个从 uvm_driver 派生的驱动类
class my_driver extends uvm_driver #(my_transaction);

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

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

  // 实现 run_phase
  virtual task run_phase(uvm_phase phase);
    forever begin
      // 从 sequencer 获取事务
      seq_item_port.get_next_item(req);

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

      // 将事务转换为信号激励(这里用延时模拟驱动过程)
      #10;

      // 通知 sequencer 事务处理完成
      seq_item_port.item_done();
    end
  endtask

endclass

5.3 Sequencer 类定义

// 定义一个从 uvm_sequencer 派生的 sequencer 类
class my_sequencer extends uvm_sequencer #(my_transaction);

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

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

endclass

5.4 测试平台

// 测试平台
module testbench;
  initial begin
    // 创建 env 类
    class my_env extends uvm_env;
      my_driver    driver;
      my_sequencer sequencer;

      // 注册类到 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);
        driver    = my_driver::type_id::create("driver", this);
        sequencer = my_sequencer::type_id::create("sequencer", this);
      endfunction

      // 连接组件
      virtual function void connect_phase(uvm_phase phase);
        driver.seq_item_port.connect(sequencer.seq_item_export);
      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 定义了事务的属性和方法。
  • Driver 类my_driveruvm_driver 派生,实现了事务的获取、处理和完成逻辑。
  • Sequencer 类my_sequencer 用于生成和管理事务。
  • 测试平台my_envmy_test 类用于构建和运行测试环境。

7. 总结

uvm_driver 是 UVM 中用于驱动事务到 DUT 的关键组件。它与 uvm_sequencer 配合使用,负责将高层次的事务转换为低层次的信号激励。以上示例展示了如何定义和使用 uvm_driver,适用于实际的验证场景。

相关文章:

  • override 关键字的作用
  • nodejs 037: Js Worker线程消息传递 Worker.postMessage() Worker.postMessage()
  • Unity Dots理论学习-4.ECS有关的模块(3)
  • 厘米和磅的转换关系
  • AI-Engine-Direct-Helper 快速上手及环境配置
  • FPGA简介|结构、组成和应用
  • C++、Dijkstra实现导航系统设计——课设
  • JavaScript 发起网络请求
  • AN 433:源同步接口的约束与分析
  • 【前端】自己从头实现一个gpt聊天页面
  • AI向量数据库之LanceDB快速介绍
  • 数据仓库与数据挖掘记录 三
  • stm32小白成长为高手的学习步骤和方法
  • 在C++的DLL文件中定义的结构体,在DLL外可以使用吗,如何使用?
  • 【3分钟极速部署】在本地快速部署deepseek
  • 基于 FPGA 的嵌入式系统硬件逻辑优化技术探究
  • Android 原生层SurfaceView截屏
  • 力扣刷题(数组篇)
  • DeepSeek本地部署详细指南
  • docker 逃逸突破边界
  • A股午后拉升,沪指收复3400点:大金融发力,两市成交超1.3万亿元
  • 6连败后再战萨巴伦卡,郑钦文期待打出更稳定发挥
  • 广东省人大教科文卫委原主任委员梁万里被开除党籍:退休后受贿仍不知止
  • 走进“双遗之城”,领略文武风采:沧州何以成文旅新贵
  • 印度一战机在巴基斯坦旁遮普省被击落,飞行员被俘
  • 名帅大挪移提前开启,意属皇马的阿隆索会是齐达内第二吗