SystemVerilog中ifndef如何避免重复编译

`ifndef是systemverilog/verilog中的一种条件编译命令,可以认为其是if not defined的缩写,其用法与`ifdef相反,他们主要用来根据其后的宏是否存在于当前编译空间从而进行分支选择,因此在实际的工作过程中,常用来进行guard againt compile等操作,本文将利用其分支选择的特点介绍`ifndef(`ifdef与其功能类似,不再示例)几种常见用法。
1 避免重复编译
【示例】
【仿真结果】
示例中,在top_tb.sv中include了packet.sv,同时在filelist中包含了packet.sv和top_tb.sv,这样在对filelist进行编译时相当于需要对packet.sv连续编译两次,此时编译到被include的packet.sv报错。这主要是因为同一个文件在编译时被编译了多次,一般情况下多数仿真工具为此都会给出不同类型的提示信息。对于较小的设计重复文件编译一般基本没有影响,但是对于大型设计,这种重复编译会增加编译工作的工作量,影响编译效率,为此一般对于多次共享的一些公共资源都会使用如下示例的方式,避免多次编译影响编译效率。
【示例】
示例中,在packet.sv中使用了条件编译结构`ifndef packet_sv ... `endif。当packet.sv第一次编译时,因为编译空间中还没由packet_sv这个宏定义,所以此时会执行其后的`define packet_sv,当执行到top_tb.sv中的`include packet.sv时,因为此时宏packet_sv已经存在于当前全局编译空间中,所以此时`include packet.sv中的packet.sv不会被重复编译,从而可以避免同样代码的重复编译。
2 被执行代码的选择
【示例】
示例中,如果编译空间中不存在disp的宏定义,那么将会执行示例中第4行,如果编译的空间中存在disp的宏定义,那么将会执行示例中的第6行,即通过`ifndef ... `endif实现了根据不同的disp执行不同的代码段。当然这里之所以可以选择其他分支是因为有`else的存在,如果存在多余两个你还可以使用`ifndef ...`elsif ... `else ... `endif或者多个`ifndef ... `endif嵌套,结构类似于if结构写法,可以根据需要灵活选用。


轴承座损坏的修复方法与保养维护
互联网人认为2018年最重要的五大开源工具你都会吗?
朗骏智能JL-126接线式热动光控器系列产品通过美国UL认证
基于SC28L198的多串口服务器设计
工业机器人的构成、分类、工作原理
SystemVerilog中ifndef如何避免重复编译
讯维分布式KVM坐席管理系统在指挥中心中的应用前景
施耐德: “零距离”体验智能制造,EcoStruxure让数字化进程加速
谷歌Nexus Q拆解曝光震撼缺陷:令人失望的贵价货?!
畅销旗舰华为P10 再获EISA最佳拍照智能手机大奖
太阳能杀虫灯有什么优点
爱立信创新与愿景报告解读全息通信技术
传感器在AI时代会如何
深圳宝能进驻通讯行业
苹果已经收购了一家专注于制造AR眼镜镜片的初创公司Akonia Holographics
LONWORKS现场总线技术与RS485总线技术的优劣
基于边缘计算的智能工厂能耗优化解决方案
一加手机3T:公认的国产手机中拍照的标杆
什么是OpenDaylight的Maven
英语学习要从小开始,讯飞智能学习机做孩子的好“老师”