条件编译在针对不同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电路如下:

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

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

本文详细介绍了Verilog中的条件编译命令`ifdef、`else、`endif,包括它们的概念、用途、用法,并通过具体的仿真案例,验证了这些条件编译指令在选择不同代码段、适配不同EDA工具时的有效性。
1745

被折叠的 条评论
为什么被折叠?



