Verilog中parameter的用法,`define与parameter的区别
(2021-02-09 12:37:12)| 分类: Verilog基础知识 |
一、parameter的使用方法
parameter有2种使用方法:
(1)module
parameters,可综合。
(2)specify
parameters,只能提供定时和延时的值,不可综合。
module
parameter同样有2种使用方法:
(1)parameter用于定义常量。
(2)parameter利用defparam在模块实例化的时候进行参数传递(即重写)。
1、parameter用于定义常量
有2种类型可用关键字:parameter和localparameter
(1)parameter
用parameter来定义常量,即定义一个标识符来代表一个常量,称为符号常量,即标识符形式的常量。使用符号常量可提高程序的可读性和可维护性。
parameter是常量,不是变量,所以不允许在运行时修改它的值,即不能在组合逻辑或者时序逻辑中对其进行赋值。但parameter在模块中声明后,后续编译时还可以被重新声明的值所覆盖。
(2)localparameter
localparam除了不能直接对其进行修改外,其他属性与parameter一样。但可通过在声明时将parameter赋给localparam进行间接修改。
状态机使用localparam比较方便。
|
2 |
parameter
localparam |
2、parameter利用defparam在模块实例化的时候进行参数传递(即重写)。
parameter用于模块实例化时参数传递(重写)的方式有2种:
-
在模块调用过程中修改参数;
-
利用defparam修改参数。
1)在模块调用过程中修改参数
子模块利用parameter定义常量,当子顶层模块对子模块调用过程中未对子模块中定义的parameter参数进行修改时,默认子模块中parameter参数值不变。当需要改变子模块中定义的parameter参数时,可在顶层模块调用子模块时进行参数修改。如:
|
2 3 4 5 6 7 8 9 10 |
module
module endmodule |
2)利用defparam修改参数
当需要在模块调用过程中修改子模块中定义的parameter参数时,也可在利用defparam进行参数修改。如:
|
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
module
endmodule module endmodule |
Ps:模块实例声明方法
模块实例声明有两种实现方式:有序表、参数名。
1)有序列表
列表的顺序必须严格按照模块中参数声明的顺序,且不可跳过任何一个参数。如下面代码,mod_mod中有三个参数,a =
4,b = 5,c = 6.
mod_mod #(1, 2,
3) mod_a(); //三个参数都修改
mod_mod #(4, 2,
3) mod_a(); //只修改b和c,但是也要将a的值声明
mod_mod #(1, 5,
3) mod_a(); //只修改a和c,但是也要将b的值声明
2)参数名
声明时的参数名称需要和模块实例中的参数名称一致,不需要重新声明的参数可以缺省。
mod_mod
#(.a(2), .b(3)) mod_a(); //两个参数都重新声明
mod_mod
#(.b(3)) mod_b(); //只声明参数b
注:针对一个实例的参数声明只能通过一种方式,不可混合,不同实例可以混合。如
//
不合法
mod_mod #(3,
.b(4)) mod_a(); //同时使用两种方式,不合法
//
合法
mod_mod #(3, 4)
mod_a(); //只使用有序列表的方式
mod_mod
#(.a(3), .b(4)) mod_b(); //只使用参数名方式
二、`define与parameter的区别
1、语法
(1)`define
定义:
|
|
`define
|
|
|
reg
|
(2)parameter
定义
|
|
parameter
|
使用
|
|
reg
|
2、作用域
(1)`define
从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。
(2)parameter
parameter定义常量,可以定义在模块内部或外部。
当parameter定义在模块外部时,作用于所在文件内的所有模块;当定义在模块内部时,仅作用于当前模块。
如果想让parameter或`define作用于整个项目,可以将如下声明写于单独文件,并用`include让每个文件都包含声明文件。
|
2 3 |
`ifndef
`define |
3、两者使用时的差异
(1)parameter可以用作例化时的参数传递,`define不可以。
(2)状态机的定义可以用parameter定义,但是不推荐使用`define宏定义的方式。
因为'define 宏定义在编译时自动替换整个设计中所定义的宏,而parameter
仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。例如一个工程里面有两个module
各包含一个FSM,如果设计时都有IDLE这一名称的状态,如果使用'define
宏定义就会混淆起来,如果使用parameter则不会造成任何不良影响。
(3)一旦`define指令被编译,其在整个编译过程中都有效。parameter只在定义的文件中有效,在其它文件中无效。
例如,通过另一个文件中的`define指令,定义的常量可以被其他文件中被调用,直到遇到`undef。

加载中…