Verilog:以下代码是否会产生竞争条件?

时间:2016-09-25 19:52:08

标签: verilog race-condition

我正在尝试使用Verilog HDL制作管道处理器。我意识到我的代码中可能存在一些竞争条件。所以我打算写一个sudo代码,想问你是否存在竞争条件以及如何避免它:

module A(input wire reset, input wire clock, output reg a_reg_o);
   always @(posedge clock)
   begin
      if(reset == 1'h1)
      begin
         a_reg_o = 1'h0;
      end
      else
      begin
         a_reg_o = 1'h1;
      end
   end
endmodule

module B(input wire reset, input wire clock, input a_i);
   reg b;

   always @(posedge clock)
   begin
      if(reset == 1'h1)
      begin
         b = 1'h0;
      end
      else
      begin
         if(a_i == 1'h1)
         begin
            b = 1'h1;
         end
         else
         begin
            b = 1'h0;
         end
      end
   end
endmodule

module Main(input wire reset, input wire clock);
   wire a_o;
   A a(reset, clock, a_o);
   B b(reset, clock, a_o)
endmodule

想象一下我触发复位信号。在时钟的第一个上升沿之后,寄存器a_reg_o将变为0,而来自模块B的寄存器b也将变为0(还没有竞争条件)。现在我释放重置按钮,让它为负数。在时钟的下一个上升沿,寄存器a_reg_o将变为1,但是模块B中的寄存器b呢?它会是: 1.零,因为它还没有看到a_i的变化。 2.这取决于模块(A和B)的总延迟(即竞争条件)。

谢谢。

2 个答案:

答案 0 :(得分:1)

这就是为什么在Verilog中有一个非阻塞(NBA)的任务。编码规则是每当有多个进程(在这种情况下,多个always块)访问与同一事件(a_o)同步的相同信号(@posdege clock)时,其中一个进程写入并且另一个进程读取,你需要使用和NBA <=赋值来写信号。

答案 1 :(得分:1)

是的,可能存在竞争条件,因为您不知道网络a_o是先由模块A驱动,然后由模块B捕获,反之亦然。

因此,您应该使用非阻塞分配,因为这将确保无论执行哪个模块,模块B将始终具有先前的值a_o

您可以通过以下链接找到有关此非阻止作业的详情。 http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf