我对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当然,结果取决于这两个函数的执行顺序,这是未知的。我们可以使用一些同步机制来解决问题,但是使用许多写并行函数会让事情变得更加困难。使用非阻塞赋值将使情况变得更加清晰,而simple...maybe的解决方案可能是将所有GRF成员都设置为静态的?
发布于 2014-12-23 23:31:06
这里的问题是,您试图使用行为代码来模拟RTL行为。您在多个线程中使用多个函数,并在同一时钟沿上以随机顺序调用所有这些函数。除了在您的操作上强制执行订单之外,没有其他解决方案。
要做到这一点,最简单的方法是将记分板中的所有@(posedge clk)线程合并为一个线程。这将迫使您每次都以相同的顺序调用函数。
因此,不是
@(posedge clk)
write_A(A);
@(posedge clk)
write_B(B);你有
@(posedge clk) begin
write_A(A);
write_B(B);
end后面的代码每次都会以相同的方式运行。
发布于 2016-08-20 14:13:27
因为表达式或赋值试图同时访问相同信号而创建争用条件。
如果两个信号试图在不同的时间戳访问相同的信号,则用户可以消除竞争条件。
实际上代码是用verilog编写的,或者系统verilog是在不同的时间区域执行的,比如活动区域、反应区域。
可以使用以下内容删除争用条件。
(1)程序块
(2)计时模块
(3)非阻塞分配
在使用非阻塞分配去除程序块和时钟块竞争条件之前。
如上所述,用verilog代码或系统verilog代码编写的语句不是在同一时间内执行代码。存在由工具执行特定语法的不同区域。
这里我主要讨论的是主动区域和反应区。活动区域考虑连续分配,阻塞分配。反应区考虑非阻塞分配的LHS在该区域进行评估。
首先评估有源区,然后评估反应区。
因此,在程序块删除竞争条件验证之前,工程师会处理这些事情(执行区域)。
现在在系统verilog中增加了许多其他区域,如预留区、观察区、延迟区等。
https://stackoverflow.com/questions/26940115
复制相似问题