Verilog:以下代码是否会产生竞争条件?
Verilog: Is the following code going to make a 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)的总延迟(即竞争条件)。
谢谢。
这就是 Verilog 中有非阻塞 (NBA) 赋值的原因。编码规则是每当有多个进程(在这种情况下,多个 always
块)访问同一个信号(a_o
)同步到同一个事件(@posdege clock
),其中一个进程写入和另一个进程读取,需要使用和NBA<=
赋值来写入信号。
是的,可能存在竞争条件,因为您不知道网络 a_o
是先由模块 A 驱动然后由模块 B 捕获还是相反。
所以你应该为此使用非阻塞分配,因为这将确保无论执行哪个模块,模块 B 将始终具有 net a_o
.
的先前值
您可以通过以下 link 找到有关此非阻塞分配的更多信息。 http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf
我正在尝试使用 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) 赋值的原因。编码规则是每当有多个进程(在这种情况下,多个 always
块)访问同一个信号(a_o
)同步到同一个事件(@posdege clock
),其中一个进程写入和另一个进程读取,需要使用和NBA<=
赋值来写入信号。
是的,可能存在竞争条件,因为您不知道网络 a_o
是先由模块 A 驱动然后由模块 B 捕获还是相反。
所以你应该为此使用非阻塞分配,因为这将确保无论执行哪个模块,模块 B 将始终具有 net a_o
.
您可以通过以下 link 找到有关此非阻塞分配的更多信息。 http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf