parameter:
在编码Verilog module时,可能有一个常量值需要在module中多次使用。这样的常数可以使用“parameter”声明。
优势:使用“parameter”的最大优势是,代码是可扩展的。
示例:假设你正在编写一个代码来计数,直到“20”。所以,你把一个参数定义为:
parameter COUNT_LIMIT=20
现在,如果你希望计数器持续到“30”,只需要重新分配参数值,其他代码将保持不变。
“parameter”的用法:
让我们假设我们需要4个计数器,每个计数器都计数到一个不同的值。这意味着计数器变量需要有不同的宽度来适应不同的计数限制。该模块可以定义如下:
在module实例化期间,“parameter”常量“WIDTH”和“COUNT_LIMIT”可以更改如下:
需要记住的要点:
可以通过“defparam”进行更改,但不鼓励。
defparam data_counter.WIDTH=6;
不建议这样做,因为“defparam”允许更改任何其他module的参数。这可能会导致冲突,并且很难在参数值被更改的地方进行调试。
`define
- 除了parameter外,还有define,可以全局(在module内部或外部)进行。使用宏的简单语法是:
`define CYCLE_COUNT 40
要记住的要点:
- `define可以在文件中的任何地方使用,而parameter只能在module中声明。
- `define的使用将取决于编译顺序。这意味着,如果编译列表中有10个文件,并且`define CYCLE_COUNT 40出现在第5个文件中,则只有下一个文件才能使用此宏。
- `define宏也可以在另一个地方重新定义,可能会导致意想不到的结果。
- `define宏可以将值传递给parameter,如下所示:
指南1:为了避免在许多地方更改“define”的问题,该指南是将所有“define”放在一个文件中,并在编译过程中将其作为第一个文件读取。
指南2:在module的本地范围内定义parameter,并仅对具有全局使用要求的常量使用`define。
localparam
这是一种常量,只能在module内本地声明。实例化模块时无法更改。
上面使用的模块“data_counter”将START_COUNT定义为localparam,因为所有计数器都需要从“1”开始。在实例化模块时无法更改此值。