`ifndef是SystemVerilog/Verilog中的一種條件編譯命令,可以認(rèn)為其是"if not defined"的縮寫,其用法與`ifdef相反,他們主要用來根據(jù)其后的宏是否存在于當(dāng)前編譯空間從而進(jìn)行分支選擇,因此在實際的工作過程中,常用來進(jìn)行"guardagaintcompile"等操作,本文將利用其分支選擇的特點(diǎn)介紹`ifndef(`ifdef與其功能類似,不再示例)幾種常見用法。
1 避免重復(fù)編譯
【示例】
【仿真結(jié)果】
示例中,在top_tb.sv中include了packet.sv,同時在filelist中包含了packet.sv和top_tb.sv,這樣在對filelist進(jìn)行編譯時相當(dāng)于需要對packet.sv連續(xù)編譯兩次,此時編譯到被include的packet.sv報錯。這主要是因為同一個文件在編譯時被編譯了多次,一般情況下多數(shù)仿真工具為此都會給出不同類型的提示信息。對于較小的設(shè)計重復(fù)文件編譯一般基本沒有影響,但是對于大型設(shè)計,這種重復(fù)編譯會增加編譯工作的工作量,影響編譯效率,為此一般對于多次共享的一些公共資源都會使用如下示例的方式,避免多次編譯影響編譯效率。
【示例】
示例中,在packet.sv中使用了條件編譯結(jié)構(gòu)"`ifndef PACKET_SV ... `endif"。當(dāng)packet.sv第一次編譯時,因為編譯空間中還沒由PACKET_SV這個宏定義,所以此時會執(zhí)行其后的"`define PACKET_SV",當(dāng)執(zhí)行到top_tb.sv中的"`include "packet.sv""時,因為此時宏P(guān)ACKET_SV已經(jīng)存在于當(dāng)前全局編譯空間中,所以此時"`include "packet.sv""中的packet.sv不會被重復(fù)編譯,從而可以避免同樣代碼的重復(fù)編譯。
2被執(zhí)行代碼的選擇
【示例】
示例中,如果編譯空間中不存在DISP的宏定義,那么將會執(zhí)行示例中第4行,如果編譯的空間中存在DISP的宏定義,那么將會執(zhí)行示例中的第6行,即通過"`ifndef ... `endif"實現(xiàn)了根據(jù)不同的DISP執(zhí)行不同的代碼段。當(dāng)然這里之所以可以選擇其他分支是因為有"`else"的存在,如果存在多余兩個你還可以使用"`ifndef ...`elsif ... `else ... `endif"或者多個"`ifndef ... `endif"嵌套,結(jié)構(gòu)類似于if結(jié)構(gòu)寫法,可以根據(jù)需要靈活選用。
審核編輯:湯梓紅
-
Verilog
+關(guān)注
關(guān)注
28文章
1355瀏覽量
110864 -
System
+關(guān)注
關(guān)注
0文章
165瀏覽量
37230 -
命令
+關(guān)注
關(guān)注
5文章
706瀏覽量
22241 -
編譯
+關(guān)注
關(guān)注
0文章
668瀏覽量
33216
原文標(biāo)題:SystemVerilog中ifndef如何避免重復(fù)編譯
文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
SystemVerilog中的類構(gòu)造函數(shù)new
SystemVerilog中的Virtual Methods
SystemVerilog中的“const”類屬性
請問如何理解頭文件中的#ifndef?
使用SystemVerilog來簡化FPGA中接口的連接方式
STM32頭文件中的#ifndef
把頭文件的內(nèi)容放在#ifndef還是#endif中
stm32f429之#ifndef的用法 精選資料推薦
講講這個頭文件/#ifndef __SYS_H //頭件的中的#ifndef
SystemVerilog編碼層面提速的若干策略SoC芯片簡析
SystemVerilog中的Semaphores
Systemverilog中的Driving Strength講解

評論