SystemVerilog中能否为交叉覆盖率的每个交叉乘积创建独立bin?
实现交叉覆盖率的精细化独立Bin
当然可以做到!你想要的是针对cp_a.a1对应的每个cp_b取值,在交叉覆盖率中创建独立的统计Bin,而不是把所有b值打包成一个大Bin。下面给你两种实用的实现方式:
方法1:手动指定每个交叉Bin
如果你的cp_b的取值范围不大,可以直接手动为每个a=1+b=x的组合创建Bin:
cr : cross cp_a, cp_b { // 为a=1时的每个b值创建独立Bin bins a1_b0 = binsof(cp_a.a1) && binsof(cp_b.b[0]); bins a1_b1 = binsof(cp_a.a1) && binsof(cp_b.b[1]); bins a1_b2 = binsof(cp_a.a1) && binsof(cp_b.b[2]); // ... 依次类推到 bins a1_b10 = binsof(cp_a.a1) && binsof(cp_b.b[10]); // 其他a值的交叉Bin可以保留原有方式,或者同样拆分 bins a2 = binsof(cp_a.a2); bins a3 = binsof(cp_a.a3); }
方法2:用foreach循环自动生成Bin
如果cp_b的Bin数量较多,手动写太繁琐,可以用SystemVerilog的foreach循环自动遍历cp_b的所有Bin,批量生成交叉Bin:
cr : cross cp_a, cp_b { // 自动遍历cp_b的所有Bin,为a=1的每个交叉组合创建独立Bin foreach (cp_b.b[i]) begin bins a1_b[i] = binsof(cp_a.a1) && binsof(cp_b.b[i]); end // 如需对a2、a3也做同样拆分,只需复制foreach块并修改cp_a的Bin即可 // foreach (cp_b.b[i]) begin // bins a2_b[i] = binsof(cp_a.a2) && binsof(cp_b.b[i]); // end bins a2 = binsof(cp_a.a2); bins a3 = binsof(cp_a.a3); }
关键说明
binsof(cp_a.a1) && binsof(cp_b.b[i])的作用是精准匹配同时满足cp_a取a1、cp_b取第i个Bin值的交叉情况,每个这样的组合都会生成一个独立的覆盖率统计项。- 这种语法符合SystemVerilog IEEE 1800标准,主流仿真器(如VCS、QuestaSim)都支持。
- 你提到的
bins b [] = {[0:10]}是coverpoint的自动Bin生成,交叉覆盖率中虽然不能直接用这种语法,但通过binsof结合逻辑与(&&)的方式,就能实现等价的精细化Bin划分。
内容的提问来源于stack exchange,提问作者Eivind
相关产品推荐
相关产品推荐

