2014-11-14 84 views
4

我对SystemVerilog中的竞态条件有疑问,特别是在UVM中。在标准情况下,我们所拥有的是多个驱动程序,它们在同一时钟前驱动我们的小玩意儿,在记分牌中产生一些函数调用。这些调用是同时进行的,他们检查/修改黄金参考模型中的某些共享变量是现实的。如果这些操作是在非阻塞赋值的情况下完成的,那就没有问题,但是阻塞赋值可能会存在竞争条件。哪个是解决这个问题的最好方法?要不在课堂上实现黄金参考模型? 预先感谢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的所有成员都是静态的?

+0

这就是为什么你通常实现一些同步机制来处理并行性。 – 2014-11-15 00:43:10

+0

如果我没有记错,应该使用uvm_analysis功能自动处理计划和同步记分板。 – Greg 2014-11-15 19:03:22

回答

3

这里的问题在于,您试图使用行为代码来模拟RTL行为。您在多个线程中使用多个函数,并以随机顺序在同一时钟边缘全部调用它们。除了在您的操作中强制执行命令之外,没有解决这个问题的办法。

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

所以不是

@(posedge clk) 
    write_A(A); 

@(posedge clk) 
    write_B(B); 

你有

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

后者的代码将每次运行方式相同。

+0

是的,这正是我采用的解决方案,谢谢! – Alessandro 2014-12-23 21:05:30

1

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

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

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

比赛条件可以删除使用以下的东西。

(1)程序块

(2)时钟控制块

(3)非阻断分配新建分配FY

程序块之前和使用非阻挡分配除去计时块竞争状态。

正如我上面解释过的,用verilog代码或系统verilog代码编写的声明不是单次执行代码。工具执行特定语法的区域有所不同。

这里我主要讲了有源区和反应区。活动区考虑连续分配,阻止分配。无效区域考虑在该区域评估非阻塞分配的LHS。

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

所以在程序块删除竞争条件验证工程师照顾这些事情(执行区域)。

现在在系统verilog中还有很多其他的区域被添加为像prepone区域,观察区域,延期区域。