浅谈verilog hdl中parameter的用法

  • parameter
  • 1.parameter参数使用
  • 事例1:
  • 事例2:
  • 事例3
  • 事例4
  • 2.defparam使用
  • 事例5
  • 3.parameter与`define的区别
  • 4.localparam介绍


parameter

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

1.parameter参数使用

parameter参数定义方式:

DesignCompiler 是syn吗_点对点


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

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

DesignCompiler 是syn吗_赋值_02


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

事例1:

定义模块:

DesignCompiler 是syn吗_赋值_03


调用模块:

DesignCompiler 是syn吗_作用域_04


仿真结果:

DesignCompiler 是syn吗_点对点_05


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

事例2:

定义模块:

DesignCompiler 是syn吗_赋值_03

调用模块:

DesignCompiler 是syn吗_赋值_07


仿真结果:

DesignCompiler 是syn吗_作用域_08


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

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

事例3

定义模块:

DesignCompiler 是syn吗_点对点_09


调用模块:

DesignCompiler 是syn吗_作用域_10


仿真结果:

DesignCompiler 是syn吗_点对点_11


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

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

事例4

定义模块:

DesignCompiler 是syn吗_作用域_12


调用模块:

DesignCompiler 是syn吗_作用域_13

仿真结果:

DesignCompiler 是syn吗_作用域_14


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

2.defparam使用

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

DesignCompiler 是syn吗_赋值_15

事例5

定义模块:

DesignCompiler 是syn吗_作用域_16


调用模块:

DesignCompiler 是syn吗_赋值_17


仿真结果:

DesignCompiler 是syn吗_点对点_18


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

3.parameter与`define的区别

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

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

(2)传递功能不同

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

DesignCompiler 是syn吗_作用域_19


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

4.localparam介绍

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