一般情況下,Verilog HDL源程序中所有的行都參加編譯。但是有時候希望對其中的一部份內容只有在條件滿足的時候才進行編譯,也就是對一部分內容指定編譯的條件,這就是“條件編譯”。有時,希望當滿足條件時對一組語句進行編譯,當條件不滿足時則對另外一組語句進行編譯。
條件編譯命令的幾種形式:
(1)`ifdef宏名(標識符)
程序段1
`else
程序段2
`endif
它的作用是當宏名已經被定義過(此處需要採用`define命令定義),則對程序段1進行編譯,程序段2將被忽略;否則編譯程序段2,程序段1將被忽落。其中`else部分可以沒有,即:
(2)`ifdef宏名(標識符)
程序段1
`endif
這裏的“宏名”是一個Verilog HDL 的標識符,“程序段”可以是Verilog HDL語句組,也可以是命令行。這些命令可以出現在源程序的任何地方。
注意:被忽略掉不進行編譯的程序段部分也要符合Verilog HDL程序的語言規則。
通常在Verilog HDL程序中用到ifdef、
else、`endif編譯命令的情況有以下幾種:
(1)選擇一個模板的不同代表部分。
(2)選擇不同的時許或結構信息。
(3)對不同的EDA工具,選擇不同的激勵。
最常用的情況是:Verilog HDL代碼中的一部分可能適用於某個編譯環境,但不使用於另一個環境,如果設計者不想爲兩個環境創建兩個不同版本的Verilog 設計,還有一種方法就是所謂的條件編譯,即設計者在代碼中指定其中某一部分只有在設置了特定的標誌後,這一段代碼才能被編譯,即設計者在代碼中指定其中某一部分只有在設置了特定的標識後,這一段代碼才能編譯。
設計者也可能希望在程序的運行中,只有當設置了某個標誌後,才能執行Verilog 設計的某些部分,這就是所謂的條件執行。
條件編譯可以用編譯指令ifdef、
else、elsif和
endif實現。
ifdef和
ifndef指令可以出現在設計的任何地方。設計者可以有條件地編譯語句、模塊、語句塊、聲明和其他編譯指令。else指令時可選的。一個
else指令最多可以匹配一個ifdef或者
ifndef。一個ifdef或者
ifndef可以匹配任意數量的elsif命令。
ifdef或ifndef總是用相應的
endif來結束。
Verilog文件中,條件編譯標誌可以用define語句設置。如果沒有設置條件編譯標誌,那麼Verilog編譯器會簡單地跳過該部分。
ifdef語句中不允許使用布爾錶帶式,例如使用TEST && ADD_B2來表示編譯條件是不允許的。