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

采样数据总线时Transition Cover Bins未命中问题排查

问题分析与解决方案

核心问题原因

你的代码存在三个关键问题,导致跳变覆盖率bin无法命中:

  1. 无效采样打断跳变序列
    原代码中,无论总线地址是否为W,每次总线事务都会调用cg_.sample(var_value)。但只有当地址为W时,var_value才会被赋值为总线数据;其他情况下var_value是未初始化的X(函数内自动reg变量默认值),这会导致采样序列变为 7 → X → 8,而非你期望的7 → 8。跳变bin要求连续两次采样值匹配指定序列,中间插入的X会直接破坏连续性,导致seven_eight等跳变bin无法触发。

  2. 变量名拼写错误
    函数write_axi_bus的参数是axi_tran,但代码中错误地使用了axi_trans.addr和axi_trans.xact_type,这会导致编译错误,无法正确判断目标地址和事务类型,甚至可能导致采样逻辑完全失效。

  3. Covergroup语法错误

    • covergroup cg_ with function sample(); 写法错误:SystemVerilog中covergroup的sample方法是内置的,无需自定义该函数。
    • 跳变bin名称拼写错误:eigth_repeat应为eight_repeat。

修正后的代码示例

// 修正Covergroup定义,移除错误的自定义sample函数,修正拼写错误
covergroup cg_;
  transtion_cp : coverpoint data {
        bins seven_repeat   = (7 [* 2]);
        bins seven_eight    = (7 => 8);
        bins eight_seven    = (8 => 7);
        bins eight_repeat   = (8 [* 2]);
        bins seven          = {7};
        bins eight          = {8};
  }
endgroup

// 修正UVM组件构造函数,补充父类构造调用
function new(string name, uvm_component parent);
  super.new(name, parent);
  cg_ = new();
endfunction

// 修正采样逻辑,仅在目标地址W时执行采样
virtual function void write_axi_bus(svt_axi_transaction axi_tran);
   reg [7:0] var_value;

   // 修正变量名拼写:axi_trans → axi_tran
   if(W == axi_tran.addr && (axi_tran.xact_type == svt_axi_transaction::READ || axi_tran.xact_type == svt_axi_transaction::WRITE)) begin
     var_value = axi_tran.data[0][7:0];    
     // 仅采样目标地址W的数值,保证跳变序列连续性
     cg_.sample(var_value);
   end
endfunction

关键修正说明

  • 调整采样时机:将cg_.sample(var_value)移入if块内部,仅当捕获到地址W的事务时才进行采样,确保采样序列仅包含目标地址的数值,跳变序列7→8会被正确识别。
  • 修复拼写错误:修正参数名和bin名称的拼写问题,保证代码编译正常且逻辑正确。
  • 规范Covergroup语法:遵循SystemVerilog Covergroup的标准定义方式,避免无效语法导致的覆盖率统计异常。

内容的提问来源于stack exchange,提问作者Chinmay Mahato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:55:58