alwaysとalways_ffの違い

はじめに

Verilogではalwaysを使用してフロップフロップと組み合わせ回路の両方を作成しますが、

SystemVerilogではフリップフロップ用にalways_ff、組み合わせ回路用にalways_combが追加されています。

alwaysとalways_ffでは微妙に挙動が異なるので、その違いについて確認していきます。

alwaysとalways_ffの違い

always_ffはマルチドライブできない

alwaysはマルチドライブすることができますが、always_ffはマルチドライブできません。

always
always @(posedge clk) begin
    a <= '1;
end
always @(posedge clk) begin
    a <= '0;  // aがマルチドライブ。OK。
end
always_ff
always_ff @(posedge clk) begin
    a <= '1;
end
always_ff @(posedge clk) begin
    a <= '0;  // aがマルチドライブ。コンパイルエラー。
end

always_ffはイベントコントロールは1つまで

alwaysは複数のイベントコントロールを記述できますが、always_ffは1つしか記述できません。

また、always_ffはイベントコントロールがない場合もエラーとなります。

always
always @(posedge clk) begin
    @(posedge clk);  // イベントコントロールが2つある。OK。
    a <= '1;
end

always begin  // イベントコントロールがない。OK(ただし無限ループになる)。
    a <= '1;
end
always_ff
always_ff @(posedge clk) begin
    @(posedge clk);  // イベントコントロールが2つある。コンパイルエラー。
    a <= '1;
end

always_ff begin  // イベントコントロールがない。コンパイルエラー。
    a <= '1;
end

まとめ

alwaysとalways_ffの違いについて確認しました。

コメント

タイトルとURLをコピーしました