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

Verilog:下面的代码是否会产生竞争条件?,verilog,race-condition,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

我正在尝试使用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)的总延迟(即竞争条件)


谢谢。

这就是为什么Verilog中有非阻塞(NBA)分配。编码规则是,每当有多个进程(在这种情况下,多个
始终
块)访问同一信号(
a_o
)并同步到同一事件(
@posdege clock
),其中一个进程写入,另一个进程读取时,您需要使用和NBA
是,可能存在竞争条件,因为您不知道网络是先由模块a驱动,然后由模块B捕获,还是反之亦然

因此,您应该为此使用非阻塞分配,因为这将确保无论执行哪个模块,模块B都将始终具有以前的值net
a\u o


您可以通过以下链接找到有关此非阻塞分配的更多信息

非常感谢您的回复。还有两个问题:一,。我应该只用NBA来写积木?2.竞争条件只是一个模拟问题还是一个物理实现(后合成)问题?我的意思是,在合成后,由于不同路径的延迟,是否可能有不同的行为?你应该根据我刚才给出的规则使用NBA,否则使用正常的分配。在RTL中,转换为使用NBAs作为顺序逻辑的输出。不幸的是,您的RTL中可能存在一个物理实现中不存在的竞争,而物理实现中可能存在一个RTL中不存在的竞争。