路徑延遲用關(guān)鍵字 specify 和 endspecify 描述,關(guān)鍵字之間組成 specify 塊語句。
specify 是模塊中獨立的一部分,不能出現(xiàn)在其他語句塊(initial, always 等)中。
specify 塊語句主要有以下功能:
每條路徑都有一個源引腳和目的引腳,將這些路徑的延遲依次用 specify 語句描述出來,稱為并行連接。
并行連接用法格式如下:
(<source_io> => <destination_io>) = <delay_value> ;
一個帶有路徑延遲的 4 輸入的與邏輯模塊模型描述如下:
module and4(
output out,
input a, b, c, d);
specify
(a => out) = 2.5 ;
(b => out) = 2.5 ;
(c => out) = 3.5 ;
(d => out) = 3.5 ;
endspecify
wire an1, an2 ;
and (an1, a, b);
and (an2, c, d);
and (out, an1, an2);
endmodule
可以用關(guān)鍵字 specparam 在 specify 塊中定義延遲數(shù)值常量,然后賦值給路徑延遲。
specparam 定義的常量只能在 specify 塊內(nèi)部使用。
specify
specparam ab_2_out = 2.5 ;
specparam cd_2_out = 3.5 ;
(a => out) = ab_2_out ;
(b => out) = ab_2_out ;
(c => out) = cd_2_out ;
(d => out) = cd_2_out ;
endspecify
并行連接中,源引腳和目的引腳是一一對應(yīng)的。并行連接也支持多位寬信號間的路徑延遲描述,但是位寬必須保持一致。
module paral_conn(
input [3:0] d,
output [3:0] q);
specify
(d => q) = 3 ;
endspecify
assign q = d & 0101 ;
endmodule
其中,specify 塊語句也可以展開描述,兩種表達方式是等效的。
specify
(d[0] => q[0]) = 3 ;
(d[1] => q[1]) = 3 ;
(d[2] => q[2]) = 3 ;
(d[3] => q[3]) = 3 ;
endspecify
在全連接中,源引腳中的每一位與目標(biāo)引腳的每一位相連接。
源引腳和目的引腳的連接是組合遍歷的,且不要求位寬對應(yīng)。
全連接用法格式如下:
(<multiple_source_io> *> <multiple_destination_io>) = <delay_value> ;
例如 4 輸入的與邏輯模塊可以描述如下:
module and4(
output out,
input a, b, c, d);
specify
(a,b *> out) = 2.5 ;
(c,d *> out) = 3.5 ;
endspecify
wire an1, an2 ;
and (an1, a, b);
and (an2, c, d);
and (out, an1, an2);
endmodule
邊沿敏感路徑用于輸入到輸出延遲的時序建模,并使用邊緣標(biāo)識符指明觸發(fā)條件。如果沒有指明的話,任何變化都會觸發(fā)源引腳到目的引腳的延遲值的變化。
用法舉例如下:
//在 clk 上升沿,從 clk 到 out 的路徑上升延遲為 1,下降延遲為 2
//從 in 到 out 的數(shù)據(jù)路徑是同向的,即 out = in
(posedge clk => (out +: in)) = (1,2);
//在 clk 下降沿,從 clk 到 out 的路徑上升延遲為 1,下降延遲為 2
//從 in 到 out 的數(shù)據(jù)路徑是反向的,即 out = ~in
(negedge clk => (out -: in)) = (1,2);
//clk 任意變化時,從 clk 到 out 的路徑上升延遲為 1,下降延遲為 2
//從 in 到 out 的數(shù)據(jù)路徑是不可以預(yù)知的,同向、反向或不變
(negedge clk => (out : in)) = (1,2);
Verilog 也允許模型中根據(jù)信號值的不同,有條件的給路徑延遲進行不同的賦值。
條件中的操作數(shù)可以是標(biāo)量,也可以是向量,條件表達式也可以包含任意操作符。
需要注意的是,應(yīng)當(dāng)只使用 if 語句將條件路徑中所有的輸入狀態(tài)都完整的聲明。沒有聲明的路徑會使用分布延遲,分布延遲也沒有聲明的話,將使用零延遲。如果路徑延遲和分布延遲同時聲明,將選擇最大的延遲作為路徑延遲。
但是 specify 中的 if 語句不能使用 else 結(jié)構(gòu),可以使用 ifnone 描述條件缺省時的路徑延遲。
specify
if (a) (a => out) = 2.5 ;
if (~a) (a => out) = 1.5 ;
if (b & c) (b => out) = 2.5 ;
if (!(b & c)) (b => out) = 1.5 ;
if ({c, d} == 2'b01)
(c,d *> out) = 3.5 ;
ifnone (c,d *> out) = 3 ;
endspecify
門延遲(上升延遲、下降延遲、關(guān)斷延遲)的數(shù)值也可以通過路徑延遲的方法來描述。
可以定義的延遲路徑個數(shù)為 1 個,2 個,3 個,6 個, 12 個,其他數(shù)量的延遲值都是錯誤的。
下面舉例說明門延遲模型中路徑延遲的表示方法。
//1 個參數(shù): 上升、下降、關(guān)斷延遲只使用一個延遲參數(shù)
specify
specparam t_delay = 1.5 ;
(clk => q) = t_delay ;
endspecify
//2 個參數(shù): 上升延遲(0->1, z->1, 0->z)= 1.5
// 下降延遲(1->0, z->0, 1->z)= 2
specify
specparam t_rise = 1.5, t_fall = 2 ;
(clk => q) = (t_rise, t_fall) ;
endspecify
//3 個參數(shù): 上升延遲(0->1, z->1)= 1.5
// 下降延遲(1->0, z->0)= 2
// 關(guān)斷延遲(1->z, 0->z)= 1.8
specify
specparam t_rise = 1.5, t_fall = 2, t_turnoff = 1.8 ;
(clk => q) = (t_rise, t_fall, t_turnoff);
endspecify
//6 個參數(shù): 分別對應(yīng)0->1, 1->0, 0->z, z->1, 1->z, z->0
specify
specparam t_01 = 1.5, t_10 = 2, t_0z = 1.8 ;
specparam t_z1 = 2, t_1z = 2.2, t_z0 = 2.1 ;
(clk => q) = (t_01, t_10, t_0z, t_z1, t_1z, t_z0) ;
endspecify
//12 個參數(shù): 分別對應(yīng)0->1, 1->0, 0->z, z->1, 1->z, z->0
// 0->x, x->1, 1->x, x->0, x->z, z->x
specify
specparam t_01 = 1.5, t_10 = 2, t_0z = 1.8 ;
specparam t_z1 = 2, t_1z = 2.2, t_z0 = 2.1 ;
specparam t_0x = 1.1, t_x1 = 1.2, t_1x = 2.1 ;
specparam t_x0 = 2, t_xz = 2 , t_zx = 2.1 ;
(clk => q) = (t_01, t_10, t_0z, t_z1, t_1z, t_z0,
t_0x, t_x1, t_1x, t_x0, t_xz, t_zx) ;
endspecify
門路徑延遲模型中,也可以指定最大值、最小值和典型值。
//上升、下降和關(guān)斷延的延遲值:min: typical: max
specify
specparam t_rise = 1:1.5:1.8;
specparam t_fall = 1:1.8:2 ;
specparam t_turnoff = 1.1:1.2:1.3 ;
(clk => q) = (t_rise, t_fall, t_turnoff);
endspecify
如果沒有指定 x 轉(zhuǎn)換時間的延遲(門路徑延遲中沒有給出 12 個延遲參數(shù)),則規(guī)定:
例如,當(dāng)門路徑延遲中給出 6 個延遲參數(shù)時,則 x 傳輸延遲時間定義如下表所示:
x 轉(zhuǎn)換 | 延遲值 |
---|---|
0->x | min(t_01, t_0z) |
1->x | min(t_10, t_1z) |
z->x | min(t_z1, t_z0) |
x->0 | max(t_10, t_z0) |
x->1 | max(t_01, t_z1) |
x->z | max(t_1z, t_0z) |
點擊這里下載源碼
更多建議: