1. 覆盖组表达式基础解析
在SystemVerilog验证环境中,覆盖点(coverpoint)的仓(bin)定义是功能覆盖率收集的核心机制。传统仓定义方式通过显式值范围或过渡序列来划分采样空间,而带覆盖组表达式的仓则提供了更灵活的数值筛选能力。
覆盖组表达式通过with关键字引入,其本质是在数值分配到仓之前增加一个过滤层。这个过滤层可以对每个候选值进行任意复杂度的条件判断,只有满足表达式条件的值才会进入后续的仓分配流程。例如:
systemverilog复制coverpoint addr {
bins low_range[] = addr with (item < 256);
bins high_range = addr with (item[31] == 1'b1);
}
这里的item是SystemVerilog预定义的上下文变量,代表当前被评估的覆盖点值。表达式(item < 256)会对addr的每个可能值进行判断,只有小于256的数值才会被分配到low_range动态数组中。
关键细节:with表达式必须返回布尔值,但实际实现中任何非零整数值都会被当作true处理。表达式内部可以调用用户定义函数,但函数参数不能包含output或非const ref类型。
2. 表达式处理时序控制
覆盖组表达式对数值的处理时序存在两种模式,这是理解其行为差异的关键:
2.1 默认处理流程(表达式优先)
在标准模式下,表达式过滤发生在数值分配到仓之前。以如下代码为例:
systemverilog复制coverpoint data {
bins seg[4] = data with (item % 2 == 0);
}
处理流程为:
- 遍历data所有可能值(0-255)
- 对每个值应用(item % 2 == 0)过滤
- 将过滤后的偶数值均匀分配到4个仓中
这种模式下,最终每个仓包含的是经过表达式筛选后的数值子集。
2.2 分布优先模式(distribute_first)
当设置covergroup选项distribute_first = 1时,处理顺序反转:
systemverilog复制covergroup cg with function s
