我正在嘗試使用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中不存在物理實現中的競爭。 –