在Verilog HDL 模型中,所有時(shí)延都用單位時(shí)間表述。使用`timescale編譯器指令將時(shí)間單位與實(shí)際時(shí)間相關(guān)聯(lián)。該指令用于定義時(shí)延的單位和時(shí)延精度。`timescale編譯器指令格式為:
`timescale time_unit / time_precision
time_unit 和time_precision 由值1、10、和100以及單位s、ms、us、ns、ps和fs組成。例如:
`timescale 1ns/100ps
表示時(shí)延單位為1ns, 時(shí)延精度為100ps。`timescale 編譯器指令在模塊說(shuō)明外部出現(xiàn), 并且影響后面所有的時(shí)延值。例如:
`timescale 1ns/ 100ps
module AndFunc (Z, A, B);
output Z;
input A, B;
and # (5.22, 6.17 ) Al (Z, A, B);
//規(guī)定了上升及下降時(shí)延值。
endmodule
編譯器指令定義時(shí)延以ns為單位,并且時(shí)延精度為1/10 ns(100 ps)。因此,時(shí)延值5.22對(duì)應(yīng)5.2 ns, 時(shí)延6.17對(duì)應(yīng)6.2 ns。如果用如下的`timescale程序指令代替上例中的編譯器指令,
`timescale 10ns/1ns
那么5.22對(duì)應(yīng)52ns, 6.17對(duì)應(yīng)62ns。
在編譯過程中,`timescale指令影響這一編譯器指令后面所有模塊中的時(shí)延值,直至遇到另一個(gè)`timescale指令或`resetall指令。當(dāng)一個(gè)設(shè)計(jì)中的多個(gè)模塊帶有自身的`timescale編譯指令時(shí)將發(fā)生什么?在這種情況下,模擬器總是定位在所有模塊的最小時(shí)延精度上,并且所有時(shí)延都相應(yīng)地?fù)Q算為最小時(shí)延精度。例如,
`timescale 1ns/ 100ps
module AndFunc (Z, A, B);
output Z;
input A, B;
and # (5.22, 6.17 ) Al (Z, A, B);
endmodule
`timescale 10ns/ 1ns
module TB;
reg PutA, PutB;
wire GetO;
initial
begin
PutA = 0;
PutB = 0;
#5.21 PutB = 1;
#10.4 PutA = 1;
#15 PutB = 0;
end
AndFunc AF1(GetO, PutA, PutB);
endmodule
在這個(gè)例子中,每個(gè)模塊都有自身的`timescale編譯器指令。`timescale編譯器指令第一次應(yīng)用于時(shí)延。因此,在第一個(gè)模塊中,5.22對(duì)應(yīng)5.2 ns, 6.17對(duì)應(yīng)6.2 ns; 在第二個(gè)模塊中5.21對(duì)應(yīng)52 ns, 10.4對(duì)應(yīng)104 ns, 15對(duì)應(yīng)150 ns。如果仿真模塊TB,設(shè)計(jì)中的所有模塊最小時(shí)間精度為100 ps。因此,所有延遲(特別是模塊TB中的延遲)將換算成精度為100 ps。延遲52 ns現(xiàn)在對(duì)應(yīng)520*100 ps,104對(duì)應(yīng)1040*100 ps,150對(duì)應(yīng)1500*100 ps。更重要的是,仿真使用100 ps為時(shí)間精度。如果仿真模塊AndFunc,由于模塊TB不是模塊AddFunc的子模塊,模塊TB中的`timescale程序指令將不再有效。
3.5.7 `unconnected_drive和`nounconnected_drive
在模塊實(shí)例化中,出現(xiàn)在這兩個(gè)編譯器指令間的任何未連接的輸入端口或者為正偏電路狀態(tài)或者為反偏電路狀態(tài)。
`unconnected_drive pull1
. . .
/*在這兩個(gè)程序指令間的所有未連接的輸入端口為正偏電路狀態(tài)(連接到高電平)*/
`nounconnected_drive
`unconnected_drive pull0
. . .
/*在這兩個(gè)程序指令間的所有未連接的輸入端口為反偏電路狀態(tài)(連接到低電平)*/
`nounconnected_drive
3.5.8 `celldefine 和 `endcelldefine
這兩個(gè)程序指令用于將模塊標(biāo)記為單元模塊。它們表示包含模塊定義,如下例所示。
`celldefine
module FD1S3AX (D, CK, Z) ;
. . .
endmodule
`endcelldefine
某些PLI例程使用單元模塊。
3.6 值集合
Verilog HDL有下列四種基本的值:
1) 0:邏輯0或“假”
2) 1:邏輯1或“真”
3) x:未知
4) z:高阻
注意這四種值的解釋都內(nèi)置于語(yǔ)言中。如一個(gè)為z的值總是意味著高阻抗,一個(gè)為0的值通常是指邏輯0。
在門的輸入或一個(gè)表達(dá)式中的為“z”的值通常解釋成“x”。此外,x值和z值都是不分大小寫的,也就是說(shuō),值0x1z與值0X1Z相同。Verilog HDL中的常量是由以上這四類基本值組成的。
Verilog HDL中有三類常量:
1) 整型
2) 實(shí)數(shù)型
3) 字符串型
下劃線符號(hào)(_)可以隨意用在整數(shù)或?qū)崝?shù)中,它們就數(shù)量本身沒有意義。它們能用來(lái)提高易讀性;唯一的限制是下劃線符號(hào)不能用作為首字符。
3.6.1 整型數(shù)
整型數(shù)可以按如下兩種方式書寫:
1) 簡(jiǎn)單的十進(jìn)制數(shù)格式
2) 基數(shù)格式
1. 簡(jiǎn)單的十進(jìn)制格式
這種形式的整數(shù)定義為帶有一個(gè)可選的 “+”(一元)或 “-”(一元)操作符的數(shù)字序列。下面是這種簡(jiǎn)易十進(jìn)制形式整數(shù)的例子。
32 十進(jìn)制數(shù)32
-15 十進(jìn)制數(shù)-15
這種形式的整數(shù)值代表一個(gè)有符號(hào)的數(shù)。負(fù)數(shù)可使用兩種補(bǔ)碼形式表示。因此32在5位的二進(jìn)制形式中為10000,在6位二進(jìn)制形式中為110001;-15在5位二進(jìn)制形式中為10001,在6位二進(jìn)制形式中為110001。
評(píng)論