Verilog中parameter和define的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Verilog中parameter和define的区别相关的知识,希望对你有一定的参考价值。

1、语法
声明:
parameter xx = yy;
`define XX YY

使用:
xx
`XX

2、作用域
parameter 作用于声明的那个文件;`define 从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。

如果想让parameter或`define作用于整个项目,可以将如下声明写于单独文件,并用`include让每个文件都包含声明文件:
`ifndef xx
`define xx yy // or parameter xx = yy;
`endif

`define也可以写在编译器最先编译的文件顶部。通常编译器都可以定义编译顺序,或者从最底层模块开始编译。因此写在最底层就可以了。

3、作用
parameter可以用作例化时的参数传递。具体方法参见《Verilog例化时的参数传递》一文

在使用状态机时候区别挺大的
状态机的定义可以用parameter 定义,但是不推荐使用`define 宏定义的方
式,因为'define 宏定义在编译时自动替换整个设计中所定义的宏,而
parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机
混淆。例如一个工程里面有两个module 各包含一个FSM,如果设计时都有
IDLE 这一名称的状态,如果使用'define 宏定义就会混淆起来,如果使用
parameter 则不会造成任何不良影响

’define
一旦‘define指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的’define指令,定义的常量可以被其他文件中被调用。直到遇到 ‘undef
parameter
只在定义的文件中有效,在其它文件中无效
参考技术A 1、语法
声明:
parameter xx = yy;
`define XX YY

使用:
xx
`XX

2、作用域
parameter 作用于声明的那个文件;`define 从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。

如果想让parameter或`define作用于整个项目,可以将如下声明写于单独文件,并用`include让每个文件都包含声明文件:
`ifndef xx
`define xx yy // or parameter xx = yy;
`endif

`define也可以写在编译器最先编译的文件顶部。通常编译器都可以定义编译顺序,或者从最底层模块开始编译。因此写在最底层就可以了。

3、作用
parameter可以用作例化时的参数传递。具体方法参见《Verilog例化时的参数传递》一文

在使用状态机时候区别挺大的
状态机的定义可以用parameter 定义,但是不推荐使用`define 宏定义的方
式,因为'define 宏定义在编译时自动替换整个设计中所定义的宏,而
parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机
混淆。例如一个工程里面有两个module 各包含一个FSM,如果设计时都有
IDLE 这一名称的状态,如果使用'define 宏定义就会混淆起来,如果使用
parameter 则不会造成任何不良影响

’define
一旦‘define指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的’define指令,定义的常量可以被其他文件中被调用。直到遇到
‘undef
parameter
只在定义的文件中有效,在其它文件

非特定的 `include 文件名 - 系统 Verilog 编译器指令

【中文标题】非特定的 `include 文件名 - 系统 Verilog 编译器指令【英文标题】:Non-specific `include file name - System Verilog compiler directives 【发布时间】:2017-04-17 03:10:28 【问题描述】:

我想使用 `include 指令来调用非特定文件名。例如, 在其他目录中有这个文件名“name_defines.svh”。由于“name_defines.svh”的“名称”发生了变化(可以是例如a_defines.svh、b_defines.svh ..等),如果我只使用它可能吗

`include "_defines.svh"

`include "*_defines.svh"

以便系统verilog编译器找到文件名并将其包含在我当前的.sv文件中,就像我使用过的一样

`include "name_defines.svh"

附言- 假设工作目录中没有其他文件具有尾随的“_defines.svh”字样,并且仅对“name_defines.svh”是唯一的

【问题讨论】:

【参考方案1】:

SystemVerilog 没有这样做的机制。通配符文件匹配是您从中运行模拟的 shell 的一项功能。

如果您只想在当前工作目录中包含一个文件,则它应该具有相同的名称。或者,您的调用脚本可以放置从特定名称到通用名称的链接。另一种选择是在命令行上使用宏定义文件名

+define+FILE="name_defines.svh"

`include `FILE

请注意,根据您使用的 shell,您可能需要对命令行中的引号进行转义。

【讨论】:

以上是关于Verilog中parameter和define的区别的主要内容,如果未能解决你的问题,请参考以下文章

verilog HDL-参数型数据对像 与‘define

怎样把异步FIFO的Verilog hdl 代码中的parameter DSIZE = 8; parameter ASIZE = 4;改为宽度为16位,谢谢!

实战verilog中`define的使用记录

Verilog基础知识0(`defineparameterlocalparam三者的区别及举例)

verilog中有谁用过用parameter定义的常数做赋值语句的位宽限制

请问在FPGA Verilog设计中,使用关键字parameter定义常数有什么好处?