always@*とalways_combの違い SystemVerilog

はじめに

always@*とalways_combは一見同じ動作をしそうですが、小さな違いがあります。

両者の違いについてまとめました。

always@*とalways_combの違い

always@*はマルチドライブできる。always_combはマルチドライブできない

// Syntaxエラー
always_comb begin
    a = din;
end
always_comb begin
    a = din;
end
// コンパイルOK
always @* begin
    b = din;
end
always @* begin
    b = din;
end

alwaysは0sで動作しない。always_combは0sで動作する。

下記のようなコードがあります。dinが変化したときにalways文が動作しそうですが、always_combでは0sでも動作します。

module top();
    logic a, b;
    bit din;
    initial begin
        #1;
        din = 1;
    end
    always_comb begin
        $display("always_comb %d", din);
    end
    always @* begin
        $display("always %d", din);
    end
endmodule
// 出力
// always_comb 0
// always_comb 1
// always 1

まとめ

always@*とalways_combの違いについてまとめました。

コメント

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