Для перечисленных вами случаев я бы порекомендовал параметры.
Как и директива компилятора C, `define является глобальным для компиляции.Если ваш код когда-либо будет использоваться с кодом, который вы не контролируете, вам нужно быть здесь осторожным.
Параметры всегда локальны для области видимости модуля, поэтому идентичные имена параметров в разных элементах дизайна не будут конфликтоватьдруг с другом.У них также есть преимущество в том, что они могут быть переопределены для каждого отдельного экземпляра.
module #(parameter DATA_WIDTH = 1) busSlave(
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