編譯預處理語句
編譯預處理是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極客空間 微信公眾號