Verilog语法之条件编译`ifdef, `ifndef,`else, `elsif, `endif

文章目录

目录

文章目录

概要

整体架构流程

技术名词解释

技术细节

小结


概要

主要分享条件编译语句的用法

整体架构流程

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指令定义的。

你可能感兴趣的:(FPGA设计-基础篇,fpga开发)