2016-09-25 106 views
1

我正在嘗試使用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

這就是爲什麼Verilog中有非阻塞(NBA)任務的原因。編碼規則是每當有多個進程(在這種情況下,多個always塊)訪問與同一事件(@posdege clock)同步的同一信號(a_o),其中一個進程寫入並且另一個進程讀取時,您需要使用和NBA <=分配寫信號。

+0

非常感謝您的回覆。還有兩個問題:1.我應該只用NBA寫作塊? 2.競賽狀態只是一個模擬問題,還是一個物理實現(綜合後)問題?我的意思是說,在綜合之後,由於不同路徑的延遲可能會有不同的行爲? –

+0

根據我剛纔給出的規則,你應該使用NBA的,否則使用正常的任務。在RTL中,轉換爲使用NBAs來輸出時序邏輯。不幸的是,你可以在你的RTL中進行競爭,這在物理實現中不存在,並且在RTL中不存在物理實現中的競爭。 –

1

是的,可能會出現競態條件,因爲您不知道網絡a_o是先由模塊A驅動然後由模塊B捕獲,反之亦然。

因此,您應該使用Non Blocking Assignment,因爲這樣可以確保無論哪個模塊被執行,模塊B將始終具有以前的網絡值a_o

您可以通過以下鏈接找到更多關於此非阻塞作業的信息。 http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf