Verilog中条件编译命令`ifdef、`else、`endif详解(用途、用法、仿真)

条件编译在针对不同EDA工具,选择不同激励、根据选择才执行一些功能等场合非常有用,本文对常见条件编译指令进行介绍:介绍了条件编译指令的用途、具体用法,并在此基础上进行必要仿真,验证了分析的正确性;

目录

一、概念与用途

条件编译:

用途:

二、用法

三、仿真

四、参考文献


一、概念与用途

条件编译:

显而易见,即只有在条件满足的时候才对这部分代码进行编译,也就是对一部分内容指定了编译的条件:

                  当满足条件时对一组语句进行编译,

                  当条件不满足时则对另外一组语句进行编译。

用途:

1、选择一个模板的不同代表部分。

2、选择不同的时序或结构信息。

3、对不同的EDA工具,选择不同的激励。(如:Verilog代码中的一部分可能因编译环境不同而不同,为避免在不同环境需要替换不同版本的Verilog 设计,条件编译就是一个很好的解决方案)

二、用法

'ifdef 宏名(标识符)
    程序段1...
'else
    程序段2...
'endif

当宏名被定义过了,就编译程序段1;反之,当宏名未被定义过,就编译程序段2;

其中,else部分可以省略。即:当宏名被定义过了,就编译程序段1;反之,不编译程序段1;

额外的,还有‘ifndef语句,与’ifdef功能相反:

即当宏名没被定义过,就编译程序段1;反之,当宏名未被定义过了,就编译程序段2;

'ifndef 宏名(标识符)
    程序段1...
'else
    程序段2...
'endif

三、仿真

为验证对条件编译的理解,以一个简单的可控与/或逻辑处理电路为例,验证条件编译语法:

实现代码:

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: CLL guoliang
// 
// Create Date: 2020/03/21 10:54:03
// Design Name: 
// Module Name: c_logic
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////

module c_logic(
    input [3:0]din1,
    input [3:0]din2,
    output reg[3:0]dout
    );
`define OR 1'b1
`ifdef OR
    always@(*)
        dout = din1 & din2;
`else
    always@(*)
        dout = din1 | din2;
`endif
endmodule

编译结果(RTL电路):

第一次编译,宏定义为与逻辑,对应RTL电路如下:

Verilog中条件编译命令`ifdef、`else、`endif详解(用途、用法、仿真)_第1张图片

第二次编译,不再进行宏定义(或者宏定义或逻辑),对应RTL电路如下: 

Verilog中条件编译命令`ifdef、`else、`endif详解(用途、用法、仿真)_第2张图片

可以看出,实际编译结果与代码中条件编译指令的设置一致,表明之前分析中对条件编译指令的理解与介绍正确;

四、参考文献

FPGA基础知识23(Verilog中条件编译命令_`ifdef、`else、`endif_用法)

Verilog中的条件编译语句 `ifdef、`else、`endif 等

你可能感兴趣的:(FPGA/Verilog基础)