主要分享条件编译语句的用法
C语言中的每一行代码都要参加编译。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译,此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译(conditional compile)。
到FPGA的开发,其条件编译可以通俗的理解为,根据条件选择性地将指定部分综合为电路,而未被指定部分则不综合成电路,这可以有效地减少电路面积和提高代码的复用性和灵活性
Verilog支持一些编译器指令,这些指令本质上指导编译器以某种方式处理代码。例如,代码的一部分可以表示某个功能的实现,如果不使用该功能,则应该有某种方法不将代码包括在设计中。
这可以通过条件编译来解决,在条件编译中,设计器可以将代码包装在编译器指令中,编译器指令告诉编译器在设置给定的命名标志时包含或排除要编译的代码。
1:情况1:
#ifdef _XXXX
...程序段1...
#else
...程序段2...
#endif
这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
例:
#define NUM
情况2:
#ifndef _XXXX
...程序段1...
#else
...程序段2...
#endif
这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况
情况3:
#if 常量
...程序段1...
#else
...程序段2...
#endif
这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。
以上是举例说明这几个条件编译的用法。
代码示例“:
- module tb;
- initial begin
- `ifndef FLAG
- display("FLAG is Defined");
- `ifdef NEST1_A
- display("FLAG and NEST1_A are Defined");
- `ifdef NEST2
- display("FLAG,NEST1_A and NEST2 are Defined");
- `endif
- `ifdef NEST1_B
- display("FLAG and NEST1_B are Defined");
- `ifndef WHITE
- display("FLAG and NEST1_B are Defined but WHITH is not");
- `else
- display("FLAG,NEST1_B and WHITH are Defined");
- `endif
- `else
- display("Only FLAG Defined");
- `endif
- `else
- display("FLAG is not Defined");
- `endif
- end
- endmodule
条件编译可以使用Verilog中的`ifdef
和`ifndef
关键字来实现。这些关键字可以出现在设计中的任何位置,也可以嵌套在另一个关键字中。
关键字`ifdef
只是告诉编译器在下一个`else
或者`endif
之前包含这段代码,或者如果给定的名为FLAG的宏是使用`define
指令定义的。