首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UVM阻塞分配争用条件

UVM阻塞分配争用条件
EN

Stack Overflow用户
提问于 2014-11-15 06:45:26
回答 2查看 1.2K关注 0票数 4

我对SystemVerilog中的竞态条件有疑问,尤其是在UVM中。在标准情况下,我们拥有的是多个驱动程序,它们在时钟的前面驱动我们的dut,在记分板中生成一些函数调用。这些调用是同步的,并且它们检查/修改黄金参考模型中的一些共享变量是现实的。如果使用非阻塞赋值来完成这些操作,将不会有任何问题,但对于阻塞赋值,可能会出现竞争条件。解决此问题的最佳方法是什么?实现黄金参考模型而不是在类中?提前感谢

记分板的伪代码示例如下:

代码语言:javascript
复制
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成员都设置为静态的?

EN

回答 2

Stack Overflow用户

发布于 2014-12-23 23:31:06

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

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

因此,不是

代码语言:javascript
复制
@(posedge clk)
  write_A(A);

@(posedge clk)
  write_B(B);

你有

代码语言:javascript
复制
@(posedge clk) begin
  write_A(A);
  write_B(B);
end

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

票数 3
EN

Stack Overflow用户

发布于 2016-08-20 14:13:27

因为表达式或赋值试图同时访问相同信号而创建争用条件。

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

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

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

(1)程序块

(2)计时模块

(3)非阻塞分配

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

如上所述,用verilog代码或系统verilog代码编写的语句不是在同一时间内执行代码。存在由工具执行特定语法的不同区域。

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

首先评估有源区,然后评估反应区。

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

现在在系统verilog中增加了许多其他区域,如预留区、观察区、延迟区等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26940115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档