Hi,我是小杜。小杜工作中經(jīng)常看到驗(yàn)證環(huán)境中的宏定義,之前僅有一點(diǎn)了解,最近小杜需要用到宏,于是整理了一下宏的使用場景和注意事項(xiàng)。小杜經(jīng)驗(yàn)尚淺,如有錯誤,還請批評指正。
宏定義`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ù),使用``來實(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推薦的用法,因?yàn)閌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就會報(bào)錯
`define的使用注意事項(xiàng)
小杜這里列舉幾個會經(jīng)常遇到的注意事項(xiàng):
盡量使用大寫字母命名,以便和變量名/函數(shù)名區(qū)分開,并且一定要避免和其他宏出現(xiàn)命名沖突。盡量保持宏定義簡單明了,保持代碼的可讀性和可維護(hù)性,必要時(shí)在宏定義旁添加注釋。
如果使用宏定義簡化表達(dá)式,最好使用括號來確保表達(dá)式求值順序的正確,這是因?yàn)楹暾归_后會直接替換文本,可能會導(dǎo)致變量執(zhí)行順序出錯。
最重要的是避免過度使用宏!!雖然宏使用起來非常方便,但對于較大的驗(yàn)證環(huán)境,這會導(dǎo)致代碼可讀性變差和維護(hù)難度提升。平時(shí)隨手寫個宏,方便了自己,但很可能會讓負(fù)責(zé)環(huán)境維護(hù)的同事付出更多的時(shí)間進(jìn)行維護(hù)。
以上就是小杜對SV中`define宏定義的一些總結(jié),工作中根據(jù)需求使用`define即可。感謝你看到這里。
-
代碼
+關(guān)注
關(guān)注
30文章
4753瀏覽量
68368 -
宏定義
+關(guān)注
關(guān)注
0文章
50瀏覽量
9002 -
define
+關(guān)注
關(guān)注
0文章
15瀏覽量
3737
原文標(biāo)題:【SV】宏定義`define的使用場景和注意事項(xiàng)小結(jié)
文章出處:【微信號:小杜的芯片驗(yàn)證日記,微信公眾號:小杜的芯片驗(yàn)證日記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論