【问题标题】:Verilog: Is the following code going to make a race condition?Verilog:下面的代码会产生竞争条件吗?
【发布时间】:2016-09-27 12:03:33
【问题描述】:

我正在尝试使用 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 race-condition


    【解决方案1】:

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

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

    您可以通过以下链接找到有关此非阻塞分配的更多信息。 http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf

    【讨论】:

      【解决方案2】:

      这就是为什么 Verilog 中有非阻塞 (NBA) 分配。编码规则是,只要有多个进程(在这种情况下,多个always 块)访问同一个信号(a_o)同步到同一个事件(@posdege clock),其中一个进程写入,另一个进程读取,您需要使用和 NBA<= 赋值写入信号。

      【讨论】:

      • 非常感谢您的回复。还有两个问题: 1.我应该只用NBA来写块吗? 2. 竞争条件只是模拟问题还是物理实现(综合后)问题?我的意思是,合成后是否可能由于不同路径的延迟而产生不同的行为?
      • 你应该按照我刚刚给出的规则使用NBA,否则使用正常分配。在 RTL 中,转换为使用 NBA 来输出时序逻辑。不幸的是,您的 RTL 中可能存在物理实现中不存在的竞争,以及 RTL 中不存在的物理实现中的竞争。
      猜你喜欢
      • 1970-01-01
      • 2021-08-27
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多