路徑延遲用關鍵字 specify 和 endspecify 描述,關鍵字之間組成 specify 塊語句。
specify 是模塊中獨立的一部分,不能出現在其他語句塊(initial, always 等)中。
specify 塊語句主要有以下功能:
指定所有路徑中引腳到引腳的延遲;
定義 specparam 常量;
在電路中設置時序檢查。
并行連接
每條路徑都有一個源引腳和目的引腳,將這些路徑的延遲依次用 specify 語句描述出來,稱為并行連接。
并行連接用法格式如下:
(=>) =;
一個帶有路徑延遲的 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
可以用關鍵字 specparam 在 specify 塊中定義延遲數值常量,然后賦值給路徑延遲。
specparam 定義的常量只能在 specify 塊內部使用。
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
并行連接中,源引腳和目的引腳是一一對應的。 并行連接也支持多位寬信號間的路徑延遲描述,但是位寬必須保持一致。
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
全連接
在全連接中,源引腳中的每一位與目標引腳的每一位相連接。
源引腳和目的引腳的連接是組合遍歷的,且不要求位寬對應。
全連接用法格式如下:
(*>) =;
例如 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
邊沿敏感路徑
邊沿敏感路徑用于輸入到輸出延遲的時序建模,并使用邊緣標識符指明觸發條件。 如果沒有指明的話,任何變化都會觸發源引腳到目的引腳的延遲值的變化。
用法舉例如下:
//在 clk 上升沿,從 clk 到 out 的路徑上升延遲為 1,下降延遲為 2
//從 in 到 out 的數據路徑是同向的,即 out = in
(posedge clk => (out +: in)) = (1,2);
//在 clk 下降沿,從 clk 到 out 的路徑上升延遲為 1,下降延遲為 2
//從 in 到 out 的數據路徑是反向的,即 out = ~in
(negedge clk => (out -: in)) = (1,2);
//clk 任意變化時,從 clk 到 out 的路徑上升延遲為 1,下降延遲為 2
//從 in 到 out 的數據路徑是不可以預知的,同向、反向或不變
(negedge clk => (out : in)) = (1,2);
條件路徑
Verilog 也允許模型中根據信號值的不同,有條件的給路徑延遲進行不同的賦值。
條件中的操作數可以是標量,也可以是向量,條件表達式也可以包含任意操作符。
需要注意的是,應當只使用 if 語句將條件路徑中所有的輸入狀態都完整的聲明。 沒有聲明的路徑會使用分布延遲,分布延遲也沒有聲明的話,將使用零延遲。 如果路徑延遲和分布延遲同時聲明,將選擇最大的延遲作為路徑延遲。
但是 specify 中的 if 語句不能使用 else 結構,可以使用 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
門延遲路徑
門延遲(上升延遲、下降延遲、關斷延遲)的數值也可以通過路徑延遲的方法來描述。
可以定義的延遲路徑個數為 1 個,2 個,3 個,6 個, 12 個,其他數量的延遲值都是錯誤的。
下面舉例說明門延遲模型中路徑延遲的表示方法。
//1 個參數:上升、下降、關斷延遲只使用一個延遲參數
specify
specparam t_delay = 1.5 ;
(clk => q) = t_delay ;
endspecify
//2 個參數: 上升延遲(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 個參數: 上升延遲(0->1, z->1)= 1.5
// 下降延遲(1->0, z->0)= 2
// 關斷延遲(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 個參數:分別對應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 個參數:分別對應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
門路徑延遲模型中,也可以指定最大值、最小值和典型值。
//上升、下降和關斷延的延遲值: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 傳輸延遲
如果沒有指定 x 轉換時間的延遲(門路徑延遲中沒有給出 12 個延遲參數),則規定:
從 x 轉換為已知狀態的延遲時間為,可能需要的最大延遲時間;
從已知狀態轉換為 x 的延遲時間為,可能需要的最小延遲時間。
例如,當門路徑延遲中給出 6 個延遲參數時,則 x 傳輸延遲時間定義如下表所示:
x 轉換 | 延遲值 |
---|---|
0->x | 最小(t_01、t_0z) |
1->x | 最小(t_10、t_1z) |
Z->X | 最小(t_z1、t_z0) |
x->0 | 最大(t_10、t_z0) |
X->1 | 最大(t_01、t_z1) |
X->Z | 最大值(t_1z, t_0z) |
-
延遲
+關注
關注
1文章
74瀏覽量
13730 -
引腳
+關注
關注
16文章
1547瀏覽量
52337 -
時序
+關注
關注
5文章
397瀏覽量
37779 -
路徑
+關注
關注
0文章
50瀏覽量
12607 -
邏輯模塊
+關注
關注
0文章
5瀏覽量
1542
發布評論請先 登錄
【FPGA學習】Verilog HDL的語句塊應該怎么寫
Verilog的兩種塊語句解析
Verilog的塊語句fork...join 和 begin...end
systemverilog的決策語句if…else語句介紹
決策語句允許程序塊的執行流程
SystemVerilog中的always語句塊
什么是SystemVerilog-決策語句-if-else語句?

Verilog中的If語句和case語句介紹

評論