0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SV中define宏定義的用法

小杜的芯片驗證日記 ? 來源:數(shù)字芯片驗證日記 ? 2024-10-21 14:22 ? 次閱讀

Hi,我是小杜。小杜工作中經(jīng)常看到驗證環(huán)境中的宏定義,之前僅有一點了解,最近小杜需要用到宏,于是整理了一下宏的使用場景和注意事項。小杜經(jīng)驗尚淺,如有錯誤,還請批評指正。

宏定義`define的用法

SV中使用預(yù)處理指令`define來定義宏,宏可以用來創(chuàng)建文本替換。根據(jù)場景不同,`define主要用來定義常量、簡化復(fù)雜的表達(dá)式或代碼段以及提高代碼的可移植性。其基本語法為:

`defineMACRO_NAMEreplaced_text

下面是小杜對一些使用場景的簡單舉例:

定義常量

`defineDATA_WIDTH 32

條件編譯

`ifdef USE_SNPS_VIP
...
`endif

簡化復(fù)雜表達(dá)式

`defineIS_EVEN(x)((x)%2==0)


initial begin
  num = 10;
if(`IS_EVEN(num))
  ...
end

定義宏函數(shù)

如果需要定義帶參數(shù)的宏函數(shù),使用``來實現(xiàn)變量的整體替換。

`definePRINT_MAX(a, b) 
if((a)> (b)) 
$display("Maxvalue:%0b",a);
  else  
$display("Max value: %0d", b);

initial begin
x = 10;
y= 20;
`PRINT_MAX(x,y);
end
`defineTEST_PARAM(X)'"test_``x``param`"
$display(`TEST_PARAM(a));
//打印:test_a_param

定義信號路徑

相較于上面,這是一種常用但并非spec推薦的用法,因為`define只是文本替換工具,使用宏來指代信號路徑會導(dǎo)致信號可讀性降低,在調(diào)試和維護(hù)中容易出錯。但工作中真的很有用。

`define INNER_DATA u_submodule2.u_submodule1.inner_data


module submodule1;
    reg [31:0] inner_data;


    initial begin
        inner_data = 32'hDEADBEEF;
    end
endmodule


module submodule2;
    submodule1 u_submodule1();
endmodule


module top;
    submodule2 u_submodule2();


    initial begin
        // 使用 `define 定義的信號路徑
        $display("Inner Data: %h", `INNER_DATA);
    end
endmodule

`define的作用域

`define定義的宏在SV中是全局有效的,作用域從宏被定義的地方開始,一直到文件結(jié)束,或者宏被`undef顯示的取消定義為止。比如經(jīng)常使用宏定義信號位寬就是全局作用。

如果在被包含的文件中定義了一個宏,該宏對包含該文件的主文件以及該文件之后的所有內(nèi)容有效。

//test.sv
`defineTEST_NUM 100


//main.sv
`include "test.sv"


module to;
  initial begin
$display("TEST_NUM:%0d", `TEST_NUM);
//將打印 TEST_NUM: 100
  end
endmodule

使用`undef顯示取消宏定義來控制宏的作用范圍。

`defineMY_MACRO 32
...
`undefMY_MACRO
//在`undef之后再調(diào)用MY_MACRO就會報錯

`define的使用注意事項

小杜這里列舉幾個會經(jīng)常遇到的注意事項:

盡量使用大寫字母命名,以便和變量名/函數(shù)名區(qū)分開,并且一定要避免和其他宏出現(xiàn)命名沖突。盡量保持宏定義簡單明了,保持代碼的可讀性和可維護(hù)性,必要時在宏定義旁添加注釋。

如果使用宏定義簡化表達(dá)式,最好使用括號來確保表達(dá)式求值順序的正確,這是因為宏展開后會直接替換文本,可能會導(dǎo)致變量執(zhí)行順序出錯。

最重要的是避免過度使用宏??!雖然宏使用起來非常方便,但對于較大的驗證環(huán)境,這會導(dǎo)致代碼可讀性變差和維護(hù)難度提升。平時隨手寫個宏,方便了自己,但很可能會讓負(fù)責(zé)環(huán)境維護(hù)的同事付出更多的時間進(jìn)行維護(hù)。

以上就是小杜對SV中`define宏定義的一些總結(jié),工作中根據(jù)需求使用`define即可。感謝你看到這里。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4719

    瀏覽量

    68209
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    8995
  • define
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    3726

原文標(biāo)題:【SV】宏定義`define的使用場景和注意事項小結(jié)

文章出處:【微信號:小杜的芯片驗證日記,微信公眾號:小杜的芯片驗證日記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言typedef與#define用法和區(qū)別

    在C語言編程,typedef 和 #define是最常用語句,可能很多工作過幾年的工程師都沒有去深究過它們的一些用法和區(qū)別。
    發(fā)表于 10-12 10:39 ?653次閱讀

    C語言中定義的使用技巧

    #define命令是C語言中的一個定義命令,它用來將一個標(biāo)識符定義為一個字符串,該標(biāo)識符被稱為名,被
    發(fā)表于 09-05 10:12 ?973次閱讀
    C語言中<b class='flag-5'>宏</b><b class='flag-5'>定義</b>的使用技巧

    Verilogparameter和define的區(qū)別

    推薦使用`define 定義的方式,因為'define 定義在編譯時自動替換整個設(shè)計中所
    發(fā)表于 04-25 14:32

    C語言定義#和##的作用

    : helloworld , 就可以通過這樣的的調(diào)用, printf( str(helloworld) );2. ## : 在定義,將其前后的兩個變量拼接在一起。eg: #define
    發(fā)表于 08-23 18:22

    請問定義的##有什么用途?

    );第一句的osThreadDef是個定義:#define osThreadDef(name, thread, priority, instances, stacksz)\cons
    發(fā)表于 03-29 07:49

    define定義多條語句的語法規(guī)則有哪些

    在單片機(jī)編程過程,有時候需要反復(fù)操作多條同相語句,這時候運用#define定義多條語句可以大大簡化編程內(nèi)容。語法規(guī)則如下:1.
    發(fā)表于 07-15 08:39

    typedef和define區(qū)別

    typedef是在計算機(jī)編程語言中用來為復(fù)雜的聲明定義簡單的別名,與定義有些差異。它本身是一種存儲類的關(guān)鍵字define,無參
    發(fā)表于 11-09 14:22 ?6880次閱讀
    typedef和<b class='flag-5'>define</b>區(qū)別

    C語言中#define的一些用法介紹概述

    今天整理了一些#define用法,與大家共享!1.簡單的define定義#define MAXTIME 1
    的頭像 發(fā)表于 04-14 11:29 ?7328次閱讀

    #define的高級用法簡介

    #define的高級用法
    的頭像 發(fā)表于 02-05 11:50 ?3840次閱讀

    C語言基礎(chǔ):定義使用do{}while(0)的好處

    C語言定義使用do{}while(0)的好處1. 概述 經(jīng)常寫項目代碼,有時需要用到定義,而定義
    發(fā)表于 01-13 13:06 ?2次下載
    C語言基礎(chǔ):<b class='flag-5'>宏</b><b class='flag-5'>定義</b>使用do{}while(0)的好處

    C語言中的定義

    #define命令是C語言中的一個定義命令,它用來將一個標(biāo)識符定義為一個字符串,該標(biāo)識符被稱為名,被
    的頭像 發(fā)表于 09-28 16:05 ?3376次閱讀
    C語言中的<b class='flag-5'>宏</b><b class='flag-5'>定義</b>

    c語言定義用法規(guī)則

    定義會在編譯的時候進(jìn)行替換展開。最好將的參數(shù)用括號括起來。這樣就避免了當(dāng)一個表達(dá)式同時含有定義
    發(fā)表于 07-31 09:39 ?806次閱讀

    c語言帶參數(shù)的定義

    定義 2. 帶參數(shù)的定義 3. 帶可變參數(shù)的定義 本文將重點探討帶參數(shù)的
    的頭像 發(fā)表于 09-04 17:45 ?2324次閱讀

    基于select!的進(jìn)階用法

    ,它可以讓我們同時監(jiān)聽多個異步事件,一旦其中一個事件觸發(fā),就可以立即執(zhí)行相應(yīng)的代碼。在本教程,我們將詳細(xì)介紹 select!的進(jìn)階用法,并提供多個示例來幫助您更好地理解和掌握這個
    的頭像 發(fā)表于 09-19 15:35 ?574次閱讀

    define定義

    ,常量表并沒有用define定義的常量,系統(tǒng)不為它分配內(nèi)存。define定義的常量,預(yù)處理時只是直接進(jìn)行了替換,,它用來將一個標(biāo)識符
    的頭像 發(fā)表于 11-24 15:35 ?761次閱讀