浅谈veriloghdl中parameter的用法

最近有朋友在学习verilog的时候遇到了一些关于parameter语法知识问题,在找寻网络上发现各博主讲述的大多基于存语法,本文在语法上又添加了一部分相关仿真内容共大家学习探讨,仿真环境为modelsim10.4。

1.parameter参数使用

parameter参数定义方式:

parameter 参数定义可以放在接口定义前和模块内部。

parameter参数定义放在接口处格式:

可以看到,模块名后参数定义的具体格式。

事例1:

定义模块:

调用模块:

仿真结果:

可以看到,最终的parameter_1,parameter_2,parameter_3的参数改变成了调用时赋予的值,而不是定义时的值。同时可以看到在调用的时候几个参数的名字不是按照定义时的顺序,这是因为在点对点时可以不用按照顺序调用,在调用的时候,如国并没有给与参数值,在实际的运用当中,模块里就会默认的认为是定义的值。

事例2:

定义模块:

调用模块:

仿真结果:

可以看到在调用的时候,并没有给parameter_2赋值,而仿真呈现的结果默认是parameter_2定义时的值。

除了点对点的调用赋值外,也可以使用直接给值。

事例3

定义模块:

调用模块:

仿真结果:

可以看到最后仿真的parameter结果严格按照赋值的顺序为基准。此种方式可读性与点对点相比要弱一些。

除了将parameter定义在接口处,也可以定义在模块内部,除了作用域不同,完全一样。

事例4

定义模块:

调用模块:

仿真结果:

可以看到parameter_1, parameter_2, parameter_3的值严格的按照调用时的赋值顺序。其他的赋值方式不在累述。

2.defparam使用

defparam可以直接在上层模块去直接修改下层模块的参数,从而实现参数化调用,但是参数需要使用绝对路径来指定。格式如下:

事例5

定义模块:

调用模块:

仿真结果:

可以看到parameter_2的值根据调用模块的defparam语法的改变而改变。

3.parameter与`define的区别

define和paramneterr都可以用于完成文本替换的功能,但其存在本质上的不同,前者是编译之前就预处理,而后者是在正常编译过程中完成替换的。此外,` define和parameter存在下列两点不同之处。

(1)作用域不同.

parameter作用于声明的那个文件;`define从编译器读到这条指令开始到编译结束都有效,或者遇到undef命令使之失效,可以应用于整个工程。如果要让parameter作用于整个项目,可以将如下声明写于单独文件,并用include让每个文件都包含声明文件。

(2)传递功能不同

parameter可以用作模块例化时的参数传递,实现参数化调用;define语句则没有此作用。`define语句可以定义表达式,而parameter只能用于定义变量。例如:

define可以实现此种语法,而parameter则不可以。

4.localparam介绍

localparam其作用域仅可以用作所定义的module内使用,不可以用作参数传递使用。

原文链接:

https://blog.csdn.net/qq_35553265/article/details/103025231