UVM 阻塞分配竞争条件

ara*_*ser 5 system-verilog uvm

我对 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
Run Code Online (Sandbox Code Playgroud)

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

Ray*_*emi 4

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

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

所以而不是

@(posedge clk)
  write_A(A);

@(posedge clk)
  write_B(B);
Run Code Online (Sandbox Code Playgroud)

你有

@(posedge clk) begin
  write_A(A);
  write_B(B);
end
Run Code Online (Sandbox Code Playgroud)

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