Hi,我是小杜。小杜工作中經(jīng)常看到驗(yàn)證環(huán)境中的宏定義,之前僅有一點(diǎn)了解,最近小杜需要用到宏,于是整理了一下宏的使用場(chǎng)景和注意事項(xiàng)。小杜經(jīng)驗(yàn)尚淺,如有錯(cuò)誤,還請(qǐng)批評(píng)指正。
宏定義`define的用法
SV中使用預(yù)處理指令`define來(lái)定義宏,宏可以用來(lái)創(chuàng)建文本替換。根據(jù)場(chǎng)景不同,`define主要用來(lái)定義常量、簡(jiǎn)化復(fù)雜的表達(dá)式或代碼段以及提高代碼的可移植性。其基本語(yǔ)法為:
`defineMACRO_NAMEreplaced_text
下面是小杜對(duì)一些使用場(chǎng)景的簡(jiǎn)單舉例:
定義常量
`defineDATA_WIDTH 32
條件編譯
`ifdef USE_SNPS_VIP ... `endif
簡(jiǎn)化復(fù)雜表達(dá)式
`defineIS_EVEN(x)((x)%2==0) initial begin num = 10; if(`IS_EVEN(num)) ... end
定義宏函數(shù)
如果需要定義帶參數(shù)的宏函數(shù),使用``來(lái)實(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
定義信號(hào)路徑
相較于上面,這是一種常用但并非spec推薦的用法,因?yàn)閌define只是文本替換工具,使用宏來(lái)指代信號(hào)路徑會(huì)導(dǎo)致信號(hào)可讀性降低,在調(diào)試和維護(hù)中容易出錯(cuò)。但工作中真的很有用。
`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 定義的信號(hào)路徑 $display("Inner Data: %h", `INNER_DATA); end endmodule
`define的作用域
`define定義的宏在SV中是全局有效的,作用域從宏被定義的地方開(kāi)始,一直到文件結(jié)束,或者宏被`undef顯示的取消定義為止。比如經(jīng)常使用宏定義信號(hào)位寬就是全局作用。
如果在被包含的文件中定義了一個(gè)宏,該宏對(duì)包含該文件的主文件以及該文件之后的所有內(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顯示取消宏定義來(lái)控制宏的作用范圍。
`defineMY_MACRO 32 ... `undefMY_MACRO //在`undef之后再調(diào)用MY_MACRO就會(huì)報(bào)錯(cuò)
`define的使用注意事項(xiàng)
小杜這里列舉幾個(gè)會(huì)經(jīng)常遇到的注意事項(xiàng):
盡量使用大寫(xiě)字母命名,以便和變量名/函數(shù)名區(qū)分開(kāi),并且一定要避免和其他宏出現(xiàn)命名沖突。盡量保持宏定義簡(jiǎn)單明了,保持代碼的可讀性和可維護(hù)性,必要時(shí)在宏定義旁添加注釋。
如果使用宏定義簡(jiǎn)化表達(dá)式,最好使用括號(hào)來(lái)確保表達(dá)式求值順序的正確,這是因?yàn)楹暾归_(kāi)后會(huì)直接替換文本,可能會(huì)導(dǎo)致變量執(zhí)行順序出錯(cuò)。
最重要的是避免過(guò)度使用宏?。‰m然宏使用起來(lái)非常方便,但對(duì)于較大的驗(yàn)證環(huán)境,這會(huì)導(dǎo)致代碼可讀性變差和維護(hù)難度提升。平時(shí)隨手寫(xiě)個(gè)宏,方便了自己,但很可能會(huì)讓負(fù)責(zé)環(huán)境維護(hù)的同事付出更多的時(shí)間進(jìn)行維護(hù)。
以上就是小杜對(duì)SV中`define宏定義的一些總結(jié),工作中根據(jù)需求使用`define即可。感謝你看到這里。
-
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70733 -
宏定義
+關(guān)注
關(guān)注
0文章
51瀏覽量
9231 -
define
+關(guān)注
關(guān)注
0文章
16瀏覽量
3935
原文標(biāo)題:【SV】宏定義`define的使用場(chǎng)景和注意事項(xiàng)小結(jié)
文章出處:【微信號(hào):小杜的芯片驗(yàn)證日記,微信公眾號(hào):小杜的芯片驗(yàn)證日記】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
C語(yǔ)言typedef與#define的用法和區(qū)別
C語(yǔ)言中宏定義的使用技巧

C語(yǔ)言宏定義中#和##的作用
請(qǐng)問(wèn)宏定義中的##有什么用途?
define宏定義多條語(yǔ)句的語(yǔ)法規(guī)則有哪些
typedef和define區(qū)別

C語(yǔ)言中#define的一些用法介紹概述
C語(yǔ)言基礎(chǔ):宏定義使用do{}while(0)的好處

C語(yǔ)言中的typedef的用法

C語(yǔ)言中的宏定義

評(píng)論