2

親モジュールに渡されたパラメータ値を使用して、インスタンス化したいモジュールを選択する方法はありますか? 以下の例

module parent ();

 parameter WORD = 1; 

 child_`WORD child (); // obviously does not work

endmodule

の場合は child_1 モジュールをインスタンス化し、 の場合WORD == 1は child_2 モジュールなどをインスタンス化しますWORD == 2。確かに、誰かが以前にこれを行う必要がありましたか?

4

1 に答える 1

7

generateモジュールを条件付きでインスタンス化する場合は、ブロックを使用する必要があります。

generate
  if (WORD == 1) begin
    child_1 child();
  end
  if (WORD == 2) begin
    child_2 child();
  end
endgenerate

以下は完全な動作例です。child_1 と child_2 の存在のみを考慮していることに注意してください。インスタンス化するモジュールの型名の一部としてパラメーターを使用することはできません。N 個の子モジュールがあり、それらすべてを生成ブロックで明示的に列挙したくない場合は、おそらくヘルパー マクロを作成する必要があります。

ところで、これは有効な Verilog コードです。SystemVerilog 機能は一切使用しません。

module child_1();
  initial begin
    $display("child_1 %m");
  end
endmodule

module child_2();
  initial begin
    $display("child_2 %m");
  end
endmodule

module parent();
  parameter WORD = 1;

  // Conditionally instantiate child_1 or child_2 depending 
  // depending on value of WORD parameter.
  generate
    if (WORD == 1) begin
      child_1 child();
    end
    if (WORD == 2) begin
      child_2 child();
    end
  endgenerate

endmodule

module top();
  parent #(.WORD(1)) p1();
  parent #(.WORD(2)) p2();
endmodule

Incisive からの出力:

child_1 top.p1.genblk1.child
child_2 top.p2.genblk2.child
于 2013-04-18T19:56:20.360 に答える