2017-08-31 76 views
0

我想在零時刻始終執行阻止。 例如下面的代碼將不會在零時刻執行。始終在零時間阻止執行

always @* begin 
//functional code 
end 

我在最後移動的靈敏度列表中,這樣的代碼將在零時刻執行,

always begin 
//funcitonal code 
@*; 
end 

此代碼執行時間爲零,但零時間畢竟不以執行,即使有塊內使用的輸入變化。例如參見下面的代碼和它的輸出:

module AlwaysTimeZeroTest_v(); 

reg reg_A; 

initial begin 
    $display ("I'm in Initial begin block  \tTime=%f, reg_A=%b\n",$stime,reg_A); 
    #1 
    reg_A=1'bZ; 

    #1 
    reg_A=1'b1; 

    #1 
    reg_A=1'b0; 

    #1 
    reg_A=1'bZ; 

    #5 $finish; 
end 

always @* begin 
    $display ("I'm in Non-time Zero always block\tTime=%f, reg_A=%b\n",$stime,reg_A); 
end 

always begin 
    $display ("I'm in time Zero always block  \tTime=%f, reg_A=%b\n",$stime,reg_A); 
    @*; 
end 

endmodule 

輸出:在時間

**I'm in Initial begin block    Time=0.000000, reg_A=x 

I'm in time Zero always block   Time=0.000000, reg_A=x 

I'm in Non-time Zero always block  Time=1.000000, reg_A=z 

I'm in Non-time Zero always block  Time=2.000000, reg_A=1 

I'm in Non-time Zero always block  Time=3.000000, reg_A=0 

I'm in Non-time Zero always block  Time=4.000000, reg_A=z** 

模擬通過$完成(1)完整的9 NS + 0

任何人都可以解釋爲什麼第二總代碼中的塊在時間零之後根本不執行?

有沒有一種方法可以實現始終阻止,以便它在零時間執行而不使用初始塊? (類似於SV中的always_comb?)

回答

0

您已經標記了這個system-verilog,所以我會給出與此相關的答案。 如果您當前的使用情況爲always @*,並且您不驅動多個始終塊的輸出,請使用always_comb。每LRM,always_comb將在時間0中執行

module AlwaysTimeZeroTest_v(); 

reg reg_A; 

initial begin 
    $display ("I'm in Initial begin block  \tTime=%f, reg_A=%b\n",$stime,reg_A); 
    #1 
    reg_A=1'bZ; 
    #1 
    reg_A=1'b1; 
    #1 
    reg_A=1'b0; 
    #1 
    reg_A=1'bZ; 
    #5 $finish; 
end 

always_comb begin 
    $display ("I'm in Non-time Zero always block\tTime=%f, reg_A=%b\n",$stime,reg_A); 
end 

always_comb begin 
    $display ("I'm in time Zero always block  \tTime=%f, reg_A=%b\n",$stime,reg_A); 
    // @*; 
end 

endmodule 
4

很多人沒有意識到,@是一個語句修飾詞,不能單獨建設。它表示推遲接下來的聲明,直到有事件發生。 @(A or B)表示等待,直到AB的值發生變化(不要與A|B的結果變化混淆)。 @*表示查看下面的語句,並構建一個隱式的敏感信號列表以等待更改。

在您的第一個always中,後面的語句是begin/end塊,因此將reg_A添加到靈敏度列表中。在您的第二個always中,隨後的聲明是null聲明,因此對任何更改均不敏感。

確保always @*在零時刻執行的唯一方法是在時間爲0的塊中對變量進行一些引用。然後對該變量使用非阻塞賦值,以避免任何時間0競爭條件。

更好的是,使用alway_comb這是專門設計來解決這個問題。

+0

感謝戴夫的解釋。 Verilog中是否有對always_comb的替代方案? – sanforyou

+0

它取決於導致塊不在時間0執行的情況。一個建議可能是確保敏感性列表中的所有內容都被聲明爲導線。 –