verilog中的parameter、define和localparam

科技   2024-10-10 12:27   新加坡  

parameter:

在编码Verilog module时,可能有一个常量值需要在module中多次使用。这样的常数可以使用“parameter”声明。

优势:使用“parameter”的最大优势是,代码是可扩展的。

示例:假设你正在编写一个代码来计数,直到“20”。所以,你把一个参数定义为:

parameter COUNT_LIMIT=20

现在,如果你希望计数器持续到“30”,只需要重新分配参数值,其他代码将保持不变。

“parameter”的用法:

让我们假设我们需要4个计数器,每个计数器都计数到一个不同的值。这意味着计数器变量需要有不同的宽度来适应不同的计数限制。该模块可以定义如下:

计数器的module定义,从“START_COUNT”到“COUNT_LIMIT”进行计数。当达到上限时,计数器停止并拉高count_done标志。


在module实例化期间,“parameter”常量“WIDTH”和“COUNT_LIMIT”可以更改如下:

第一个实例化计数到5(至少需要3位),第二个实例化到20(至少需要5位

需要记住的要点:


可以通过“defparam”进行更改,但不鼓励。

defparam data_counter.WIDTH=6;

不建议这样做,因为“defparam”允许更改任何其他module的参数。这可能会导致冲突,并且很难在参数值被更改的地方进行调试。

`define

  1. 除了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”开始。在实例化模块时无法更改此值。

数字芯片实验室
前瞻性的眼光,和持之以恒的学习。
 最新文章