采样数据总线时Transition Cover Bins未命中问题排查
问题分析与解决方案
核心问题原因
你的代码存在三个关键问题,导致跳变覆盖率bin无法命中:
无效采样打断跳变序列
原代码中,无论总线地址是否为W,每次总线事务都会调用cg_.sample(var_value)。但只有当地址为W时,var_value才会被赋值为总线数据;其他情况下var_value是未初始化的X(函数内自动reg变量默认值),这会导致采样序列变为7 → X → 8,而非你期望的7 → 8。跳变bin要求连续两次采样值匹配指定序列,中间插入的X会直接破坏连续性,导致seven_eight等跳变bin无法触发。变量名拼写错误
函数write_axi_bus的参数是axi_tran,但代码中错误地使用了axi_trans.addr和axi_trans.xact_type,这会导致编译错误,无法正确判断目标地址和事务类型,甚至可能导致采样逻辑完全失效。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
相关产品推荐
相关产品推荐

