Verilog 低功耗簡介

2022-05-20 14:36 更新

關(guān)鍵詞:開關(guān)功耗,內(nèi)部功耗,靜態(tài)功耗 

功耗影響

便攜性

功耗越低,同等電量下電子產(chǎn)品工作時間越長,便攜性設(shè)備的電池容量和體積設(shè)計的困難度也會降低。例如,手機越做越薄,性能還不受影響,就是因為低功耗設(shè)計發(fā)揮了至關(guān)重要的作用。

性能

功耗越大,耗能越多,產(chǎn)生的熱量越多,各器件的工作性能就會受到影響。例如,手機使用時間較長時,會感覺手機發(fā)熱,而且各應(yīng)用軟件也會出現(xiàn)卡頓的現(xiàn)象。

成本

不考慮低功耗設(shè)計時,一個功能的實現(xiàn)方法可能較為繁瑣,實現(xiàn)的器件增多,產(chǎn)品面積增大;同時,功耗過大時,就要考慮散熱裝置,這又增加了組裝成本。 總之,低功耗設(shè)計有很多的優(yōu)點,也是以后數(shù)字設(shè)計的發(fā)展趨勢。

功耗類型

功耗類型一般可分為動態(tài)功耗、靜態(tài)功耗和浪涌功耗。

動態(tài)功耗

動態(tài)功耗主要包括開關(guān)功耗(又稱為翻轉(zhuǎn)功耗)和短路功耗(又稱為內(nèi)部功耗)。

1、開關(guān)功耗

在 CMOS 數(shù)字電路中,對負載電容進行充放電時消耗的功耗為開關(guān)功耗。如下 CMOS 非門:


當 Vin = 0 時,上面的 PMOS 導(dǎo)通,下面的 NMOS 截止;VDD 對負載電容 Cload 進行充電。充電完成后,Vout 的電平為高。

當 Vin = 1 時,上面的 PMOS 截止,下面的 NMOS 導(dǎo)通,負載電容通過 NMOS 進行放電。放電完成后,Vout 的電平為低。

這樣一開一閉的變化,即電源的充放電,就形成了開關(guān)功耗。開關(guān)功耗的計算公式如下所示:

其中,VDD 為供電電壓,Cload 為后級電路等效的負載電容,Tr 為輸入信號的翻轉(zhuǎn)率。

2、短路功耗

信號的翻轉(zhuǎn)不是在瞬時完成的。因此,在輸入信號進行翻轉(zhuǎn)時,PMOS 和 NMOS 總有一段時間是同時導(dǎo)通的,那么從電源 VDD 到地 VSS 之間就有了通路,形成短路電流,產(chǎn)生短路功耗。如下反相器電路圖所示:


短路功耗的計算公式如下:

其中,Vdd 為供電電壓,Tr 為翻轉(zhuǎn)率,Q 為一次翻轉(zhuǎn)過程中從電源流到地的電荷量。

靜態(tài)功耗

在 CMOS 電路中,靜態(tài)功耗主要是漏電流引起的功耗,往往與工藝有關(guān)。


漏電流的組成主要為:PN 結(jié)反向電流 I1、源極和漏極之間的亞閾值漏電流 I2、柵極漏電流(包括柵極和漏極之間的感應(yīng)漏電流 I3)、柵極和襯底之間的隧道漏電流 I4。

一般情況下,漏電流主要是指柵極泄漏電流和亞閾值電流。對于超深亞微米工藝,隧道漏電流成為主要電流之一。

  • 在 PN 結(jié)兩端加反向電壓時,P 區(qū)空穴和 N 區(qū)電子的運動相反,沒有電流通過,二極管處于截止狀態(tài),部分能量較大的空穴和電子會掙脫反向電場的束縛而形成微弱的漂移電流。
  • 柵極泄漏功耗:在柵極加上信號后(即柵壓),柵級到襯底之間會存在電容,因此在柵襯之間就會存在有電流,由此就會存在功耗。
  • 亞閾值電流:柵極電壓低于導(dǎo)通閾值,仍會產(chǎn)生從漏極到源極的泄漏電流。此電流稱為亞閾值泄漏電流。在較狹窄的晶體管中,漏極和源極距離較近的情況下會產(chǎn)生亞閾值泄漏電流。晶體管越窄,泄漏電流越大。要降低亞閾值電流,可以使用高閾值的器件,還可以通過襯底偏置增加閾值電壓,這些也屬于低功耗設(shè)計的考慮范疇。
  • 隧道漏電流:屬于量子力學(xué)范疇,感興趣的同學(xué)可自行查閱。

靜態(tài)功耗的計算公式如下:

浪涌功耗

浪涌功耗是浪涌電流引起的功耗。浪涌電流是指開機或者喚醒時,器件流過的最大電流,因此浪涌電流也稱為啟動電流。浪涌功耗不是本次所討論的內(nèi)容。

功耗模型

library 信息

下面是一種 library 工藝的前幾行代碼描述,包含功耗有關(guān)的參數(shù),具體含義在注釋中說明。

