以下の内容はhttps://msyksphinz.hatenablog.com/entry/2025/01/18/040000より取得しました。


Verilogにおけるgenerateの非成立側はコンパイルの対象とならない

多分仕様書を読むと当たり前のように書いてあるのだろうけど、ふと気になったのでやってみた。

Verilogにおいて、パラメータなどを使ってgenerate ifで生成するデザインを切り替えるような場合、ifの成立しない側にめちゃくちゃなことを書いていても問題ないのだろうか。

直観的にはパラメータの値はコンパイル時に決まっていないとまずそうだから、generate ifの結果はコンパイル時に決定できて、非成立側は省略できそうな気がする。

module generate_if
  #(parameter IDX = 1)
(
 input logic in,
 output logic out
 );

generate if (IDX == 0) begin: idx_0
  unknown_module u_unknown_inst();
end else begin: idx_other
  assign out = in;
end endgenerate

endmodule // generate_if

Verilatorでやってみると、上記のデザインはコンパイルできた。モジュールが存在していなくても、generate ifの非成立側はコンパイルの対象とならないようだ。

ただし文法的には正しいものが入っている必要がある。例えば、以下のような明らかにVerilogではない何かを入れてはならない:

module generate_if
  #(parameter IDX = 1)
(
 input logic in,
 output logic out
 );

generate if (IDX == 0) begin: idx_0
  unknown_module u_unknown_inst();
  unkonw_code;
end else begin: idx_other
  assign out = in;
end endgenerate

endmodule // generate_if

これはVerilatorではコンパイルエラーとなる:

%Error: generate_if.sv:10:14: syntax error, unexpected ';', expecting '('
   10 |   unkonw_code;
      |              ^
%Error: Exiting due to 1 error(s)



以上の内容はhttps://msyksphinz.hatenablog.com/entry/2025/01/18/040000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14