先看一個例子
/*This is first Verilog progaram*/
·timescale 1ns/1ns
module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry;
/**/assign #2 Sum=A^B;assign #5 Carry=A&B;
endmodule;
Verilog以module為單位編寫,每個文件一個module,文件名與module名相同
- 第1行為注釋;
- 第2行為編譯指令;
- 第3行為模塊聲明開始,模塊的名稱為halfAdder,模塊有4個端口;
- 第4、5行對端口的類型進行了聲明;
- 第6、7、8對模塊的行為進行了描述(或定義或設計);
- 第9行聲明模塊結束
一個模塊的基本語法如下:
module module_name (port_list);Declarations:reg, wire, parameter,input, output, inout,function, task, . . .Statements:Initial statementAlways statementModule instantiationGate instantiationUDP instantiationContinuous assignment
endmodule
這些語句在模塊中出現的順序無關緊要,這些語句是并發的。
1.注釋:
有兩種形式---與C語言相同
/*第一種形式:可以擴展至多行 */
//第二種形式:在本行結束。
2.編譯指令
以`(反引號)開始的某些標識符是編譯器指令。在 Verilog 語言編譯時,特定的編譯器指令在整個編譯過程中有效(編譯過程可跨越多個文件),直到遇到其它的不同編譯程序指令。
完整的標準編譯器指令如下 :
? `define, `undef
? `ifdef, `else, `endif
? `default_nettype
? `include
? `resetall
? `timescale
? `unconnected_drive, `nounconnected_drive
? `celldefine, `endcelldefine
2.1`define 和`undef
`define指令用于文本替換,它很像 C語言中的#define 指令
2.2 `ifdef, `else, `endif
這些編譯指令用于條件編譯
2.3`default_nettype
該指令用于為隱式線網指定線網類型。也就是將那些沒有被說明的連線定義線網類型。
`default_nettype wand
該實例定義的缺省的線網為線與類型。因此,如果在此指令后面的任何模塊中沒有說明的連線,那么該線網被假定為線與類型。
2.4`include
`include 編譯器指令用于嵌入內嵌文件的內容。
2.5?`resetall
該編譯器指令將所有的編譯指令重新設置為缺省值。
2.6 `timescale
在Verilog HDL 模型中,所有時延都用單位時間表述。
2.7 `unconnected_drive和`nounconnected_drive
在模塊實例化中,出現在這兩個編譯器指令間的任何未連接的輸入端口或者為正偏電路狀態或者為反偏電路狀態。
`unconnected_drive pull1
. . .
/*在這兩個程序指令間的所有未連接的輸入端口為正偏電路狀態(連接到高電平) */
`nounconnected_drive
`unconnected_drive pull0
. . .
/*在這兩個程序指令間的所有未連接的輸入端口為反偏電路狀態(連接到低電平) */
`nounconnected_drive
2.8 `celldefine 和 `endcelldefine
這兩個程序指令用于將模塊標記為單元模塊。它們表示包含模塊定義,如下例所示。
`celldefine
module FD1S3AX (D, CK, Z) ;
. . .
endmodule
`endcelldefine
某些PLI例程使用單元模塊。
3.常量
3.1基本型:4種
0、1、x、z
3.2數值型:整型和實型
3.2.1 整型
兩種表示方法:
1.簡單的十進制格式
2.基數格式
這種形式的整數格式為:
[size ] 'base value
s i z e 定義以位計的常量的位長; b a s e為o或O(表示八進制),b或B(表示二進制),d或D(表示十進制),h或H(表示十六進制)之一; v a l u e是基于 b a s e的值的數字序列。值 x和z以及十六進制中的 a到f不區分大小寫。
- 基數格式計數形式的數通常為無符號數。
- 如果沒有定義一個整數型的長度,數的長度為相應值中定義的位數。
- 如果定義的長度比為常量指定的長度長,通常在左邊填 0補位。但是如果數最左邊一位為x或z,就相應地用x或z在左邊補位。
- 如果長度定義得更小,那么最左邊的位相應地被截斷。
- ?字符在數中可以代替值z在值z被解釋為不分大小寫的情況下提高可讀性
3.2.2 實型
兩種表示方法:
1.簡單的十進制格式
2.科學計數法
Ve r i l o g語言定義了實數如何隱式地轉換為整數。實數通過四舍五入被轉換為最相近的整
數。
3.3字符串型
字符串是雙引號內的字符序列。字符串不能分成多行書寫。
5.變量
5.1.標識符
Verilog HDL中的標識符(identifier)可以是任意一組字母、數字、 $符號和_(下劃線)符號的
組合,但標識符的第一個字符必須是字母或者下劃線。另外,標識符是區分大小寫的。
*轉義標識符:
轉義標識符以 \(反斜線 )符號開頭,以空白結尾(空白可以是一個空格、一個制表字符或換行符)。
*關鍵字:
Verilog HDL 定義的一系列保留字,注意只有小寫的關鍵字才是保留字。
5.2變量的類型
2類:net 和 register
5.2.1 線網類型net type
具體又分為6大類11種
net type 表示Verilog結構化元件間的物理連線。它的值由驅動元件的值決定,例如連續賦值或門的輸出。如果沒有驅動元件連接到線網,線網的缺省值為 z。
簡單的線網類型說明語法為:
net_kind [msb:lsb] net1, net2, . . . , netN;
n e t _ k i n d 是上述線網類型的一種。 m s b和l s b 是用于定義線網范圍的常量表達式;范圍定義是可選的;如果沒有定義范圍,缺省的線網類型為 1位。
- 1.wire和tri
- 2.wand和triand
- 3.wor和trior
- 4.trireg
- 5.tri0和tri1
- 6.supply0和supply1
supply0用于對“地”建模,即低電平 0;s u p p l y 1網用于對電源建模,即高電平 1;例如:
supply0 Gnd, ClkGnd;
supply1 [2:0] Vcc;
5.2.2 寄存器類型 register type
具體有5種:reg、integer、time、real、realtime
- 1.reg寄存器類
register type表示一個抽象的數據存儲單元,它只能在 always語句和initial語句中被賦值,并且它的值從一個賦值到另一個賦值被保存下來。寄存器類型的變量具有 x的缺省值。
寄存器數據類型 reg是最常見的數據類型。 reg類型使用保留字 reg加以說明,形式如下:
reg [ msb: lsb] reg1, reg2, . . . regN;
- 2存儲器類型:
存儲器是一個寄存器數組。存儲器使用如下方式說明:
reg [ msb: lsb] memory1[ upper1: lower1], memory2[ upper2: lower2], . . . ;
- 3.integer整數寄存器類
- 4.time類
- 5.real和realtime類
6.參數
參數是一個常量。參數經常用于定義時延和變量的寬度。使用參數說明的參數只被賦值一次。參數說明形式如下:
parameter param1 = const_expr1, param2 = const_expr2, ...,paramN = const_exprN;
7.行為描述方式
7.1數據流描述
用數據流描述方式對一個設計建模的最基本的機制就是使用連續賦值語句。在連續賦值語句中,某個值被指派給線網變量。 連續賦值語句的語法為 :
assign [delay] LHS_net = RHS_ expression;
7.2行為描述方式
設計的行為功能使用下述過程語句結構描述:
1) initial語句:此語句只執行一次。
2) always語句:此語句總是循環執行 , 或者說此語句重復執行
只有寄存器類型數據能夠在這兩種語句中被賦值。寄存器類型數據在被賦新值前保持原
有值不變。所有的初始化語句和 always語句在0時刻并發執行。
7.3結構化模式方式
在Verilog HDL中可使用如下方式描述結構 :
1) 內置門原語 (在門級);
2) 開關級原語 (在晶體管級 );
3) 用戶定義的原語 (在門級);
4) 模塊實例 (創建層次結構)。
通過使用線網來相互連接。
7.4混合描述方式
在模塊中,結構的和行為的結構可以自由混合。也就是說,模塊描述中可以包含實例化的門、模塊實例化語句、連續賦值語句以及 a l w a y s語句和 i n i t i a l語句的混合。它們之間可以相互包含。來自 a l w a y s語句和 i n i t i a l語句(切記只有寄存器類型數據可以在這兩種語句中賦值)的值能夠驅動門或開關,而來自于門或連續賦值語句(只能驅動線網)的值能夠反過來用于觸發always語句和initial語句。
?