2017-08-31 3 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 

出力:なぜ常に2番目の$仕上げを経由して、完全な

**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ブロックからの出力を駆動しない場合は、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)は、AまたはBの値が変更されるまで待つことを意味します(結果の変更と混同しないでください。A|B)。 @*は、続くステートメントを見て、変化を待つ信号の暗黙的な機密性の高いリストを構築することを意味します。

最初のalwaysでは、次の文はbegin/endブロックです。したがって、reg_Aが機密性リストに追加されます。 2番目のalwaysでは、その後のステートメントはnullステートメントであるため、変更に影響を受けません。

always @*が時間ゼロで実行されることを確認する唯一の方法は、時間0に変更が加えられたブロックに変数への参照を入れることです。その後、その変数にノンブロッキング割り当てを使用して、条件。

いっそのこと、特にこの問題を解決するために設計されたalway_combを使用しています。

+0

ありがとうございました。 Verilogにalways_combの代替手段はありますか? – sanforyou

+0

それは時間0で1つの提案は必ずセンシティビティリストのすべてがワイヤとして宣言されていることを確認する方法があります実行しないブロックを引き起こしている状況に依存します。 –

関連する問題