在 SystemVerilog 功能覆盖率的coverpoint中,bins all_vals[] = {[0:63]}; 和 bins all_vals = {[0:63]}; 的核心差异是bin 的组织形式与覆盖率统计粒度,直接决定 “是否能验证 0~63 所有数值都被触发”,以下是精准解析:
一、核心区别(表格总结)
| 语法写法 | bin 类型 | 生成的 bin 数量 | 覆盖率统计逻辑 | 适配场景 |
|---|---|---|---|---|
bins all_vals[] = {[0:63]}; | 数组型 bin(动态拆分) | 64 个独立 bin | 为 0、1、2…63每个数值各创建 1 个 bin,需所有 64 个 bin 都被触发,覆盖率才达 100% | 要求覆盖 0~63全部数值(你的需求) |
bins all_vals = {[0:63]}; | 单 bin(静态合并) | 1 个合并 bin | 将 0~63 整个区间视为1 个 bin,只要触发区间内任意 1 个值,该 bin 就覆盖(覆盖率 100%) | 仅验证 “数值落在 0~63 区间内”,无需全值覆盖 |
二、直观示例(对比覆盖率结果)
假设仿真中wdata仅触发了0和1两个值,两种写法的覆盖率表现完全不同:
1. 数组型 bin(all_vals[])
systemverilog
coverpoint wdata[5:0] {
bins all_vals[] = {[0:63]}; // 拆分为0~63共64个bin
}
- 覆盖率计算:
覆盖的bin数 / 总bin数 = 2/64 = 3.125%; - 工具会明确提示 “未覆盖的 bin:2、3、4…63”,精准定位缺失的数值。
2. 单 bin(all_vals)
systemverilog
coverpoint wdata[5:0] {
bins all_vals = {[0:63]}; // 合并为1个bin
}
- 覆盖率计算:
覆盖的bin数 / 总bin数 = 1/1 = 100%; - 工具仅显示 “该 bin 已覆盖”,无法判断是否触发了 0~63 的全部数值(哪怕只触发 0,也会显示 100%)。
三、语法本质与关键细节
-
[]的核心作用:[]是 “数组型 bin” 的标志,告诉工具:将大括号内的区间 / 列表拆分为多个独立的 bin(每个值对应 1 个);无[]时,工具会将整个区间 / 列表视为 “1 个 bin 的触发条件”(只要满足区间内任意值,该 bin 就覆盖)。 -
扩展验证(枚举列表场景):该规则同样适用于显式枚举值,而非仅区间:
bins vals[] = {0,1,2};→ 生成 3 个独立 bin(0、1、2 各 1 个);bins vals = {0,1,2};→ 生成 1 个 bin(触发 0/1/2 中任意一个即覆盖)。
-
非法值 / 忽略值的交互:结合
illegal_bins/ignore_bins时,数组型 bin 仍能精准区分:systemverilog
coverpoint wdata[5:0] { bins all_vals[] = {[0:63]}; // 64个独立有效bin illegal_bins invalid = {[64:127]}; // 捕获64~127的非法值 }而单 bin 仅能判断 “是否在 0~63 区间”,无法定位具体非法值。
四、结论(贴合你的需求)
你的目标是 “覆盖 0 到 63 的全部数值”,必须使用bins all_vals[] = {[0:63]};:
- 带
[]的写法能强制验证 “每个数值都被触发”,是实现全值覆盖的唯一方式; - 无
[]的写法仅能验证 “数值没超出 0~63 范围”,无法满足 “覆盖全部数值” 的要求。
简单记:[] = 拆分区间为独立 bin(精准覆盖每个值),无[] = 合并区间为单 bin(仅验证区间归属)。
数组型bin与单bin区别

被折叠的 条评论
为什么被折叠?



