我正在尝试使用Verilog HDL制作流水线处理器。我意识到在我的代码中可能存在某些竞争条件。所以我打算写一须藤代码,想请教各位,如果有内的竞争条件,以及如何避免它:Verilog:以下代码是否会造成竞争状况?
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)的总延迟(即竞态条件)。
谢谢。
非常感谢您的回复。还有两个问题:1.我应该只用NBA写作块? 2.竞赛状态只是一个模拟问题,还是一个物理实现(综合后)问题?我的意思是说,在综合之后,由于不同路径的延迟可能会有不同的行为? –
根据我刚才给出的规则,你应该使用NBA的,否则使用正常的任务。在RTL中,转换为使用NBAs来输出时序逻辑。不幸的是,你可以在你的RTL中进行竞争,这在物理实现中不存在,并且在RTL中不存在物理实现中的竞争。 –