Pasar parámetros a los módulos Verilog

Estoy en el proceso de escribir algunos módulos Verilog para un diseño FPGA. Miré en internet para descubrir cómo mejor parametrizo mis módulos. Veo dos métodos diferentes que ocurren a menudo. Incluí un ejemplo a continuación de las dos metodologías diferentes. ¿Cuál de estos métodos es la mejor manera de parametrizar módulos? ¿Cuál es la diferencia? ¿Es dependiente del proveedor (Altera vs Xilinx)?

El primer método: definición del módulo:

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

Módulo de instanciación:

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

El segundo método: definición del módulo:

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

Módulo de instanciación:

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

Gracias por adelantado

EDITAR: algunas correcciones en los ejemplos

Respuestas a la pregunta(1)

Su respuesta a la pregunta