網(wǎng)站要交錢嗎電腦培訓(xùn)學(xué)校哪家好
提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
文章目錄
- 文章前情預(yù)告
- 一、define是個(gè)啥?
- 二、為什么要使用define
- 三、怎么使用define
- 四、define的橫向拓展
- 五、define思想在生活中的體現(xiàn)!
- 六、結(jié)論
- 七、參考資料
- 八、交個(gè)朋友
文章前情預(yù)告
本篇文章介紹define宏定義,之前也學(xué)過,隨著最近有更新的了解,記錄下來想和大家分享,希望能幫助到大家!博客主要是從以下幾個(gè)方面介紹,define是什么,用define宏定義的優(yōu)點(diǎn)是什么,怎么用宏定義,宏定義使用的注意事項(xiàng),宏定義的思想在其他方面的體現(xiàn),宏定義的思想在生活中的聯(lián)系,最后奉上寫這篇博客的參考資料!
一、define是個(gè)啥?
define宏定義無論是在Verilog中還是Systemverilog中經(jīng)常被用到,宏定義的格式是:
`define macro_name(formal_argu_list) macro_text
“‘define”是宏定義的標(biāo)志,通知綜合軟件這是一個(gè)宏定義。請注意有開頭符號“’”。
“macro_name”是宏定義的名稱。
“macro_text”是宏定義被綜合軟件重新替代的內(nèi)容。
“formal_argu_list”是宏定義可能的輸入?yún)?shù),里面可以有多個(gè)輸入。在綜合軟件處理宏時(shí),這些變量可以取代“macro_text”里對應(yīng)的內(nèi)容。當(dāng)不需要參數(shù)時(shí),可以省略這一項(xiàng)。
定義宏語句的最后是沒有分號“;”的,這點(diǎn)我們要特別注意。如果不小心加了分號,那么這個(gè)分號會(huì)被綜合軟件視為“macro_text”的一部分參與替代工作。
二、為什么要使用define
define宏定義的本質(zhì)就是用簡短的字符代替一大段字符,可以起到減少代碼量的作用,使代碼看起來簡潔,可以提高代碼的移植性。
三、怎么使用define
說完什么是define與為什么要有這個(gè)東西,最重要的就是在實(shí)踐中使用,不以應(yīng)用為目的實(shí)踐就是耍流氓!
例子1.define在Verilog中經(jīng)常被用來定義變量的位寬:
`define BIT_WIDTH 8
reg [`BIT_WIDTH-1:0] bit_variable; //reg [7:0] bit_variable
在《SystemVerilog_3.1a》標(biāo)準(zhǔn)中,關(guān)于`define宏的描述如下所示:
例子2.define在Systemverilog中可以實(shí)現(xiàn)參數(shù)的傳遞,成為帶參數(shù)的宏函數(shù):
`define test_inst (A,B,C) \.A``u_inst (A``inst), \.B``u_inst (B``inst), \.C``u_inst (C``inst).....test_inst(a,b,c);等價(jià)于:.au_inst (ainst),.bu_inst (binst),.cu_inst (cinst)
注意事項(xiàng):
1、
define在實(shí)現(xiàn)帶參數(shù)的宏函數(shù)時(shí),一定要加上``這個(gè)符號,綜合軟件只有在識(shí)別到這個(gè)符號時(shí),才會(huì)將參數(shù)進(jìn)行傳遞,這個(gè)符號相當(dāng)于tcl腳本set a;中的set,Perl腳本中的$,只有出現(xiàn)這個(gè)關(guān)鍵符號軟件才會(huì)進(jìn)行變量替換;
2、
為了避免重復(fù)宏定義,可以使用下述方式進(jìn)行定義:
`ifndef data_wdith`define data_width
`endif
3、重要重要重要!
重要的事情說三遍,關(guān)于宏定義的有效范圍,宏定義的有效范圍從宏定義開始,對后續(xù)文件一直有效,直到另一個(gè)宏定義改變這個(gè)宏定義的值,所以這就要求按照一定的順序進(jìn)行文件的編譯,例如:Verilog在module關(guān)鍵字之前一般都是include一些宏定義的文件,如果這些文件在endmodule后去包含,編譯器就會(huì)因?yàn)檎也坏竭@些宏定義的替換內(nèi)容而報(bào)錯(cuò)!
4、
宏定義本質(zhì)上就是替換,編譯不會(huì)對這個(gè)宏名稱,做語法檢查,只有當(dāng)被替換的內(nèi)容出錯(cuò)時(shí),編譯才會(huì)報(bào)錯(cuò),所以在調(diào)用宏定義之前一定要告訴編譯器宏定義的內(nèi)容去哪里尋找,Verilog是通過include、incdir這個(gè)關(guān)鍵字去尋找,C語言調(diào)用子函數(shù)通過跳轉(zhuǎn)地址,跳轉(zhuǎn)到實(shí)際的子函數(shù)中去執(zhí)行,一句話:如果替換,就得告訴編譯器去哪里找!
四、define的橫向拓展
define宏定義的本質(zhì)就是替換,這種替換就是用更少的信息表示更多的信息,與之原理相同的還包括Systemverilog的interface,C語言的子函數(shù);
五、define思想在生活中的體現(xiàn)!
有句話怎么講的,”藝術(shù)來源于生活“,技術(shù)與生活也息息相關(guān),define的思想個(gè)人感覺在生活中處處可見,比如你去買了蘋果,你媽問你買的啥,你回答買的水果,你爸買的西瓜,你媽問你買的啥,你爸回答水果,都是一樣的,好比水果這個(gè)宏定義在你那里被定義成了蘋果,在你爸那里被定義成了西瓜,宏定義的名稱不重要,重要的是定義的內(nèi)容,一千個(gè)人眼里有一千個(gè)哈姆雷特,一千個(gè)人眼里有一千個(gè)宏定義內(nèi)容!
六、結(jié)論
前面強(qiáng)調(diào)的按一定順序編譯的問題,Makefile可以實(shí)現(xiàn)確保編譯的順序問題,關(guān)于Makefile的描寫下一篇文章見!
七、參考資料
參考資料1 :verilog 宏之define
參考資料2:Systemverilog 宏定義 define
八、交個(gè)朋友
博主寫文章有很多不足之處,歡迎各位大佬多多評論留言批評指正!在博文中放置大量圖片是因?yàn)樗伎伎炫c慢中介紹了一個(gè)啟動(dòng)效應(yīng),希望大家在看到這些知識(shí)的時(shí)候還可以擁有樂趣,擁有視覺的沖擊,也希望這個(gè)文章能夠真正幫助到大家!