library (xxx) {
    /*  library head: xxx */
    technology (cmos) ;
    simulation  : true ;
    nom_process : 1 ;
    nom_temperature : -40;         //默認溫度
    nom_voltage : 0.81;            //默認電壓
    voltage_map(VDD, 0.81);        //定義lib中多個電壓,包括以下幾行
    voltage_map(TVDD, 0.81);
    voltage_map(VDDDST, 0.81);
    voltage_map(VDDGR, 0.81);
    voltage_map(VDDSRC, 0.81);
    voltage_map(VSS, 0);
    operating_conditions("ssg0p81vm40c"){    //一種corner定義
        process : 1; /* SSGlobalCorner_LocalMC_MOS_MOSCAP-SSGlobalCorner_LocalMC_RES_BIP_DIO_DISRES */
        temperature : -40;
        voltage : 0.81;
        tree_type : "balanced_tree";
    }
    default_operating_conditions : ssg0p81vm40c ;
    capacitive_load_unit (1,pf) ;      //定義電容單位
    voltage_unit : "1V" ;              //定義電壓單位
    current_unit : "1mA" ;             //定義電流單位
    time_unit : "1ns" ;                //定義時間單位
    pulling_resistance_unit : "1kohm";
    define_cell_area (pad_drivers,pad_driver_sites) ;
    ……

cell 信息

一個 library 中會有多個基本功能單元,用關(guān)鍵字 cell 聲明,也包含了多種功耗信息。

cell (AN2D0BWP7T40P140) {
    area : 0.392;
    cell_footprint : "an2d1";
    pg_pin (VDD) {                //電源引腳
        pg_type : primary_power;
        voltage_name : VDD;
    }
    ……
   
    pin(A1) {                     //輸入信號引腳
    driver_waveform_fall : "tcbn22ullbwp7t40p140ssg0p81vm40c:fall";
    driver_waveform_rise : "tcbn22ullbwp7t40p140ssg0p81vm40c:rise";
    direction : input;
    related_ground_pin : VSS;     //輸入引腳地端
    related_power_pin : VDD;      //輸入引腳電壓
    capacitance : 0.000418924 ;   //輸入引腳電容
    ……  
    }

  pin(Z) {
    direction : output;
    power_down_function : "!VDD + VSS";
    function : "(A1 A2)";
    related_ground_pin : VSS;     //輸出引腳地端
    related_power_pin : VDD;      //輸出引腳電壓
    max_capacitance : 0.04182;    //輸出引腳最大電容
    min_capacitance : 0.00013;    //輸出引腳最小電容
    ……  
  }

此時,如果再知道翻轉(zhuǎn)率,就可以計算出動態(tài)功耗。

翻轉(zhuǎn)率(Toggle rate,Tr),指單位時間內(nèi)信號(包括時鐘、數(shù)據(jù)等信號) 的翻轉(zhuǎn)次數(shù)。如下所示,信號在 40ns 時間內(nèi)跳轉(zhuǎn)了 4 次,則翻轉(zhuǎn)率為 Tr = 4/4ns = 0.1GHz。


內(nèi)部功耗信息

cell 定義中,內(nèi)部功耗會有如下定義。

internal_power() {
    related_pin : "A1" ;
    related_pg_pin : VDD ;
    rise_power(power_template_8x8) {   //內(nèi)部功耗查找表
        index_1("0.0026, 0.0101, 0.0252, 0.0553, 0.1155, 0.236, 0.4769, 0.9587");
        index_2("0.00013, 0.00046, 0.00112, 0.00243, 0.00506, 0.01031, 0.02081, 0.04182");
        values ( \
          "0.000249215, 0.000254481, 0.000262354, 0.000261007, 0.00026381, 0.000277799, 0.000304295, 0.000345046", \
          "0.000239751, 0.000248667, 0.000255454, 0.0002551, 0.000268563, 0.000275995, 0.000294669, 0.000336529", \
          ……  
        );
      }

    fall_power(power_template_8x8) { //內(nèi)部功耗查找表
        index_1("0.0026, 0.0101, 0.0252, 0.0553, 0.1155, 0.236, 0.4769, 0.9587");
        index_2("0.00013, 0.00046, 0.00112, 0.00243, 0.00506, 0.01031, 0.02081, 0.04182");
        values ( \
          "0.000577367, 0.000584652, 0.000589472, 0.000591623, 0.000592223, 0.000591943, 0.00059185, 0.000592132", \
          "0.000563896, 0.000570743, 0.000576589, 0.000579818, 0.000580794, 0.00057962, 0.000579997, 0.000579136", \
          "0.000550059, 0.000555794, 0.00056188, 0.000565568, 0.000567663, 0.000567231, 0.000567712, 0.00056745", \
          ……  
        );
      }
}

cell 的內(nèi)部功耗與其轉(zhuǎn)換時間和輸出電容負載有關(guān)。根據(jù)輸入轉(zhuǎn)換時間和輸出電容的大小,在工藝庫中進行查表,得到上升功耗和下降功耗,再根據(jù)下面公式進行計算,可得到總的內(nèi)部功耗:

靜態(tài)功耗信息

cell 定義中,靜態(tài)功耗(漏電功耗)會有如下定義。

  leakage_power () {
    value : 0.059561;
    related_pg_pin : VDD;
  }
  leakage_power () {
    value : 0.048082;
    when : "!A1 !A2 !Z";
    related_pg_pin : VDD;
  }
  leakage_power () {
    value : 0.053318;
    when : "!A1 A2 !Z";
    related_pg_pin : VDD;
  }
  ……

靜態(tài)功耗跟 cell 的狀態(tài)有關(guān),也就是輸入輸出信號在不同的狀態(tài)下,功耗也會有所差異。通過狀態(tài)進行查表,就可以得到相應(yīng)的靜態(tài)功耗了。 實際分析功耗時,不會手動的去查找相關(guān)參數(shù)來計算功耗,否則工作量會大到難以估計。往往是借助一些功耗分析工具,提取這些標準單元庫的功耗信息進行整合計算。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號