浅谈verilog hdl中parameter的用法
- parameter
- 1.parameter参数使用
- 事例1:
- 事例2:
- 事例3
- 事例4
- 2.defparam使用
- 事例5
- 3.parameter与`define的区别
- 4.localparam介绍
parameter
最近有朋友在学习verilog的时候遇到了一些关于parameter语法知识问题,在找寻网络上发现各博主讲述的大多基于存语法,本文在语法上又添加了一部分相关仿真内容共大家学习探讨
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内使用,不可以用作参数传递使用。