h
Verilog HDL語言和C語言一樣也提供編譯預處理的功能。在Verilog中為了和一般的語句相區別,這些預處理語句以符號"`"開頭,注意,這個字符位於主鍵盤的左上角,其對應的上鍵盤字符為"~",這個符號並不是單引號"'".這里簡單介紹最常用的`define `include `timescale.
1)宏定義`define
用一個指定的標識符(名字)來代表一個字符串,其的一般形式為: `define 標識符(宏名) 字符串(宏內容) 如:`define SIGNAL string
其作用是在后面程序中用SIGNAL替代所有的string字符串,在編譯預處理時,將程序中該命令后面所有的SIGNAL替換為string。這種替代過程稱作宏展開。
說明:
a)宏名可以是大寫字母,也可以是小寫字母。一般用大寫字母,防止與后面的變量名重復。
b)`define可以出現在模塊定義里面,也可以出現在外邊。其有效范圍是從該命令行開始至源文件結束。
c)在引用已定義的宏名時,必須在宏名的前面加上符號`,表示該名字是一個經過宏定義的名字。
d)宏定義是用宏名代替一個字符串,只做簡單替換不檢查語法。
e)宏定義不是Verilog HDL語句,不必在后面加分號。
f)在進行宏定義時,可以引用已經定義的宏名,可以層層替換。
g)宏名和宏內容必須在同一行進行聲明。如果在宏內容中包含有注釋行,注釋行不會作為被置換的內容。
注意:組成宏內容的字符串不能夠被以下的語句記號分隔開。注釋行+數字+字符串+確認符+關鍵詞+雙目或三目運算符
如下面的宏定義聲明和引用就是非法的:
`define first_half "start of string
$display(`first_half end of string")
2)文件包含處理`include
所謂文件包含是指處理一個源文件可以將另一個源文件的全部內容包含進來,即將另外文件包含到本文件之中。一般格式為: `include"文件名"
在執行命令時,將被包含文件的全部內容復制插入到`include命令出現的地方,然后繼續進行下一步的編譯。關於文件包含的幾點說明:
1)一個文件包含命令只能制定一個被包含的文件,如果需要包含n個文件,要用n個`include命令。
2)`include命令可以出現在Verilog程序的任何位置。被包含文件名可以是相對路徑名,也可以是絕對路徑名。
3)可以將多個包含命令卸載同一行,可以出現空格和注釋行。
4)如果文件1 包含文件2,文件2需要用到文件3的內容,可以在文件一種用兩個`include命令分別將文件2和文件3包含進去,而且文件3要在文件2之前。
5)在一個被包含文件中又可以包含其他的文件,即文件的包含是可以嵌套的。
3)時間尺度`timescale
`timescale命令用來說明跟在該命令后面的模塊的時間單位和精度。使用`timescale命令可以在同一個設計中包含不同的時間單位的模塊。一般的命令格式如下:`timescale<時間單位>/<時間精度>
在這條命令中,時間單位參量是用來定義模塊中的仿真時間和延遲時間的基准單位的。時間精度是用來聲明該模塊的仿真時間的精確程度的,該參量被用來對延遲時間值進行取證操作,因此又可以稱作是取整精度。如果在同一個程序設計里,存在多個`timescale一樣的命令,則用最小的時間精度值來決定仿真的時間單位。另外時間精度不能大於時間單位值。
使用`timescale時應該注意,`timescale的有效區域為`timescale語句處直至下一個`timescale命令或者`resetall語句為止。當有多個`timescale命令時,只有最后一個才起作用,多以在同一個源文件中`timescale定義的不同的多個模塊最好分開編譯,不要包含在一起以免出錯。
`timescale 1ns/1ps //時間值都為1ns的整數倍,時間精度為1ps,因此延遲時間可以表達為帶三位小數的實型數。
`timescale 10μs/100ns //時間單位為10μs的整數倍,時間精度位100ns,因此延遲時間可以表達為帶兩位小數的實型數。

1 `timescale 10ns/1ns 2 module test; 3 reg =set; 4 parameter p=1.55; 5 initial 6 begin 7 $monitor($time,,"set=",set); 8 #p set=0; 9 #p set=1; 10 end 11 endmodule
1)根據時間精度,參數p的值從1.55取整為1.6;
2)因為時間單位是10ns,時間精度為1ns,所以延遲時間#p作為事件單位的整數倍為16ns;
3)可以用$printtimescale函數來輸出顯示一個模塊的時間單位和時間精度。
4)條件編譯命令`ifdef `else `endif
一般情況下,Verilog HDL源程序中所有的航都參加編譯。但是有時希望對其中的部分內容只有在滿足編譯條件時才進行編譯。也就是對一部分內容指定編譯條件,即條件編譯。
條件編譯命令有以下幾種形式:
`ifdef 宏名 (標識符)
程序段1
`else
程序段2
`endif
它的作用是當宏名已經被定義過(`define定義),則對程序1進行編譯,程序段2被忽略。其中else部分可以沒有。注意:忽略掉的程序段也要符合語法規則。