You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多环境覆盖场景下,能否将多个analysis ports连接至同一implementation?

可以将多个Analysis Ports连接到同一个Implementation

完全可以这么做,这是验证领域(尤其是UVM框架下)优化代码复用、减少冗余实现的常用方案,能有效解决多环境下重复编写implementation函数的问题。

实现方式分两种场景:

1. 所有环境的事务类型相同,无需区分来源

直接将多个环境的analysis port连接到同一个implementation实例的analysis export即可,implementation的write()方法统一处理所有事务:

// 在环境的connect_phase中完成连接
function void my_top_env::connect_phase(uvm_phase phase);
  super.connect_phase(phase);
  // env1、env2为不同环境实例,impl为共享的implementation实例
  env1.analysis_port.connect(impl.analysis_export);
  env2.analysis_port.connect(impl.analysis_export);
endfunction

// 共享的implementation类示例(以uvm_subscriber为例)
class shared_analysis_impl extends uvm_subscriber#(my_trans);
  `uvm_component_utils(shared_analysis_impl)

  covergroup coverage_cg;
    // 定义覆盖点,可根据事务属性设置
    trans_addr: coverpoint trans.addr;
    trans_op: coverpoint trans.op;
    // 跨环境的交叉覆盖(如果需要)
    env_cross: cross trans.env_id, trans.op;
  endgroup

  function new(string name, uvm_component parent);
    super.new(name, parent);
    coverage_cg = new();
  endfunction

  virtual function void write(my_trans trans);
    // 统一处理事务:比如打印日志、收集覆盖
    `uvm_info(get_name(), $sformatf("Received transaction: %s", trans.convert2string()), UVM_MEDIUM)
    coverage_cg.sample();
  endfunction
endclass

2. 需要区分事务来自哪个环境

如果需要针对不同环境做差异化处理,可通过uvm_analysis_imp_decl声明带后缀的export,在implementation中实现对应不同后缀的write_xxx()方法,既复用通用逻辑,又保留差异化能力:

// 声明带后缀的analysis imp
uvm_analysis_imp_decl(_env1)
uvm_analysis_imp_decl(_env2)

class shared_analysis_impl extends uvm_component;
  `uvm_component_utils(shared_analysis_impl)

  // 声明不同环境对应的imp
  uvm_analysis_imp_env1#(my_trans, shared_analysis_impl) analysis_imp_env1;
  uvm_analysis_imp_env2#(my_trans, shared_analysis_impl) analysis_imp_env2;

  covergroup coverage_cg;
    trans_addr: coverpoint trans.addr;
    trans_op: coverpoint trans.op;
    env_id: coverpoint trans.env_id; // 区分环境的覆盖点
  endgroup

  function new(string name, uvm_component parent);
    super.new(name, parent);
    analysis_imp_env1 = new("analysis_imp_env1", this);
    analysis_imp_env2 = new("analysis_imp_env2", this);
    coverage_cg = new();
  endfunction

  // 处理来自env1的事务
  virtual function void write_env1(my_trans trans);
    trans.env_id = "env1"; // 标记环境ID
    process_transaction(trans);
  endfunction

  // 处理来自env2的事务
  virtual function void write_env2(my_trans trans);
    trans.env_id = "env2"; // 标记环境ID
    process_transaction(trans);
  endfunction

  // 通用事务处理逻辑,供不同write方法复用
  virtual function void process_transaction(my_trans trans);
    `uvm_info(get_name(), $sformatf("Received transaction from %s: %s", trans.env_id, trans.convert2string()), UVM_MEDIUM)
    coverage_cg.sample();
  endfunction
endclass

连接时对应不同的imp:

function void my_top_env::connect_phase(uvm_phase phase);
  super.connect_phase(phase);
  env1.analysis_port.connect(impl.analysis_imp_env1);
  env2.analysis_port.connect(impl.analysis_imp_env2);
endfunction

注意事项

  • 事务类型兼容性:如果不同环境的事务类型不同,可在implementation中重载不同类型的write()方法,UVM会自动根据事务类型匹配对应的方法。
  • 线程安全:虽然UVM的analysis port是非阻塞的,但如果write()方法中涉及共享资源操作,需确保逻辑线程安全(验证场景下通常因phase机制为单线程,风险较低)。

内容的提问来源于stack exchange,提问作者Stepan Harutyunyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:37:07