学习笔记21(bin和仿真指令)
仿真器指令

https://www.cnblogs.com/Alfred-HOO/articles/17589481.html
1.什么是bin?
bin是衡量功能覆盖率的基本单位,定义在coverpoint下,可以自己定义多个bin
- SystemVerilog 中功能覆盖率的核心工作机制,即“定义测量目标(coverpoint) → 划分数据区间(bin) → 采样时自动标记命中 → 最终生成报告”的完整流程。
1)定义采样目标,当指定采样目标或者表达式的时候,sv会创建很多bin来记录每个数值被捕捉的次数
注意:coverpoint作用的对象不仅是信号,还有变量、状态机状态以及复合表达式,通常是 DUT 的输出、状态或输入边界值。
bin(仓):cover bin 是将 coverpoint 的值域(Domain)按照验证计划的需求,划分(Partition)成若干个独立的、有意义的子区间(子集)。每个仓负责记录落入该子集的采样值是否出现过。
核心机制:每次采样时,仿真器会看当前addr的值落在哪个区间,然后在该区间的计数器上 +1
2)一个功能覆盖率(covergroup)都是由若干coverpoint覆盖率决定的,而coverpint覆盖率是由其内部仓的覆盖率决定的,所有功能覆盖率块才构成这个整个项目的功能覆盖率
域:由可能数值构成的
如果给 addr 定义了 4 个 bin,其中 3 个被命中了,那 addr 这个 coverpoint 的覆盖率就是 3/4 = 75%。
即使信号 addr 被采样了 1000 次,如果它只命中了 3 个仓,那覆盖率依然只有 75%。bin 的命中数量决定覆盖率,而不是采样次数。
3)bin的创建和应用
自动创建bin:不指定任何 bins,SV会自动为变量的每个取值(或组合)创建一个仓。比如 addr 是 4 位,SV 自动生成 16 个仓(0~15)。方便,但可能产生大量冗余仓。
注意:sv中自动分配的仓的最大数量是64个bin,如果没有指定bin的数量且值域范围超过64,则将值域平均分给64个bin。
1)用户可以通过covergroup的auto_bin_max来指定自动创建的最大bin数,可以指定整个covergroup的总仓数,也可以指定coverpoint的的总bin数。
2)某些coverpoint值永远无法得到全部的阈值,通过ignore_bins来排除这些值。
3)可以通过illrgal_bins来声明一些非法的值域取值,告诉仿真器如果出现这个仓内的数值则直接报错



注意里面的中括号应该删除
自定义bin:手动指定区间区间,比如 bins low = {[0:10]};。这让你能聚焦于验证计划的重点(比如只关心地址 0~15 是否出现)。

你看图片里的tr其实就是类的句柄,操作的是类里的属性(变量),对其进行监测,通过default代表剩余所有没用到的值,你看第二个仓和第三个仓的区别,如果只是一个变量,那你用[1:3]就是1到3取值视为一个仓,如果是一个数组就是数组宽度个仓,每一个仓对应一个取值或者多个取值,按照数组宽度均分。
4)数据汇总
每次采样,仿真器只是默默地在对应 bin 的计数器上加 1,不会即时显示。仿真结束后,VCS 的 urg、Questasim 的 cov 等工具,会读取仿真生成的覆盖率数据库(.vdb / .ucdb),把所有 bin 的命中次数汇总成 HTML 报告,告诉你哪个仓是 0(漏测)
3.条件覆盖率(功能覆盖率里的)
通过iff给coverpoint添加条件,常用于复位期间关闭覆盖用于忽略不合理的条件触发,也可通过start和stop函数控制covergroup的开启和关闭

4.跳转覆盖率(功能覆盖率里的)

假设你定义了一个 coverpoint 监控一个变量 port(端口号)。
每次采样(比如每个时钟沿),仿真器会记录当前 port 的值,并把它跟上一次采样时记录的值做比较。
0 => 1:指的是只要发生过一次从 0 变到 1 的跳转,这个仓就算命中。
0 => 2 和 0 => 3 同理:分别代表从 0 跳到 2、从 0 跳到 3。
这个仓 t1 的使命是:检查你的测试激励是否至少产生过一次“端口从 0 切换到 1、2 或 3”的动态切换场景,只要能跳出0就算命中。如果你只测了端口一直为 0 的情况,这三个跳转仓就全是红色(未命中)。
功能覆盖率只有值覆盖率、跳转覆盖率和交叉覆盖率
5.通配符

浙公网安备 33010602011771号