注:扫码关注小青菜哥哥的weixin公众号,免费获得更多优质的核探测器与电子学内容~
除了常用的parameter参数外,verilog-2001新引进了一个本地参数localparam。它和parameter的定义方法是一样的,作用域也相同。
这两个参数的区别就在于:本地参数localparam不能通过参数传递方式进行模块化修改,或者说,本地参数就是“地方法规”,是模块内自主权的一部分,外面改变不了。
例子1:本地参数的定义和用法
module #(parameter WIDTH = 8) AAA
(
input clk,
input rst,
input [WIDTH-1:0] data_i,
input [WIDTH+2:0] data_o
);
localparam [3:0] STATE_IDLE = 0;
localparam [3:0] STATE_READ = 1;
localparam [3:0] STATE_WRITE = 2;
……
endmodule
本地参数定义后,参数就只能在本模块内使用,很多人喜欢用它来定义状态机变量。但只要是模块内的常量都可以用localparam来定义。Parameter则更多的用在可传递参数的模块中。
下面列出了宏定义’define,parameter以及 localparam的比较关系:
宏定义 | 参数 | 本地参数 | |
作用范围 | 整个文件,定义语句之后,可跨模块 | 本模块内有效 | 本模块内有效 |
修改 | 新定义后修改 | 模块例化时,通过参数传递修改 | 不可修改 |
建议使用场景 | 全局性常数,比如系统时钟频率 | 本模块可变常数,例如输入、输出信号位宽 | 本模块不变常数,例如状态机的状态值等 |
无论是参数还是本地参数,乃至宏定义,都是所谓“可重用代码设计”的组成部分。可以说,它们是描述代码的代码。在进行这些设计时,要十分小心可能的错误。“可重用”不仅仅是说代码设计人员的重用,还需要考虑其他从来不关心这个代码内部人员的重用。把’define、parameter以及localparam多用并且用好,代码才会更加健壮!
今天的博文就到这里了,有问题请在小青菜哥哥的公众号留言,谢谢!