我的问题是,是否通过多个线程同时采样封面点(在覆盖了buit-in示例方法之后)会产生任何副作用。
更详细地说,请考虑以下代码:
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'和方法'样本'将为两个线程执行(使用单独的数据堆栈)。当两个线程同时尝试更新封面组/封面时,您认为这会产生任何副作用吗? (如果是这样,显而易见的解决方案当然是使用信号量。)
干杯, Stast
答案 0 :(得分:0)
没有。根据其定义的样本是非耗时的函数。
答案 1 :(得分:0)
SystemVerilog线程与本机OS线程不同。它们以非先发制人的方式安排。这意味着,在任何给定时间,只有一个SV线程在运行,并且它将继续运行,直到它向线程调度程序返回控制(通常通过耗时的操作),然后将控制传递给另一个线程。
因此,在您的示例中,两个线程将具有对covergroup及其示例方法的原子访问权限。这意味着一个线程在运行covergroup的示例方法时不会被另一个线程中断。正如您在使用本机操作系统线程时所期望的那样,不存在具有不可预测结果的交叉执行。
唯一的副作用"你可以期待的是2个线程访问封面组的顺序。在一个模拟中,线程A可以首先访问封面组,然后是线程B,而在另一个模拟中,它可能是另一种方式。该顺序应与随机生成器的种子相关联。因此,如果您使用相同的初始条件和相同的种子运行相同的模拟,您应该获得线程访问封面组的相同顺序。
答案 2 :(得分:0)
没有。 sample()
的参数是按值传递,而不是通过引用传递。它不会有任何副作用。根据覆盖区域的收集方式,两个线程中样本函数的执行顺序也无关紧要,因为无论首先是哪个线程样本,都会得到相同的覆盖结果。