Verilog:下面的代码是否会产生竞争条件?
我正在尝试使用Verilog HDL制作一个管道处理器。我意识到在我的代码中可能有一些种族条件。因此,我将编写一个sudo代码,并询问您是否存在竞争条件,以及如何避免这种情况: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
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都将始终具有以前的值neta\u o
您可以通过以下链接找到有关此非阻塞分配的更多信息 非常感谢您的回复。还有两个问题:一,。我应该只用NBA来写积木?2.竞争条件只是一个模拟问题还是一个物理实现(后合成)问题?我的意思是,在合成后,由于不同路径的延迟,是否可能有不同的行为?你应该根据我刚才给出的规则使用NBA,否则使用正常的分配。在RTL中,转换为使用NBAs作为顺序逻辑的输出。不幸的是,您的RTL中可能存在一个物理实现中不存在的竞争,而物理实现中可能存在一个RTL中不存在的竞争。