はじめに
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の違いについて確認しました。
コメント