web-dev-qa-db-ja.com

always_ff、always_comb、always_latch、およびalwaysの違い

私はこれらの4つの用語の間で完全に混乱しています:always_ffalways_combalways_latchおよびalways。これらはどのように、どのような目的で使用できますか?

19
user2138826

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_ffalways_latchおよびalways_combトリガーされるタイミングの基準が厳しくなります。つまり、RTLからゲートレベル(合成後)の不一致の可能性が低くなります。それは、そこに100%同等ではないことを意味しますalways @カウンターパートであり、一部のシミュレーション動作を変更する場合があります。

22
Morgan