Verilog specify塊語句

2022-05-20 14:33 更新

關(guān)鍵詞: specify, 路徑延遲

路徑延遲用關(guān)鍵字 specify 和 endspecify 描述,關(guān)鍵字之間組成 specify 塊語句。

specify 是模塊中獨立的一部分,不能出現(xiàn)在其他語句塊(initial, always 等)中。

specify 塊語句主要有以下功能:

  • 指定所有路徑中引腳到引腳的延遲;
  • 定義 specparam 常量;
  • 在電路中設(shè)置時序檢查。

并行連接

每條路徑都有一個源引腳和目的引腳,將這些路徑的延遲依次用 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 傳輸延遲

如果沒有指定 x 轉(zhuǎn)換時間的延遲(門路徑延遲中沒有給出 12 個延遲參數(shù)),則規(guī)定:

  • 從 x 轉(zhuǎn)換為已知狀態(tài)的延遲時間為,可能需要的最大延遲時間;
  • 從已知狀態(tài)轉(zhuǎn)換為 x 的延遲時間為,可能需要的最小延遲時間。

例如,當(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)

點擊這里下載源碼


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號