What are the differences between using define and parameter?
Aside of the fact that the parameter is like a const and `define is compiler directive.
Is there any difference from runtime point of view?
Macros are basically text substitutions, this will be expanded during compile time, Parameters on the other hand are just constants that are resolved at elaboration time.
Macros ARE just text substitutions. They do appear to have overlapping functionality, so in Michael54’s example, there is no difference in runtime execution.
Macros, parameters, and const variables all have features available in some but not others.
const variables get initialized once at the beginning of their lifetime. So if you have a
const variable inside a procedural for-loop, that variable could get initialized at every iteration during runtime. Because
const variables get initialized at runtime, you can't use them where constant expressions are required by the compiler, like the size in a declaration.
Parameter values can be overridden on a module instance by instance basis. And some tools even allow to override parameter values when you invoke simulation. You can’t do either using a macro.
Macros ARE just text substitutions. They have no knowledge of SystemVerilog syntax and just pass the argument text through.
What you might want to use is a generate-for loop
module top_driver #(parameter START_LANE = 0)
for (genvar i = START_LANE; i<START_LANE+4;i++ begin : lane
lane_drv u ()
endmodule
This creates instance names lane[0].u, lane[1].u, lane[2].u, and lane[3].u. See section 27.4 Loop generate constructs in the IEEE 1800-2017 SystemVerilog LRM.