多分仕様書を読むと当たり前のように書いてあるのだろうけど、ふと気になったのでやってみた。
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)