web-dev-qa-db-ja.com

Verilogモジュールへのパラメーターの受け渡し

FPGAデザイン用のVerilogモジュールをいくつか作成中です。私はインターネットを見て、モジュールを最適にパラメータ化する方法を見つけました。 2つの異なる方法が頻繁に発生しているのがわかります。以下に、2つの異なる方法論の例を示しました。これらの方法のどれがモジュールをパラメータ化するための最良の方法ですか?違いはなんですか?ベンダーに依存しますか(アルテラとザイリンクス)?

最初の方法:モジュール定義:

module busSlave #(parameter DATA_WIDTH = 1) (
  input [DATA_WIDTH-1:0] bus_data,
  input                  bus_wr,
  ...
);
endmodule

モジュールのインスタンス化:

module top;

  //DATA_WIDTH is 32 in this instance
  busSlave #(.DATA_WIDTH(32)) slave32(
    .bus_data(data_0),
    .bus_wr(wr_0),
    ...
    );

  //DATA_WIDTH is 64 in this instance
  busSlave #(.DATA_WIDTH(64)) slave64(
    .bus_data(data_1),
    .bus_wr(wr_1),
    ...
    );
endmodule

2番目の方法:モジュール定義:

module busSlave(
  parameter DATA_WIDTH = 1;
  input [DATA_WIDTH-1:0] bus_data,
  input                  bus_wr,
  ...
);
endmodule

モジュールのインスタンス化:

module top;

  //DATA_WIDTH is 32 in this instance
  busSlave slave32(
    .bus_data(data_0),
    .bus_wr(wr_0),
    ...
    );
  defparam slave32.DATA_WIDTH = 32;

  //DATA_WIDTH is 64 in this instance
  busSlave slave64(
    .bus_data(data_1),
    .bus_wr(wr_1),
    ...
    );
  defparam slave32.DATA_WIDTH = 64;
endmodule

前もって感謝します

編集:例のいくつかの修正

7
eavsteen

defparamステートメントは非推奨になる予定です。 IEEE Std 1800-2012、Annex C(非推奨)、セクション「C.4.1Defparamステートメント」には次のように記載されています。

パラメータ再定義の代替方法の1つを使用するように、コードを移行することを強くお勧めします。

Verilogの多くの機能はベンダーに依存しています。

4
toolic