EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
你知道Verilog中parameter和define的区别吗? * t4 d2 @" y3 a) \1 s
1、语法3 `# @; b) K; n5 H2 ?
声明:; x& y3 q$ e0 z$ f
8 W) l- n# n% x6 b6 B! a' g
parameter data = 8‘d14;7 g' h) |" P( y1 R [% [5 ~: q" _
/ Y- a# j+ D! @& {6 a. L
`define data 8’d14
' S+ _ Y% }/ c' C0 k, ?: C5 N/ E2 ^% r
使用:
! b/ C, v) k2 p6 q3 G data
8 Z8 e- O5 H( x; k a- l; t7 \# l
`data
' ?2 u4 p7 w0 S+ G0 z* _' h% a+ @5 z
) b9 r2 S, _8 D# N3 m2、作用域; u3 w2 J c8 d+ o" O- ^
3 ^2 W; j. [& Q. Z! dparameter 作用于声明的那个文件;`define 从编译器读到这条指令开始到编译结束都有效,或者遇到`undef命令使之失效。! H/ |6 {) [7 S# B
% O! [# u5 ?4 ]$ N$ }0 i. Z
如果想让parameter或`define作用于整个项目,可以将如下声明写于单独文件,并用`include让每个文件都包含声明文件:
G+ ]; @$ a9 _* C( X8 i) P# o+ [4 l! }; k2 Y
`ifndef data% R/ a0 m4 Z/ I) k l! C
* ]6 i+ h& G: b `define data 8’d14
6 E9 h$ g3 E7 u6 Z1 i$ E+ a2 e* W: M1 @. Y) O) x: Z2 d0 C
或者, P/ M; D' r7 }( Z4 V, x$ a6 b
" u1 Q5 F3 O3 q! P( hparameter data = 8‘d14;
8 Z* ?! X+ B, n# X" D- F9 e8 a+ d, J) }# v
`endif0 a8 j* u7 r/ t# ]: \
. j1 v& L B' r, |: Y' J
`define也可以写在编译器最先编译的文件顶部。通常编译器都可以定义编译顺序,或者从最底层模块开始编译。因此写在最底层就可以了。* w, `& ~4 Q! k' y1 K
9 L! o& m- ^+ c3、区别
6 W: L1 ?5 J/ {% h' @
i& m3 [7 g A2 Zparameter可以用作例化时的参数传递。
% q7 Y; r6 f2 m3 b! n+ X
" _4 @! r8 M- [' S在使用状态机时候区别挺大的。状态机的定义可以用parameter 定义,但是不推荐使用`define 宏定义的方式,因为'define 宏定义在编译时自动替换整个设计中所定义的宏,而parameter 仅仅定义模块内部的参数,定义的参数不会与模块外的其他状态机混淆。例如一个工程里面有两个module 各包含一个FSM,如果设计时都有IDLE 这一名称的状态,如果使用'define 宏定义就会混淆起来,如果使用parameter 则不会造成任何不良影响。
P( R ~2 ~' E: t. y& H( l, g
/ p( f; }0 x- l9 x& ?8 ~ 一旦`define指令被编译,其在整个编译过程中都有效。例如,通过另一个文件中的`define指令,定义的常量可以被其他文件中被调用。直到遇到`undef;parameter只在定义的文件中有效,在其它文件中无效。
3 | \+ Z- j2 T! N8 e8 Y7 t4 ~ W+ h9 D' P7 T9 s
|