parameter与define的三大区别
今天小编给各位分享define的知识,文中也会对其通过parameter与define的三大区别和Verilog中parameter和define的区别等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!
内容导航:
一、parameter与define的三大区别
程序中多次出现某些数字,如延迟时间或变量的宽度,有时可能要改变这些值,这种情况下经常要用到参数。参数一经声明,就视其为一个常量,在整个仿真过程中不再改变。
使用参数可以提高程序的可读性,也利于修改。
1.语法定义
2.作用范围
parameter作用于声明的那个文件;`define从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令失效。
3.功能
状态机可以用 parameter 定义,但是不推荐使用`define 宏定义的方式,因为ˈdefine宏定义在编译时自动替换整个设计中所定义的宏,而 parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态混淆。例如一个工程里面有两个 module 各包含一个FSM,设计时都有IDLE这一名称的状态,如果使用ˈdefine宏定义就会发生混淆,如果使用parameter则不会造成任何不良影响。
一旦`define指令被编译,其在整个编译过程中都有效。例如,通过一个文件中的`define指令,定义的常量可以在其他文件中被调用,直到遇到`undef。
parameter只在定义的文件中有效,在其他文件中无效,举例如下。
一、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
只在定义的文件中有效,在其它文件
二、Verilog中parameter和define的区别
1语法定义param肠畅斑堆职瞪办缺暴画eter xx = yy;
`define xx yy ( 注: 句尾无分号)
2作用范围
parameter 作用于声明的那个文件;`define 从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效
3功能
状态机的定义可以用parameter 定义,但是不推荐使用`define 宏定义的方式,因为'define 宏定义在编译时自动替换整个设计中所定义的宏,而parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。例如一个工程里面有两个module 各包含一个FSM,如果设计时都有IDLE 这一名称的状态,如果使用'define 宏定义就会混淆起来,如果使用parameter 则不会造成任何不良影响。
`define
一旦`define指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的`define指令,定义的常量可以被其他文件中被调用。直到遇到 `undef.
parameter只在定义的文件中有效,在其它文件中无效
eg:
`define plus 3'd0
`define minuus 3'd1
`define band 3'd2
`define bor 3'd3
`define oppo 3'd4
module test(
input[7:0] a,
input[7:0] b,
input[2:0] opcode,
output[7:0]out);
reg [7:0] rout;
always @(a or b or opcode)
case(opcode)
`plus: rout=a+b;
`minuus: rout=(a>b)?b:a;
`band: rout=a & b;
`bor: rout =a | b;
`oppo: rout =~a;
default: rout=8'hxx;
endcase
assign out=rout;
endmodule
三、Verilog中parameter和define的区别
`define 是宏定义,全局作用的,而且不受语意限制。你甚至可以定义半截的字符串出来。但是使用的时候才会做展开。举例而言,如果你定义一个宽度信息为:
`define RANGE 2:3
然后在使用的时候`include这个文件,RANGE就可以解析了。
wire [`RANGE] bus;
parameter是模块内常量定义,仅限于常量。一般的工具对于parameter的支持力度更好,毕竟是语意可以识别的。而`define的支持仅仅限于parse阶段,不会流入到elaboration阶段。但是如果把``define的使用场景都改为parameter会造成不必要的变量的引入。
目前一般使用`define的地方一般是全局化的configuration阶段。比如说对整个IP的配置信息,一个IP应该满足不同的SOC的需求提供不同的配置。
关于define的问题,通过《Verilog中parameter和define的区别》、《Verilog中parameter和define的区别》等文章的解答希望已经帮助到您了!如您想了解更多关于define的相关信息,请到本站进行查找!
爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。