信号之间的竞争条件
Race condition between signals
我遇到了一个测试平台,它基本上可以归结为以下示例:时钟和信号在同一时间步内通过阻塞分配进行更改。我相信这会导致时钟和两个 ctrlX 信号之间的竞争条件,但我无法在 EDA 操场上证明(我知道这是我无法控制的)。我是否正确认为存在竞争条件?
(EDA 游乐场 link:https://www.edaplayground.com/x/5yDX#&togetherjs=gkG5xewfNN)
module tb_example;
reg clk = 1;
reg [3:0] dff1,dff2;
reg [3:0] ctrl1 = 'd0;
reg [3:0] ctrl2 = 'd0;
initial begin
#10 ctrl1 = 'd1;
#20 ctrl1 = 'd2;
#10 ctrl1 = 'd3;
#100 $finish;
end
always begin
#5 clk = !clk;
end
initial begin
$dumpfile("dump.vcd");
$dumpvars(0,tb_example);
end
initial begin
#10 ctrl2 = 'd1;
#20 ctrl2 = 'd2;
#10 ctrl2 = 'd3;
#100 $finish;
end
always @ (posedge(clk)) begin
dff1 <= ctrl1;
end
always @ (posedge(clk)) begin
dff2 <= ctrl2;
end
endmodule
是的,这是一个竞争条件,因为您正在为 ctrlx 使用阻塞分配,并且它们与 posedge clk
同时发生变化。因此,分配给 dffx 的值是不确定的,并且可能因模拟器而异。
避免这种情况的一种方法是在 clk 的边缘更改 ctrlx:
reg clk = 0;
我遇到了一个测试平台,它基本上可以归结为以下示例:时钟和信号在同一时间步内通过阻塞分配进行更改。我相信这会导致时钟和两个 ctrlX 信号之间的竞争条件,但我无法在 EDA 操场上证明(我知道这是我无法控制的)。我是否正确认为存在竞争条件? (EDA 游乐场 link:https://www.edaplayground.com/x/5yDX#&togetherjs=gkG5xewfNN)
module tb_example;
reg clk = 1;
reg [3:0] dff1,dff2;
reg [3:0] ctrl1 = 'd0;
reg [3:0] ctrl2 = 'd0;
initial begin
#10 ctrl1 = 'd1;
#20 ctrl1 = 'd2;
#10 ctrl1 = 'd3;
#100 $finish;
end
always begin
#5 clk = !clk;
end
initial begin
$dumpfile("dump.vcd");
$dumpvars(0,tb_example);
end
initial begin
#10 ctrl2 = 'd1;
#20 ctrl2 = 'd2;
#10 ctrl2 = 'd3;
#100 $finish;
end
always @ (posedge(clk)) begin
dff1 <= ctrl1;
end
always @ (posedge(clk)) begin
dff2 <= ctrl2;
end
endmodule
是的,这是一个竞争条件,因为您正在为 ctrlx 使用阻塞分配,并且它们与 posedge clk
同时发生变化。因此,分配给 dffx 的值是不确定的,并且可能因模拟器而异。
避免这种情况的一种方法是在 clk 的边缘更改 ctrlx:
reg clk = 0;