0

我的问题是通过多个线程同时采样覆盖点(在覆盖内置采样方法之后)是否会产生任何副作用。

更详细地,考虑以下代码:

covergroup p_cg with function sample(bit [1:0] a);
  coverpoint a;
endgroup : p_cg

p_cg cg1 = new;

init cg1.sample(0);
init cg1.sample(1);

我的理解是两个线程将竞争以更新覆盖点'a'的覆盖组,并且方法'sample'将为两个线程执行(使用单独的数据堆栈)。当两个线程同时尝试更新覆盖组/覆盖点时,您认为这会产生任何副作用吗?(如果是这样,显而易见的解决方案当然是使用信号量)。

干杯,斯塔斯特

4

3 回答 3

0

不。根据其定义,样本是一个非耗时的函数。

于 2015-12-07T16:45:40.683 回答
0

不,参数sample()是按值传递,而不是按引用传递。它不会有任何副作用。根据覆盖率 bin 的收集方式,两个线程中示例函数的执行顺序也无关紧要,因为无论哪个线程先进行采样,最后都会得到相同的覆盖率结果。

于 2017-05-13T06:33:30.023 回答
0

SystemVerilog 线程不像本地操作系统线程。它们以非抢占方式安排。这意味着,在任何给定时间,只有一个 SV 线程在运行,它将继续运行,直到将控制权交还给线程调度程序(通常通过耗时的操作),然后线程调度程序将控制权交给另一个线程。

因此,在您的示例中,两个线程将对覆盖组及其示例方法进行原子访问。这意味着一个线程在运行覆盖组的示例方法时不会被另一个线程中断。不会像使用本机 OS 线程时所期望的那样出现具有不可预测结果的交错执行。

您可以预期的唯一“副作用”是 2 个线程访问覆盖组的顺序。在一个模拟中,线程 A 可以首先访问覆盖组,然后线程 B 可以访问,而在另一个模拟中,它可能是相反的。这个顺序应该与随机生成器的种子相关。因此,如果您使用相同的初始条件和相同的种子运行相同的模拟,您应该获得线程访问覆盖组的相同顺序。

于 2016-10-11T13:13:15.450 回答