在Verilog中,模块参数定义的定义分为两种:模块声明时定义的参数和模块体内部定义的参数。
-
模块声明时定义的参数(Module Parameter):
- 模块声明时定义的参数是在模块实例化时提供的常量值。
- 它们是通过模块实例化语句的参数列表来指定的。
- 参数的值在编译时确定,不能在运行时改变。
- 它们通常用于在不同的模块实例之间共享常量或配置选项。
示例:
module MyModule #(parameter WIDTH = 8) (input [WIDTH-1:0] data);// 使用模块参数 WIDTH// ... endmodule// 实例化 MyModule 并为参数 WIDTH 提供值 MyModule #(16) myInstance (.data(data_in));
-
模块体内部定义的参数(Local Parameter):
- 模块体内部定义的参数是在模块内部使用的常量值。
- 它们在模块的声明和实例化之间被定义,并且只在模块内部可见。
- 参数的值在编译时确定,不能在运行时改变。
- 它们通常用于在模块内部进行计数、索引或配置选项。
示例:
module MyModule (input [WIDTH-1:0] data);parameter WIDTH = 8;// 使用模块内部定义的参数 WIDTH// ... endmodule// 实例化 MyModule 并为参数 WIDTH 提供值 MyModule #(16) myInstance (.data(data_in));
总结:
- 模块声明时定义的参数是在模块实例化时提供的常量值,用于在不同的模块实例之间共享常量或配置选项。
- 模块体内部定义的参数是在模块内部使用的常量值,在模块内部进行计数、索引或配置选项。
- 两者的区别在于作用范围和可见性,以及模块体内部定义的参数只在模块内部可见,而模块声明时定义的参数可以在模块实例化的时候提供不同的值。
- 两种方式定义的parameter均可在例化时通过#()对参数进行配置,个人觉得使用起来几乎没区别,取决于个人习惯。
- 部分博文说当模块体内部定义的参数(Local Parameter)的方式在例化时更新参数会报错的说法是错误的。