UVM阻止分配竞争条件

时间:2014-11-14 22:45:26

标签: system-verilog uvm

我对SystemVerilog中的竞争条件有疑问,特别是在UVM中。在标准情况下,我们拥有的是多个驱动程序,它们在同一时钟前驱动我们的dut,在记分板中生成一些函数调用。这些调用是同步的,他们检查/修改黄金参考模型中的某些共享变量是切合实际的。如果这些操作将使用非阻塞分配完成,则没有问题,但是使用阻塞分配可能存在竞争条件。哪种方法可以解决这个问题呢?要在类中实现黄金参考模型? 提前致谢

记分板的伪代码示例可以是:

function void write_A(input TrA A);
    if(GRF.b >= 100 && A.a==1)
        GRF.c = 1;
endfunction

function void write_B(input TrB B);
    GRF.b+=B.b;
endfunction

当然,结果取决于这两个函数的执行顺序,这是未知的。可以用一些同步机制来解决,但是许多写并行函数会变得更难。使用非阻塞分配会使情况变得更加清晰和简单...也许解决方案可能是让GRF的所有成员都是静态的?

2 个答案:

答案 0 :(得分:3)

这里的问题是您尝试使用行为代码模拟RTL行为。您在多个线程中使用多个函数,并以随机顺序在同一时钟边沿上调用它们。除了对您的操作执行订单之外,没有解决此问题的方法。

最简单的方法是将记分板中的所有@(posedge clk)线程组合到一个线程中。这将强制您每次都以相同的顺序调用函数。

所以而不是

@(posedge clk)
  write_A(A);

@(posedge clk)
  write_B(B);

你有

@(posedge clk) begin
  write_A(A);
  write_B(B);
end

后面的代码每次都会以相同的方式运行。

答案 1 :(得分:1)

仅因表达式而创建竞争条件,或者分配尝试同时访问相同的信号。

如果两个信号试图以不同的时间戳访问相同的信号,那么用户可以删除竞争条件。

实际上代码用verilog编写或者系统verilog在不同的时区执行,如有源区,反应区。

可以使用以下内容删除竞争条件。

(1)程序块

(2)时钟块

(3)非阻塞分配

在使用非阻塞分配删除程序块和时钟块竞争条件之前。

正如我上面解释的那样,用verilog代码编写的语句或系统verilog代码不是单次执行代码相同的。工具执行特定语法的区域不同。

这里我主要讨论了Active和Reactive区域。活动区域考虑连续分配,阻止分配。反应区域考虑在该区域评估非阻塞分配的LHS。

评估第一个活动区域,然后评估反应区域。

因此,在程序块移除竞争条件之前,验证工程师会处理这些事情(执行区域)。

现在在系统verilog中还添加了许多其他区域,如preone区域,观察区域,推迟区域。