私はこれらの4つの用語の間で完全に混乱しています:always_ff
、always_comb
、always_latch
およびalways
。これらはどのように、どのような目的で使用できますか?
always
はVerilogの主なプロセスタイプで、もう1つはinitial
です。これはシミュレーションの開始時に1回実行されます。
always_ff @(posedge clk)
:
フリップフロップ(ff)を表し、クロックのすべての正のエッジでプロセスがトリガー(実行)されます。これはalways @(posedge clk)
を置き換えます。これは、ノンブロッキング(<=
)割り当てを使用する必要があります。これは、フリップフロップがデータを転送する方法を模倣しているためです。
always_ff @(posedge clk) begin
a <= b;
end
always_latch
:ラッチを表すためのものです。
使用法は次のとおりです。
always_latch begin
if (enable) begin
a_latch = something;
end
//No else clause so a_latch's value
//is not always defined, so it holds its value
end
これは置き換えます:
always @* begin
if (enable) begin
a_latch = something;
end
//No else clause so a_latch's value
//is not always defined, so it holds its value
end
always_comb
:
組み合わせロジック用であり、always @*
ラッチが不要な場合。これで、ラッチが必要な場合と不要な場合の設計意図を区別できるようになりました。
SystemVerilog名always_ff
、always_latch
およびalways_comb
トリガーされるタイミングの基準が厳しくなります。つまり、RTLからゲートレベル(合成後)の不一致の可能性が低くなります。それは、そこに100%同等ではないことを意味しますalways @
カウンターパートであり、一部のシミュレーション動作を変更する場合があります。