4

我对 SystemVerilog 中的竞争条件有疑问,尤其是在 UVM 中。在标准情况下,我们有多个驱动程序在同一时钟前驱动我们的任务,在记分牌中生成一些函数调用。这些调用是同时进行的,它们检查/修改黄金参考模型中的一些共享变量是现实的。如果这些操作使用非阻塞赋值完成,则不会有问题,但使用阻塞赋值可能会出现竞争条件。克服这个问题的最佳方法是什么?实现不在一个类中的黄金参考模型?提前致谢

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

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 的所有成员都设为静态?

4

2 回答 2

3

这里的问题是您正在尝试使用行为代码来模拟 RTL 行为。您在多个线程中使用多个函数,并以随机顺序在同一时钟沿调用它们。除了对您的操作执行命令外,没有其他解决方案可以解决此问题。

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

所以而不是

@(posedge clk)
  write_A(A);

@(posedge clk)
  write_B(B);

你有

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

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

于 2014-12-23T15:31:05.980 回答
1

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

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

实际上代码是用verilog编写的,或者系统verilog是在不同的时间区域执行的,比如活动区域、反应区域。

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

(1) 程序块

(2) 时钟模块

(3) 非阻塞赋值

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

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

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

首先评估活性区域,然后评估反应区域。

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

现在在系统verilog中添加了许多其他区域,例如prepone region,observed region,推迟区域。

于 2016-08-20T06:13:27.467 回答