Passando parâmetros para os módulos Verilog

Estou escrevendo alguns módulos da Verilog para um projeto FPGA. Olhei em volta da internet para descobrir como eu melhor parametrize meus módulos. Eu vejo dois métodos diferentes ocorrendo frequentemente. Incluí um exemplo abaixo das duas metodologias diferentes. Qual desses métodos é a melhor maneira de parametrizar módulos? Qual é a diferença? É dependente do fornecedor (Altera vs Xilinx)?

O primeiro método: definição de módulo:

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

Instanciação do módulo:

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

O segundo método: definição de módulo:

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

Instanciação do módulo:

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

desde já, obrigado

EDIT: algumas correções nos exemplos

questionAnswers(1)

yourAnswerToTheQuestion