条件编译指令用于在编译过程中选择性地包含 Verilog HDL代码,这些指令可以出现在源代码描述的任何地方。
`ifdef指令检查 text_macro_name的定义。如果定义了 text_macro_name,则包含 `ifdef 指令后面的行。如果未定义 text_macro_name,且存在 `else 指令,则编译`else指令后面的源代码。`ifndef 编译器指令检查 text_macro_name 的定义。如果 text_macro_name 未定义,则包含 `ifndef 指令后面的行。如果 text_macro_name 已定义且存在 `else 指令,则编译`else指令后面的源代码。
如果存在 `elsif 指令(而不是 `else),编译器会检查 text_macro_name 的定义。如果该名称存在,则会包含 `elsif 指令后面的行。`elsif指令等同于编译器指令序列 `else `ifdef ... `endif. 该指令不需要相应的 `endif 指令,在该指令之前应包含 `ifdef 或 `ifndef 指令。
`ifdef、`else、`elsif、`endif 和`ifndef指令可能会在以下情况下发挥作用:
- 选择模块的不同表示形式,如行为级、结构级或开关级
- 选择不同的时序或结构信息
- 为特定仿真运行选择不同的激励
`ifdef、`else、`elsif、`endif 和`ifndef指令的标准语法结构如下:
`ifdef、`else、`elsif、`endif指令以如下方式协同工作:
- 当遇到 `ifdef 时,编译器会测试 `ifdef 文本宏标识符,看它是否被 Verilog HDL 源代码描述中的 `define 定义为文本宏名称。
- 如果定义了 `ifdef 文本宏标识符,则将 `ifdef 行组作为描述的一部分进行编译;如果存在 `else 或 `elsif 编译器指令,则忽略这些编译器指令和相应的行组。
- 如果未定义 `ifdef 文本宏标识符,则忽略 `ifdef 行组。
- 如果有 `elsif 编译器指令,则测试 `elsif 文本宏标识符是否在 Verilog HDL 源代码描述中使用 `define 定义为文本宏名称--如果定义了 `elsif 文本宏标识符,则将 `elsif 行组作为描述的一部分进行编译;如果有其他 `elsif 或 `else 编译器指令,则忽略其他 `elsif 或 `else 指令和相应的行组。
- 如果未定义第一个 `elsif 文本宏标识符,则忽略第一个 `elsif 行组。
- 如果有多个 `elsif 编译器指令,则按照 Verilog HDL 源代码描述中的编写顺序,像第一个 `elsif 编译器指令一样对它们进行评估。
- 如果有 `else 编译器指令,则 `else 行组将作为描述的一部分进行编译。
`ifndef、`else、`elsif、`endif指令以如下方式协同工作:
- 当遇到 `ifndef 时,会测试 `ifndef 文本宏标识符,看它是否在 Verilog HDL 源代码描述中使用 `define 定义为文本宏名称。
- 如果未定义 `ifndef 文本宏标识符,则将 `ifndef 行组作为描述的一部分进行编译;如果存在 `else 或 `elsif 编译器指令,则忽略这些编译器指令和相应的行组。
- 如果定义了 `ifndef 文本宏标识符,则忽略 `ifndef 行组。
- 如果有 `elsif 编译器指令,则测试 `elsif 文本宏标识符是否在 Verilog HDL 源代码描述中使用 `define 定义为文本宏名称。
- 如果定义了 `elsif 文本宏标识符,`elsif 行组将作为描述的一部分进行编译;如果存在其他 `elsif 或 `else 编译器指令,其他 `elsif 或 `else 指令和相应的行组将被忽略。
- 如果未定义第一个 `elsif 文本宏标识符,则忽略第一个 `elsif 行组。
- 如果有多个 `elsif 编译器指令,则按照 Verilog HDL 源代码描述中的编写顺序,像第一个 `elsif 编译器指令一样对它们进行评估。
- 如果有 `else 编译器指令,则 `else 行组将作为描述的一部分进行编译。
下面举例说明条件编译指令的用法:
例 1-下面的示例展示了 `ifdef 指令在条件编译中的简单用法。如果定义了标识符 “behavioral”,将编译一个连续net赋值;否则,将实例化一个与门。
例 2-下面的示例展示了嵌套条件编译指令的用法:
例 3-下面的示例展示了链式嵌套条件编译指令的用法:
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起系统学习verilog最终标准IEEE Std 1364-2005吧!