Parameter an Verilog-Module übergeben

Ich bin gerade dabei, einige Verilog-Module für ein FPGA-Design zu schreiben. Ich habe mich im Internet umgesehen, um herauszufinden, wie ich meine Module am besten parametriere. Ich sehe zwei verschiedene Methoden, die häufig vorkommen. Ich habe hier ein Beispiel für die beiden unterschiedlichen Methoden angeführt. Mit welcher dieser Methoden lassen sich Module am besten parametrisieren? Was ist der Unterschied? Ist es herstellerabhängig (Altera vs Xilinx)?

Die erste Methode: Moduldefinition:

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

Modulinstanziierung:

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)) sl,ave64(
    .bus_data(data_1),
    .bus_wr(wr_1),
    ...
    );
endmodule

Die zweite Methode: Moduldefinition:

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

Modulinstanziierung:

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

Danke im Vorau

EDIT: einige Korrekturen in den Beispielen

Antworten auf die Frage(2)

Ihre Antwort auf die Frage