【问题标题】:Overriding the built-in sample method in systemverilog覆盖 systemverilog 中的内置示例方法
【发布时间】:2015-12-07 15:47:07
【问题描述】:

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

更详细地考虑以下代码:

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”将为两个线程执行(使用单独的数据堆栈)。当两个线程同时尝试更新覆盖组/覆盖点时,您认为这会产生任何副作用吗? (如果是这样,显而易见的解决方案当然是使用信号量)。

干杯, 统计

【问题讨论】:

    标签: system-verilog verification modelsim questasim


    【解决方案1】:

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

    【讨论】:

    • 它是否与模拟器内置并一次性执行或专门实现的“样本”功能有关?我的理解是,原则上,竞争条件可能发生在两个同时执行的函数之间,例如,访问相同变量(例如类属性)的多个阻塞分配。在上面的例子中,这两个函数当然不会消耗任何模拟时间,但是,在模拟时间 0 的活动区域中,两个模拟线程之间的上下文切换不能发生吗?谢谢
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多