在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SV中define宏定義的用法

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

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

宏定義`define的用法

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

`defineMACRO_NAMEreplaced_text

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

定義常量

`defineDATA_WIDTH 32

條件編譯

`ifdef USE_SNPS_VIP
...
`endif

簡化復雜表達式

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


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

定義宏函數

如果需要定義帶參數的宏函數,使用``來實現變量的整體替換。

`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只是文本替換工具,使用宏來指代信號路徑會導致信號可讀性降低,在調試和維護中容易出錯。但工作中真的很有用。

`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中是全局有效的,作用域從宏被定義的地方開始,一直到文件結束,或者宏被`undef顯示的取消定義為止。比如經常使用宏定義信號位寬就是全局作用。

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

//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之后再調用MY_MACRO就會報錯

`define的使用注意事項

小杜這里列舉幾個會經常遇到的注意事項:

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

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4875

    瀏覽量

    69952
  • 宏定義
    +關注

    關注

    0

    文章

    51

    瀏覽量

    9146
  • define
    +關注

    關注

    0

    文章

    16

    瀏覽量

    3860

原文標題:【SV】宏定義`define的使用場景和注意事項小結

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

收藏 人收藏

    評論

    相關推薦

    C語言typedef與#define用法和區別

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

    C語言中定義的使用技巧

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

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

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

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

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

    define定義多條語句的語法規則有哪些

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

    typedef和define區別

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

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

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

    #define的高級用法簡介

    #define的高級用法
    的頭像 發表于 02-05 11:50 ?4167次閱讀

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

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

    C語言中的typedef的用法

    在以前的學習對于C語言中typedef和define的認識是,#define,作用是簡單的替換,而typedef也是替換,只不過比define
    發表于 01-13 13:36 ?0次下載
    C語言中的typedef的<b class='flag-5'>用法</b>

    C語言中的定義

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

    c語言定義用法規則

    定義會在編譯的時候進行替換展開。最好將的參數用括號括起來。這樣就避免了當一個表達式同時含有定義
    發表于 07-31 09:39 ?1024次閱讀

    c語言帶參數的定義

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

    基于select!的進階用法

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

    define定義

    ,常量表并沒有用define定義的常量,系統不為它分配內存。define定義的常量,預處理時只是直接進行了替換,,它用來將一個標識符
    的頭像 發表于 11-24 15:35 ?1114次閱讀
    主站蜘蛛池模板: 亚洲一区二区在线免费观看 | 久久本道综合色狠狠五月 | 欧美性猛交xxxx免费 | 99九九成人免费视频精品 | 日本不卡视频免费的 | 欧美日韩一区在线观看 | 手机看片精品国产福利盒子 | 午夜精品国产 | 55夜色66夜色国产精品站 | 77788色淫视频免费观看 | 青草久草视频 | www婷婷| 亚洲影视一区二区 | 毛片网站免费 | 国产视频观看 | 成人五级毛片免费播放 | 国产一级αv片免费观看 | 日韩三级小视频 | 久久精品国产福利国产琪琪 | 婷婷亚洲综合五月天小说在线 | 亚洲www在线| 女人张开腿双腿让男人桶 | 久久精品亚洲青青草原 | 婷婷了五月色香综合缴情 | 国产高清在线免费 | 亚洲黄页网站 | 中文字幕第页 | 色婷婷狠狠| 天天射天天射 | 精品女同 | 欧美福利精品 | 99热这里只有精品一区二区三区 | 久久九九亚洲精品 | 大又大又粗又爽女人毛片 | 很黄很暴力 很污秽的小说 很黄很黄叫声床戏免费视频 | 五月激情婷婷网 | 特级一级毛片视频免费观看 | 天天亚洲 | 午夜影院黄色片 | 国产女人18毛片水真多18精品 | 天天插天天操天天射 |