验证覆盖率收集时,发现coverage database达到了惊人的256G,如下:
进入database中的testdata目录下的用例定位发现,问题出在这个文件:
testbench.inst.xml
其大小基本等同于验证用例覆盖率的大小。
这个文件时怎么产生的呢?追踪vcs的cov_ref.pdf,发现只有一处说明,如下:
检查这个文件的原因是为了检测不同版本的收集覆盖率时存在不一致,其他地方并没有描述。
删除这个文件进行试验,发现用verdi依然可以打开代码覆盖率。猜测影响的可能是功能覆盖率,
于是追踪功能覆盖率中的covgroup的设置,发现有以下配置:
将该选项注释掉,用例仿真得到的覆盖率数据终于恢复正常。
继续追踪该选项,发现per_instance作用为:在多路数据流的情况下,希望每一路独立的收集coverage,这时会将cover group例化多次,每个实例独立收集自己的覆盖率。
追踪验证环境中covgroup的实例化的地方,终于发现了问题所在:
上面的函数每调用一次,cover group就会被例化一次,假如调用10000次,就会有10000个独立的cover group,从而导致testben.inst.xml线性增长。