SystemVerilog中如何为'x'状态创建Coverpoint覆盖仓?
SystemVerilog中创建x状态覆盖仓的解决方案
你遇到的问题核心有两点:
- 枚举类型变量默认只采样定义好的枚举常量(A/B/C/D),若未显式给变量赋值x,该状态永远不会被触发;同时SystemVerilog的coverpoint默认会忽略x/z这类未知态,普通
bins无法匹配它们。 - 代码里的
bins x_state = { 'bx };属于普通bin定义,无法捕获x状态。
修正方案
要实现x状态的覆盖仓,需做以下调整:
- 确保变量能持有x值:如果用枚举类型,要基于
logic定义(你的代码已满足),同时在采样列表中加入x值,让变量有机会被赋值为x。 - 使用
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
相关产品推荐
相关产品推荐

