0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemVerilog中ifndef如何避免重复编译

sanyue7758 来源:硅芯思见 2023-06-25 15:59 次阅读

`ifndef是SystemVerilog/Verilog中的一种条件编译命令,可以认为其是"if not defined"的缩写,其用法与`ifdef相反,他们主要用来根据其后的宏是否存在于当前编译空间从而进行分支选择,因此在实际的工作过程中,常用来进行"guardagaintcompile"等操作,本文将利用其分支选择的特点介绍`ifndef(`ifdef与其功能类似,不再示例)几种常见用法。

1 避免重复编译

【示例】

e3a434ea-132d-11ee-962d-dac502259ad0.png

仿真结果】

e3b486c4-132d-11ee-962d-dac502259ad0.png

示例中,在top_tb.sv中include了packet.sv,同时在filelist中包含了packet.sv和top_tb.sv,这样在对filelist进行编译时相当于需要对packet.sv连续编译两次,此时编译到被include的packet.sv报错。这主要是因为同一个文件在编译时被编译了多次,一般情况下多数仿真工具为此都会给出不同类型的提示信息。对于较小的设计重复文件编译一般基本没有影响,但是对于大型设计,这种重复编译会增加编译工作的工作量,影响编译效率,为此一般对于多次共享的一些公共资源都会使用如下示例的方式,避免多次编译影响编译效率。

【示例】

e3caf3a0-132d-11ee-962d-dac502259ad0.png

示例中,在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被执行代码的选择

【示例】

e3dee0ae-132d-11ee-962d-dac502259ad0.png

示例中,如果编译空间中不存在DISP的宏定义,那么将会执行示例中第4行,如果编译的空间中存在DISP的宏定义,那么将会执行示例中的第6行,即通过"`ifndef ... `endif"实现了根据不同的DISP执行不同的代码段。当然这里之所以可以选择其他分支是因为有"`else"的存在,如果存在多余两个你还可以使用"`ifndef ...`elsif ... `else ... `endif"或者多个"`ifndef ... `endif"嵌套,结构类似于if结构写法,可以根据需要灵活选用。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1345

    浏览量

    109991
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36887
  • 命令
    +关注

    关注

    5

    文章

    678

    浏览量

    21987
  • 编译
    +关注

    关注

    0

    文章

    654

    浏览量

    32812

原文标题:SystemVerilog中ifndef如何避免重复编译

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SystemVerilog的类构造函数new

    systemverilog,如果一个类没有显式地声明构造函数(new()),那么编译仿真工具会自动提供一个隐式的new()函数。这个new函数会默认地将所有属性变量。
    发表于 11-16 09:58 3584次阅读

    SystemVerilog的Virtual Methods

    SystemVerilog多态能够工作的前提是父类的方法被声明为virtual的。
    发表于 11-28 11:12 683次阅读

    SystemVerilog的“const”类属性

    SystemVerilog可以将类属性声明为常量,即“只读”。目的就是希望,别人可以读但是不能修改它的值。
    发表于 11-29 10:25 2100次阅读

    SystemVerilog的联合(union)介绍

    SystemVerilog ,联合只是信号,可通过不同名称和纵横比来加以引用。
    的头像 发表于 10-08 15:45 1336次阅读
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的联合(union)介绍

    请问如何理解头文件的#ifndef

    。 2 用法 #ifndef 字符串 #define 上述字符串 #endif 一般放在头文件里面,作用就是以防你在.c文件里面不小心重复包含头文件的时候不会报错。 例如,现在你有 main.c
    发表于 07-06 03:34

    使用SystemVerilog来简化FPGA接口的连接方式

    Xilinx推荐使用纯bd文件的方式来设计FPGA,这样HDL代码就会少了很多。但我们大多数的工程还是无法避免使用HDL来连接两个module。所以本文就推荐使用SystemVerilog来简化
    发表于 01-08 17:23

    STM32头文件的#ifndef

    /*sys.h今天我们来讲讲这个头文件*/#ifndef __SYS_H//头件的的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而
    发表于 08-23 08:06

    把头文件的内容放在#ifndef还是#endif

    #ifndef __SYS_H//头件的的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同
    发表于 08-23 07:38

    stm32f429之#ifndef的用法 精选资料推荐

    作用:防止头文件的重复包含和编译 定义  #ifndef x  #define x  ...  #endif  这是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等
    发表于 08-24 07:38

    讲讲这个头文件/#ifndef __SYS_H //头件的的#ifndef

    1.推挽输出 适合做一些开关控制,应为推挽输出可以快速的切换0和1,例如继电器,led等2./sys.h今天我们来讲讲这个头文件/#ifndef __SYS_H//头件的的#ifndef,这是一个
    发表于 08-24 08:03

    SystemVerilog编码层面提速的若干策略SoC芯片简析

    比较快:对于简单调用,编译器可以将函数/任务内联以避免堆栈帧操作,但复杂调用因为编译器性能考虑原因通常不会内联,每个函数/任务都将数据引用或完整的数据副本推送到调用堆栈,并处理任何指定的返回。如此就会
    发表于 08-01 15:13

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同数据类型的集合。
    的头像 发表于 11-07 10:18 2395次阅读

    SystemVerilog的Shallow Copy

    SystemVerilog的句柄赋值和对象复制的概念是有区别的。
    的头像 发表于 11-21 10:32 874次阅读

    SystemVerilog的Semaphores

    SystemVerilogSemaphore(旗语)是一个多个进程之间同步的机制之一,这里需要同步的原因是这多个进程共享某些资源。
    的头像 发表于 12-12 09:50 3307次阅读

    Systemverilog的Driving Strength讲解

    systemverilog,net用于对电路连线进行建模,driving strength(驱动强度)可以让net变量值的建模更加精确。
    的头像 发表于 06-14 15:50 1514次阅读
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength讲解