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

SystemVerilog中如何为'x'状态创建Coverpoint覆盖仓?

SystemVerilog中创建x状态覆盖仓的解决方案

你遇到的问题核心有两点:

  • 枚举类型变量默认只采样定义好的枚举常量(A/B/C/D),若未显式给变量赋值x,该状态永远不会被触发;同时SystemVerilog的coverpoint默认会忽略x/z这类未知态,普通bins无法匹配它们。
  • 代码里的bins x_state = { 'bx };属于普通bin定义,无法捕获x状态。

修正方案

要实现x状态的覆盖仓,需做以下调整:

  1. 确保变量能持有x值:如果用枚举类型,要基于logic定义(你的代码已满足),同时在采样列表中加入x值,让变量有机会被赋值为x。
  2. 使用wildcard bins定义x/z仓:wildcard bins是SystemVerilog中专门用来匹配包含x/z状态的语法,能有效捕获未知态的覆盖。

修正后的完整代码

typedef enum logic [2:0] { A,B,C,D } alpha;
program main;    
  alpha y;         
  // 加入x值到采样集合,让变量可被赋值为x
  alpha values[$]= '{A,B,C,D, 'bx};
                 
  covergroup cg;   
    option.per_instance = 1;
    cover_point_y : coverpoint y;
  endgroup         
                 
  covergroup bidir_coverage;
    option.per_instance = 1;
    bidir_coverage_y :  coverpoint y {
      // 匹配所有枚举常量
      bins enum_vals[] = {A,B,C,D};
      // 匹配任意3位x状态(对应枚举的3位宽度)
      wildcard bins x_state = { 'bx };
      // 若需要捕获z状态,可添加以下行
      // wildcard bins z_state = { 'bz };
    }               
  endgroup         
                 
  cg cg_inst = new();
  bidir_coverage bidir_coverage_inst = new();
                 
  initial begin
    foreach(values[i]) begin            
      y = values[i];   
      $display("当前采样值: %0h", y);
      cg_inst.sample();
      bidir_coverage_inst.sample();
    end               
    // 打印覆盖进度,验证x状态是否被捕获
    $display("cg组覆盖完成度: %0d%%", cg_inst.get_coverage());
    $display("bidir_coverage组覆盖完成度: %0d%%", bidir_coverage_inst.get_coverage());
  end
endprogram

关键说明

  • 基于logic的枚举类型变量允许存储x/z值,但必须显式赋值,因此采样列表里要加入'bx才能触发该状态的采样。
  • wildcard bins会匹配所有对应位为x的情况,比如3位的'bx会匹配3'bxxx;如果需要匹配部分位为x的模式,可以写成3'bx01这类形式。
  • 若使用普通logic类型变量(而非枚举),同样需要用wildcard bins捕获x/z,因为coverpoint默认会忽略这些未知态,不会计入覆盖统计。

内容的提问来源于stack exchange,提问作者bu-ral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:07:28