2

Systemverilog で `define マクロよりも生成ステートメントを選択したり、その逆を選択したりするためのガイドラインは何ですか?

たとえば、module1 または module2 のいずれかを条件付きでインスタンス化する場合は、次のいずれかを実行できるようです。

`ifdef COND1
module1 ();
`else
module2 ();

また

generate
if (COND1) begin
module1 ();
end else begin
module2();
end
endgenerate
4

3 に答える 3

3

人々はさまざまな意見を持っていますが、2 つの大きな違いの 1 つは、異なるインスタンスを異なる方法で構成できるようにすることですが、マクロはそうではありません。これは、generate がコンパイル時ではなく、作成時に評価されるためです。

たとえば、モジュールがある場合:

module ahwoogaa #(bit COND1) ();

  generate
    if (COND1) begin
      module1 ();
    end else begin
      module2();
    end
  endgenerate

endmodule

次のように COND1 で 2 回インスタンス化できます。

module neeenaaaw();

  ahwoogaa #(1'b0) alarm1();
  ahwoogaa #(1'b1) alarm2();

endmodule

aを使用すると、モジュールをコンパイルするときに値を一度設定するため、すべてのインスタンスに対してdefine単一の値を持たなければなりません。COND1

個人的には、できる限りジェネレートを選択すると言います。

于 2013-05-20T06:42:10.033 に答える
1

`ifdefポートリスト内で使用できます:

module music
  output [31:0] left,
`ifdef STEREO
  output [31:0] right,
`enfif
...

allow ループを生成し、X 回インスタンス化する

genvar inst;
generate 
  for (inst=0; inst<3; inst=inst+1) begin : gen_block
   sub_module instancex( .clk, .din(din[inst]), .dout(dout[inst]) );
  end
endgenerate

注意: これにより、追加のレベルの階層 (gen_block) が導入されます。

于 2013-05-21T13:44:23.653 に答える