VerilogHDL編譯預處理


編譯預處理語句

編譯預處理是VerilogHDL編譯系統的一個組成部分,指編譯系統會對一些特殊命令進行預處理,然后將預處理結果和源程序一起在進行通常的編譯處理。以”`” (反引號)開始的某些標識符是編譯預處理語句。在Verilog HDL語言編譯時,特定的編譯指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其他不同的編譯程序指令。常用的編譯預處理語句如下:

(1)`define,`undef

(2)`include

(3)`timescale

(4)`ifdef,`else.`endif

(5)`default_nettype;

(6)`resetall

(7)`unconnect_drive,`nounconnected-drive;

(8)`celldefine,`endcelldefine


宏定義

`define指令是一個宏定義命令,通過一個指定的標識符來代表一個字符串,可以增加Veirlog HDL代碼的可讀性和可維護性,找出參數或函數不正確或不允許的地方。

`define指令類似C語言中的#define指令,可以在模塊的內部或外部定義,編譯器在編譯過程中遇到該語句將把宏文本替換為宏的名字。`define的聲明語法格式如下: `define,<macro_name><Text>

對於已聲明的語句,在代碼中的應用格式如下(不要漏掉宏前面的”`”):

`macro-name

例如:define  MAX-BUS-SIZE  32

...

Reg[`MAX-BUS-SIZE-1:0]AddReg;

一旦`define指令被編譯,其在整個編譯過程中都有效。例如,通過另一個文件中的`define指令,MAX-BUS-SIZE能被多個文件使用。

`undef指令用於取消前面定義的宏。例如:

`undef  WORD16

...

Wire [`WORD:1]Bus;

...

`undef  WORD

宏定義指令的注意事項:

(1)    宏定義的名稱可以是大寫,也可以是小寫,但要注意不要和變量名重復。

(2)    和所有編譯器偽指令一樣,宏定義在超過單個文件邊界時仍有效(對工程的其他源文件),除非被后面的`define、`undef或`resetall偽指令覆蓋,否則`define不收范圍限制。

(3)    當用變量定義宏時,變量可以在宏正文中使用,並且在使用宏的時候可以用實際的變量表達式代替。

(4)    通過用反斜杠”\”轉義中間換行符,宏定義可以跨越幾行,新的行是宏正文的一部分。

(5)    宏定義行末不需要添加分號表示結束。

(6)    宏正文不能分離的語言記號包括注釋、數字、字符串、保留的關鍵字、運算符。

(7)    編譯器偽指令不允許作為宏的名字。

(8)    宏定義中的文本也可以是一個表達式,並不僅僅用於變量名稱的替換。


define和parameter

`define和parameter是有區別的。`define和parameter都可以用於完成文本替換,但其存在本質上的不同,前者是編譯之前就預處理,而后者是在正常編譯過程中完成替換的。此外,`define和parameter存在下列兩點不同之處:
    (1)作用域不同。Parameter作用於聲明的那個文件;`define從編譯器讀到這條指令開始到編譯結束都有效,除非遇到`undef命令使之失效,可以應用於整個工程。如果要讓parameter作用於整個項目,可以將聲明語句寫於單獨文件中,並用)`include讓每個文件都包含聲明文件。

`define可以寫在代碼的任何位置,而Parameter則必須在應用之前定義。通常編譯器都可以定義編譯順序,或者從最底層模塊開始編譯,因此寫在最底層就可以了。
    (2)傳遞功能不同。Parameter可以用作模塊例化時的參數傳遞,實現參數化調用;`define語句則沒有此作用。`define語句可以定義表達式,而Parameter只能定義變量。


 版權所有權歸卿萃科技 杭州FPGA事業部,轉載請注明出處  

 作者:杭州卿萃科技ALIFPGA 

 原文地址:杭州卿萃科技FPGA極客空間 微信公眾號


  

    


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM