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