天天看點

(數字IC)低功耗設計入門(二)——功耗的分析

前面學習了進行低功耗的目的個功耗的構成,今天就來分享一下功耗的分析。由于是面向數字IC前端設計的學習,是以這裡的功耗分析是基于DC中的power compiler工具;更精确的功耗分析可以采用PT,關于PT的功耗分析可以查閱其他資料,這裡不涉及使用PT的進行功耗分析。

  (1)功耗分析與流程概述

  上一個小節中講解了功耗的構成,并且結合工藝庫進行簡要地介紹了功耗的計算。但是實際上,我們根本不可能人工地計算實際的大規模內建電路的功耗,我們往往借助EDA工具幫我們分析電路的功耗。這裡我們就介紹一下EDA工具分析功耗的(普遍)流程,然後下一小節我們将介紹低功耗電路的設計和優化。

①功耗分析流程的輸入輸出

   功耗分析的流程(從輸入輸出關系看)如下所示:

           

(數字IC)低功耗設計入門(二)——功耗的分析

上面的圖中,需要四種東西:

  ·tech library:這個就是包含功耗資訊的工藝庫了,比較精确的庫裡面還應該包含狀态路徑(SDPD)資訊,代工廠提供。

  ·netlist:設計的門級網表電路,可以通過DC綜合得到。

  ·parasitic:設計中連線等寄生參數,比如寄生電容、寄生電阻,這個一般是後端RC寄生參數工具提供,簡單的功耗分析可以不需要這個檔案。

  ·switch activity:包含設計中每個節點的開關行為情況,比如說節點的翻轉率或者可以計算出節點翻轉率的檔案。這個開關行為輸入檔案是很重要的。這個開關行為可以有不同的形式提供,是以就有後面不同的分析功耗的方法。

(注意,不管使用什麼方法進行功耗分析,功耗分析的時候,輸入設計檔案的都是門級網表檔案)

②開關行為的一些概念

  說到開關行為,我們前面的翻轉率也是一種開關行為。此外我們還有其他關于開關行為描述的概念,這裡我們通過舉例說明,如下圖所示:

                   

(數字IC)低功耗設計入門(二)——功耗的分析

  ·翻轉(次)數:邏輯變化的次數,上圖中信号的翻轉數為3.

  ·翻轉率:前面也有相關介紹,這裡重提一下,翻轉率是機關時間内信号(包括時鐘、資料等等信号)的翻轉次數。上圖中翻轉率為3/6 = 0.5(6個時間間隔内,翻轉了3次)

  ·T1,T0:(節點)信号的邏輯值為1和0的持續時間,上圖中T1為4,T0為2。

  ·靜态機率(static  probability ,SP):(節點)信号邏輯值為1的機率,上圖中的SP為4/6=2/3。

 ③開關行為(檔案)情況表示

前面我們說到了功耗的分析需要開關行為的情況,一般就是指每個節點的翻轉率情況,我們有下面方式設定翻轉率:

  ·直接指令進行:例如指令:

  set_switching_activity  -static   0.2   -toggle_rate   20 -period  1000 [all_inputs]

這時,翻轉率設定的節點是輸入,響應的翻轉率為:Tr = 20/1000 = 0.02GHz

  ·SAIF檔案:即switching activity interchange format,開關行為内部交換格式檔案,用于仿真器和功耗分析之間交換資訊的ASCII檔案(美國标準資訊交換碼檔案)。

  ·VCD檔案,即value change dump 檔案,它也是一個ASCII檔案,檔案中包括了一個設計中所選擇變量值的變化資訊,這些資訊通過在仿真testbench中使用“VCD系統函數”得到。

  在Synopsys的低功耗設計流程裡面,可以使用power compiler(包含在design compiler中)進行功耗分析。我們可以通過指令來定義節點的翻轉率的方法來分析功耗----稱為無向量(vector-free)分析法;由于SAIF檔案和VCD檔案可以通過對電路仿真得到,它們是仿真接口格式檔案,是以也可以通過VCS仿真器産生SAIF或者VCD檔案的方法分析功耗。當要分析的結果比較精确時,一般使用SAIF檔案或者VCD檔案(VCD檔案通過相關指令轉換成SAIF檔案,而後使用SAIF進行功耗分析)。

  (2)無向量分析法

  前面我們說到,無向量分析法就是通過指令來定義節點的翻轉率的方法來分析功耗。我們先來逐條學習需要什麼的指令,然後在後面進行舉例說明無向量分析法的腳本。

  在學習設定翻轉率的指令之前,我們先來了解一下什麼是設計的傳播起點和黑盒子。我們定義傳播的起點為設計的輸入端和黑盒子的輸出端,黑盒子是指在工藝庫裡沒有功能描述的單元(比如ROM 、RAM或者一些IP核)。例如對于下面的設計中:

                       

(數字IC)低功耗設計入門(二)——功耗的分析

  上面的設計有三處起點,一處是整個設計的輸入端,一處是黑盒子的輸出端,還有一處是某個單元的輸入端。最後一處的起點不包含在我們的定義中,但是我們也把它當做起點,因為這是被标記了翻轉率,這個我們後面進行講解。

  利用無向量分析法分析功耗時,我們不必提供設計内部節點的翻轉率,而是通過設定起點的翻轉率就行了。我們有兩種方法設定翻轉率,一種是通過設定翻轉變量,一種是通過标記的方法。下面我們就來介紹如何通過這兩種方法進行設定翻轉率。

①設定翻轉變量

在power compiler中,可以設定下面的兩個翻轉變量進行設定翻轉率:

  power_default_toggle_rate

  power_default_static_probability

下面就來介紹一下這兩個變量(主要介紹power_default_toggle_rate)。

  power_default_toggle_rate:其用法我們可以在DC中進行man一下,這個變量設定設計中預設使用的翻轉率。定義方式是:

      set   power_default_toggle_rate   翻轉值

翻轉值預設是0.5。這個翻轉值不是翻轉率,這個變量定義的翻轉率是個相對的值:

  ·如果設計定義了時鐘,這個power_default_toggle_rate變量定義的翻轉率就以最快的時鐘為參考,比如翻轉值為0.5時,設計中最快的時鐘為10ns,那麼翻轉率Tr = 0.5/10ns = 0.05GHz,也就是整個設計中預設的翻轉率是0.05GHz。

  ·如果設計中沒有時鐘,那麼就會以工藝庫中的時間機關作為參考,例如工藝庫中的時間機關是ns,翻轉值為0.5,那麼翻轉率Tr = 0.5/1ns = 0.5GHz。

  power_default_static_probability:這個設定的是預設的靜态機率,也就是起點的邏輯值是1的機率。至于靜态機率,這裡就不較長的描述了。這兩個變量的預設翻轉值都是0.5,翻轉率是很大的,一般情況下需要減小一點,比如設定為0.01和0.02這樣的。

  一般情況下,預設的翻轉率是設定在起點上的,也就是說起點的翻轉率用的是power_default_toggle_rate這個變量設定的翻轉率,内部節點的翻轉率可以通過傳播得到,如下圖所示:

         

(數字IC)低功耗設計入門(二)——功耗的分析

  需要說明的是,傳播不可以穿過沒有功能描述的黑盒子,也就是不能通過傳播的方式得到黑盒子的輸出翻轉率,是以我們在最前面就定義了,将黑盒子的輸出當做起點,這樣其他節點的翻轉率可以通過傳播得到(包括黑盒子的輸入),黑盒子輸出的翻轉率通過預設設定的翻轉率得到,我們就得到了設計中所有節點的翻轉率。

②标記翻轉率

  上面的方式設定的是預設的翻轉率。當我們需要為某個節點标記某個指定的翻轉率,而不是使用預設的翻轉率時,我們就用到了标記頻率,如下圖所示:

                 

(數字IC)低功耗設計入門(二)——功耗的分析

單元A的輸入端口标記了特定翻轉率,比如說0.04GHz。标記的翻轉率比傳播的翻轉率優先級更高,被标記翻轉率的節點将作為一個新的起點,這就不屬于起點的定義,但還是叫它為起點的原因。标記翻轉率之後,這個單元後續的節點的翻轉率将通過這個新标記的翻轉率傳播得到。

  設定标記翻轉率(簡稱設定翻轉率)的指令主要有兩條:

    set_switching_activity 和 set_case_analysis,下面就來講解一下這兩條指令的意思。

  set_switching_activity :設定某個節點的翻轉率和靜态機率,在使用無向量分析法估算功耗的時候,這個指令被廣泛使用,越多的節點上被标記翻轉率,估算功耗的精度就越高。指令和選項如下所示:

set_switching_activity

               [-static_probability static_probability]

               [-toggle_rate toggle_rate]

               [-state_condition state_condition]

               [-path_sources path_sources]

               [-rise_ratio rise_ratio]

               [-period period_value | -base_clock clock]

               [-type object_type_list]

               [-hierarchy]

               [object_list]

               [-verbose]

下面來簡單介紹一下常用的幾個選項,詳細的介紹可以通過man set_switching_activity擷取。

  -static_probability :設定靜态機率。

  -period    period_value | -base_clock clock:設定時鐘(周期),-period和 -base_clock隻能設定其中一個。

  -toggle_rate:設定翻轉值,與-period或者 -base_clock相關聯。翻轉率Tr等于:用-base_clock選項指定的時鐘周期裡面的翻轉數目  或 用-period選項指定的時間段裡的翻轉數目;當沒有這個設定兩個選項時,将使用工藝庫裡面的時間機關,即翻轉率等于在每個庫機關時間内的翻轉數目。

下面來舉例說明這個指令的用法:

例一:

    create_clock CLK -period 20

    set_switching_activity  -base_clock  CLK  -toggle   0.5  -static  0.015  [all_inputs]

上述指令設定了時鐘周期為20ns,然後指令使用的是-base_clock的選項,所有輸入端的翻轉值為0.5,靜态機率為0.015,于是得到翻轉率Tr=0 .5/20=0.025 GHz

例二:

    set_switching_activity -period  1000  -toggle  25  -static  0.015   [all_inputs]

上述沒有建立時鐘,但是使用了period選項,意思是1000個周期内翻轉了25次,于是我們就可以得到是以輸入的翻轉率Tr=25/1000=0. 025 GHz

例三:

    set_switching_activity -toggle  0.025  -static  0.015 [all_inputs]

上述指令中,-period和 -base_clock這兩個選項都沒有使用,這個時候就跟工藝庫裡面的時間機關有關了,若庫中時間機關為ns,那麼我們就得到翻轉率Tr=0.025 /1 = 0.025 GHz

  上面講解了set_switching_activity ,下面我們就來講解一下set_case_analysis。

  set_case_analysis 用來指定一個靜态邏輯值,也就是設定信号為常數,不進行翻轉;設計裡面的一些信号需要這樣子設計,例如複位信号,設定如下所示:

    set_case_analysis  1  [get_ports reset]

則設定了reset的值常為1.

=================================================================================================

  上面我們講解了設定翻轉率的方法,下面舉例說明一下如何綜合使用這兩種翻轉率。例如對于下面的設計:

               

(數字IC)低功耗設計入門(二)——功耗的分析

翻轉率的設定要求如下所示:

  1.正确地定義時鐘;

  2.使用set_case_analysis指令設定常數控制信号reset;

  3.在傳輸起點設定翻轉率,在輸入端和黑盒子輸出端設定任何已知的翻轉率,其他的起點将使用預設的翻轉率。

  4.讓工具在設計中把翻轉率傳播下去

上面的沒有要求具體的翻轉率,是以我們可以設定我們想要的翻轉率,根據上面的要求,我們編寫相應的tcl腳本如下所示:

  create_clock  -p  4  [get_ports clk}

  set_case_analysis  0  reset  [get_ports  reset]

  set_power_default_toggle_rate  0.003

  set_switching_activity -tog 0.02  a

  set_switching_activity -tog 0.06  b

  set_switching_activity -tog 0.11  x

上面的腳本中,設定了周期為4(ns)的時鐘,然後利用set_case_analysis指令,設定reset端口為常數;翻轉值為0.003,那麼對應的翻轉率為0.003/4ns,這個是預設的翻轉率;然後利用set_switching_activity指令指定a、b、x的翻轉值,其翻轉率為 翻轉值/4ns。

=============================================================================================

  前面介紹了無向量分析法進行功耗分析,在介紹一下使用SAIF檔案的方法進行功耗分析之前,我們先來介紹一下綜合不變物體和綜合變化物體的概念,下圖為一個電路的RTL設計和門級設計:

               

(數字IC)低功耗設計入門(二)——功耗的分析

根據定義,在綜合前和綜合後,設計中的寄存器數目和寄存器的結構是不變的,輸入/輸出端口和層次邊界是不變的,設計中的黑盒子是不變的。這些不變的物體稱為綜合不變物體(Synthesis Invariant Objects,有時候也叫綜合不變對象)。設計中大部分的組合電路生成與設計限制有很大的關系,不同的限制産生不同的組合電路。這些變化的物體稱為綜合變化的物體(Synthesis Variant Objects)。由于SAIF檔案中涉及這兩個概念,這裡先進行介紹。

  介紹完這兩個概念之後,下面我們就來了解一下使用SAIF進行功耗分析。SAIF檔案當做翻轉率輸入檔案的方法有兩種方式,也就是說利用SAIF進行功耗分析有兩種方法——對RTL級的電路仿真後得到的SAIF檔案(稱為RTL backward SAIF) 以及  對門級網表的電路仿真後得到的檔案(稱為Gate backward SAIF)。下面逐個進行具體介紹。

  (3)SAIF--RTL BACK分析法

  RTL backward SAIF檔案是通過對RTL代碼進行仿真得到的,當設計很大的時候,門級仿真時間就會很長,這時候就可以使用這種方法進行分析。使用這種方法進行分析功耗的速度比較快,但是進度不夠門級仿真SAIF檔案的高。

①RTL forward SAIF檔案

  RTL forward SAIF檔案是記錄RTL設計中綜合不變物體的開關行為檔案,可以簡單地了解:RTL forward SAIF檔案簡要地記錄了綜合不變物的翻轉率。RTL backward SAIF檔案的産生需要RTL forward SAIF檔案,是以我們首先需要産生RTL forward  SAIF檔案。産生RTL  forward  SAIF檔案的流程如下:

                   

(數字IC)低功耗設計入門(二)——功耗的分析

  RTL  forward  SAIF檔案是由power compiler (包含在design compiler中)産生的,根據流程,我們知道,主要設定一些變量,然後讀入RTL設計(RTL.v設計),接着讀出SAIF檔案就可以了。相應的腳本如下所示:

    set  power_preserve_rtl-hier_names  true

    read_verilog   "sub.v top. v"

    rtl2saif  -output  fwd_ rtl.saif

一個示例RTL  forward  SAIF檔案裡面的部分内容如下所示:

(SAIFILE

(SAIFVERSION "2 .0")

(DIRECTION "forward")

(DESIGN)

(DATE "Wed May 12 18:31:19 2004

(VENDOR "Synopsys,Inc")

(PROGRAM NAME "rtl2saif")

(VERSION“1 .0")

(DIVIDER/)

(INSTANCE top

    (PORT

    (address\15\ address\15\)

    (address\14\ address\14\)

    (address\13\ address\13\)

    (address\12\ address\12\)

    (address\11\ address\11\)

    (address\10\ address\10\)

  ······

我們可以看到,檔案裡面包含設計中一系列綜合不變的物體。在後續仿真中,仿真器隻監視這些物體的開關行為。

②RTL backward SAIF檔案的産生

下面是産生RTL backward SAIF檔案的流程:

                   

(數字IC)低功耗設計入門(二)——功耗的分析

從上圖中,我們知道,産生RTL backward SAIF檔案,需要在仿真器輸入testbench測試平台檔案、RTL.v設計、RTL forward SAIF檔案,然後使用VCS産生RTL forward SAIF檔案時,需要在testbench調用PLI監測節點的翻轉率。下面我們就來介紹一下這幾個部分。

  ·首先是PLI。使用VCS産生SAIF檔案,需要用到程式設計語言接口(programming language interface,PLI)。通過PLI監測節點的翻轉,得到節點的翻轉率。主要需要下面的系統任務:

    $set_gate_level_monitoring   ( on|off|rtl_on);

    $set_toggle_region   (obj);

    $read_ rtl_ saif(rtl_saif_file_name,tb_pathname);

    $read_ lib_ saif(lib_saif_file_name);

    $toggle_start;

    $toggle_stop;

    $toggle_reset();

    $toggle_report(file_name,type,unit);

  · RTL.v就是設計源檔案了,然後RTL forward SAIF檔案在前面也講過了,這裡就從略。

  · 最後是testbench。testbench中調用RTL設計、調用一下上述的PLI系統函數、調用RTL forward SAIF檔案等。一個簡單的示例testbench檔案如下所示:

module  testbench;

top instl (a, b, c,s);//例化頂層設計

initial  begin

      $read_rtl_saif ("myrtl.saif")

      $set_toggle_region  (u1);

      $toggle_start;

      #120  a=0;

      #STEP  in_a=temp_in_a;

 ······

      $toggle_stop;

      $toggle_report("rtl.saif",1.0e-9,"top");

end

endmodule

上面的測試平台中,用了系統任務程式$read_rtl_saif ("myrtl. saif"),該指令讀入綜合不變物體檔案——RTL forward SAIF。是以,仿真時,仿真器僅僅監視這些綜合不變物體的開關行為。向量中$set_toggle_region (u1)指令選擇要監視的子產品。$toggle_start和$toggle_stop指令用于控制監視的起始和終止時間。$toggle_report("rtl. saif",1. 0e-9,"top")指令輸出SAIF資訊到指定的檔案。

  一起都準備就緒了,下面就可以使用VCS運作仿真:

    vcs  -R   rtl. v  testbench. v

注意,這裡我們進行的是RTL設計檔案的仿真,仿真完成後,就可以得到rtl.saif 檔案,這個檔案就是RTL backward SAIF檔案。

③功耗的分析

  對RTL代碼仿真後,所得到的RTL Backward SAIF檔案包含了設計中綜合不變物體的開關行為資訊。進行功耗分析時,分析工具通過其内部仿真器把綜合不變物體的翻轉率傳播下去,進而得到其他所有節點的翻轉率,進行門級電路的功耗分析。得到了RTL backward SAIF檔案之後,我們根據前面的功耗分析的流程(從輸入輸出關系看),就可以分析功耗了:

               

(數字IC)低功耗設計入門(二)——功耗的分析

這裡的開關活動檔案就是RTL backward SAIF檔案了。然後在power compiler中利用RTL backward SAIF檔案進行功耗分析的流程如下所示:

                 

(數字IC)低功耗設計入門(二)——功耗的分析

一個相應的示例腳本如下所示:

    set  target_library  my. db

    set  link_library  "*  $target_library"

    read_verilog   mynetlist.v

    current_design top

    link

    read_ saif  -input  rtl.saif  -inst  testbench/top

    report_power

  利用RTL backward SAIF檔案分析功耗的過程就是上面這個樣子了。上面的流程和腳本适用于前版圖(pre-layout)的設計,沒有用到寄生參數檔案。連線的RC參數使用工藝庫裡的線負載模型。如果是後版圖(post-layout)的設計,要盡量使用寄生參數檔案,提高功耗分析的精确度。

  從上面我們就知道,利用RTL backward SAIF檔案分析功耗的流程就是:

power compiler 産生 RTL forward SAIF檔案 ——》VCS仿真産生RTL  backward SAIF檔案 ——》power compiler 進行分析功耗。

  (4)SAIF--GATE分析法

  前面介紹了RTL backward SAIF檔案分析功耗的方法和流程,下面介紹一下Gate backward SAIF檔案分析功耗的方法和流程,這個與RTL backward SAIF檔案的很類似。

①library  forward  SAIF 檔案(簡稱為 庫SAIF檔案)

  庫SAIF檔案是包含SDPD(電路狀态路徑)資訊的SAIF檔案。Gate backward SAIF檔案的生成需要庫SAIF檔案,該檔案可以通過power compiler生成,流程如下所示:

         

(數字IC)低功耗設計入門(二)——功耗的分析

對應該流程的一個示例腳本如下所示:

    read_db  mylib.db

    lib2saif  -output  mylib. saif  -lib_pathname   mylib.db

示例庫SAIF檔案的部分内容如下所示:

(SAIFILE

(SAIFVERSION "2.0" "lib")

(DIRECTION "forward")

(DESIGN)

(DATE "Mon May 10 15:40:19 2004"

(VENDOR "Synopsys,Inc")

(PROGRAM NAME "lib2saif")

(DIVIDER / )

(LIBRARY "ssc_core_typ"

  (MODULE "and2al"

      (PORT

        (Y

          (COND A RISE FALL (IOPATH B)

            COND B RISE FALL(IOPATH A)

            COND DEFAULT)

        )

······

庫SAIF檔案中包含了SDPD資訊。有了庫SAIF檔案,仿真時,仿真器會根據庫中的SDPD資訊,監視節點的開關行為。

②Gate Backward SAIF檔案的生成

下面是産生gate backward SAIF檔案的流程:

                 

(數字IC)低功耗設計入門(二)——功耗的分析

從上圖中我們可以看到,産生gate backward SAIF需要testbench測試平台、門級網表、标準延時格式(standard delay format)檔案SDF、庫SAIF檔案。其中SDF檔案反标了門級網表中的RC延時參數等,可以更為準确地得到線網的延時。

testbench的示例内容如下所示:

module testbench;

top instl (a, b, c,s);

initial

$sdf_annotate("my.sdf",dut)

initial begin

$read_lib_saif ("mylib.saif");

$set_toggle_region (u1);

$toggle_start;

#120  a=0;

#STEP  in_ a=temp_in_a;

······

$toggle_stop;

$toggle-report("gate.saif",1.0e-9,"top")

end

endmodule//testbench

testbench測試平台主要是調用門級網表、SDF檔案、庫SAIF檔案。testbench中,用$sdf_annotate("my. sdf", dut)指令作SDF标記,以保證時序的正确性,進而得到正确的翻轉數目。$ read_lib_saif ("mylib. saif")指令讀取庫SAIF檔案中的SDPD資訊。仿真器隻監視在SAIF檔案裡列出的SDPD開關行為。$ set_toggle_region (u1)指令選擇要監視的子產品。$ toggle_start和$toggle_stop指令控制開始和結束時間。$ toggle_report("gate. saif",1. 0e-9, "top")指令把SAIF輸出到指定的檔案。

    萬事俱備,隻欠仿真,接下來就是使用VCS進行仿真了:

      vcs   -R   top.v   testbench. v

注意,這裡的仿真是對門級網表的仿真,也就是說這裡的top.v是門級網表。産生的示例gate forward SAIF檔案的部分内容如下所示:

(SAIFILE

(SAIFVERSION "2 .0")

(DIRECTION  "backward")

(DESIGN)

(DATE  "Mon May 17 02:33:48 2006")

(VENDOR "Synopsys,Inc")

(PROGRAM_NAME  "VCS-Scirocco-MX Power Compiler")

(VERSION "1 .0")

(DIVIDER / )

(TIMESCALE  1  ns)

(DURATION  10000.00)

(INSTANCE tb

(INSTANCE top

  (NET

    (z\3\

        (T0 6488) (T1 3493) (TX 18)

        (TC 26) (IG 0)

    )

······

(z\32\

     (T0 6488) (T1 3493) (TX 18)

         (TC 26)(IG 0)

       )

     ······

)

(INSTANCE U3

  (PORT

  (Y

      (TO 4989) (T1 5005) (TX 6)

      (COND((D1 * !DO)|(! D1*D0)) (RISE)

          (IOPATH S (TC 22 )(IG 0)

            )

      COND((D1*!DO)}(!D1,DO))

          ( IOPATH  S  (TC  21)(IG 0) (FALL)

           )

  COND DEFAULT (TC 0)(IG 0)

  )

 ······

Gate Backward SAIF檔案是通過對門級網表進行仿真所得到的。如果設計很大,仿真需要的時間很長。好處是精确度很高。VCS所産生的Gate Backward SAIF檔案中包含了一些或所有連線的開關行為和單元的開關行為。這些開關行為分别以上升和下降表示,與狀态和路徑有關。用這個資訊可以進行精确的功耗分析。

③功耗分析

  有了門級網表、gate backward SAIF檔案和SDF檔案,就可以在power  compiler中進行功耗分析了,分析功耗的流程圖如下所示:

             

(數字IC)低功耗設計入門(二)——功耗的分析

對應的一個示例腳本檔案如下所示:

    set   target_library  mylib.db

    set  link_library " * $target_library"

    read_verilog  mynetlist.v

    current_design  top

    link

    read_read_parasitics  top.spef

    read_ saif -input  mygate. saif  -inst  tb/top

    report_power

上面的流程和腳本适用于後版圖(post-layout)的設計,spef檔案在做完版圖後産生。使用寄生參數檔案,提高了功耗分析的精确度。如果是前版圖( pre-layout)的設計,沒有寄生參數檔案,連線的RC參數使用工藝庫裡的線負載模型。

最後總結一下,這裡分析功耗流程為:

  power compiler 産生庫SAIF檔案——》VCS産生gate backward SAIF檔案——》power compiler進行功耗分析。

  (5)VCD轉SAIF分析法

前介紹了使用SAIF檔案分析功耗的方法,這個方法都是通過VCS仿真得到相應的SAIF檔案,然後進行功耗分析。下面我們介紹使用VCD檔案轉換成SAIF檔案的方法,然後進行功耗分析。

①VCD檔案的産生

首先,我們在進行仿真的時候,需要通過在testbench中加入相關的系統函數,産生相應的VCD檔案(和SDF檔案),流程示意圖如下所示:

           

(數字IC)低功耗設計入門(二)——功耗的分析

相應的一個示例testbench如下所示:

module testbench;

······

initial

  $sdf_annotate("my.sdf",dut)

initial begin

  $dumpfile("vcd.dump");

  $dumpvars;

······

endmodule

然後使用下面指令進行仿真:

    vcs  -R dut.v  testbench.v  +delay_mode_path

完成仿真之後,就可以得到VCD檔案了。

②VCD檔案轉換成SAIF檔案

仿真時産生的VCD檔案也包含了設計中節點和連線的開關行為。在Power Compiler中,可以使用程式vcd2saif可以把VCD檔案轉化為SAIF檔案,如下圖所示:

         

(數字IC)低功耗設計入門(二)——功耗的分析

vcd2saif是在UNIX指令行使用的一個程式。vcd2saif程式也可以把VPD檔案(二進制格式的VCD檔案)轉化為SAIF格式的檔案。如果設計很大,仿真的時間長,vcd2saif程式可以用管道傳遞的方式把VCD轉化為SAIF檔案。這時vcd檔案不存放在檔案裡,vcd通過先入先出(First-In  First-()nt,簡稱FIFO把資料傳給vcd2saif程式,然後産生SAIF檔案。轉換的SAIF檔案裡沒有SDPD的資訊。如下圖所示:

         

(數字IC)低功耗設計入門(二)——功耗的分析

有了SAIF檔案之後,我們就可以像前面那樣使用SAIF檔案進行功耗分析了,至于是版圖前的功耗分析還是版圖後的功耗分析,取決于功耗分析時有沒有與版圖中有關的資訊,比如是SPEF檔案。是以流程為:

    VCS産生VCD檔案——》power compiler 将VCD檔案轉換為SAIF檔案——》power compiler 進行分析功耗

最後,我們來說一下這裡使用vcd2saif程式的好處,主要有下面三點:

  1.  VCD産生的速度快;

  2.  VCD是IEEE的标準并且适用于進行後仿真;

  3.  轉換的過程快。

 =============================================================================================

我們已經介紹四種為設計産生開關行為的方法,分别是直接設定翻轉率、RTL backward SAIF檔案、gate back SAIF檔案和VCD轉SAIF檔案;這些方法可以混合使用,其優先次序如下所示:

             

(數字IC)低功耗設計入門(二)——功耗的分析

用read_ saif指令标記的開關行為優先級最高;用set_switching_activity指令設定的開關行為優先級次之;優先級最低的是用預設的變量power_default_toggle_rate指定的翻轉率。

    開關行為可以被清除,使用“reset_switching_activity”指令可以清除所有被标記的翻轉率和通過傳輸得到的翻轉率。用report_saif可以顯示讀入saif檔案後設計中的開關行為資訊。一個完整的SAIF檔案,"user annotated”應該是100%。如果SAIF不完整,那麼預設的翻轉率将附加到輸入端和黑盒子的輸出端。翻轉率通過零延遲仿真傳輸下去,這樣就可以計算出設計的功耗。

  使用report_saif指令的一個例子如下:

               

(數字IC)低功耗設計入門(二)——功耗的分析

與開關行為有關的指令有:

merge_saif #合并SAIF檔案

read_sai f #讀backward SAIF檔案

report_saif #報告開關行為的資訊

rtl2saif #産生RTL forward SAIF檔案

write_ saif #寫出一個backward SAIF檔案

lib2saif #産生library forward SAIF檔案

propagate_switching_activity #傳輸功耗清除

reset_switching_activity #清除開關行為和/或翻轉率

set_switching_activity #在指定的物體上設定開關行為

  (6)功耗分析報告

我們是通過分析功耗報告(report_power指令産生)來檢視設計功耗的,一個功耗報告的示例部分内容如下所示:

    Cell  Internal  Power=883.0439 mW(66%)

    Net  Switching Power=453.0173 mW(34%)

    Total  Dynamic  Power=1 .3361 W(100%)

    Cell Leakage Power = 391.5133 nW

其中第一項為内部短路功耗,第二項為開關功耗,合起來為動态功耗;最後一項為靜态功耗,也就是洩漏功耗。如果要報告設計中每個子產品和單元的功耗,在report_power指令後加選項 -hier,例如:  report_power  -hier,産生的報告如下所示:

    

(數字IC)低功耗設計入門(二)——功耗的分析

基于EDA工具——power compiler 的功耗分析就記到這裡。

不忘初心:寫部落格最初目的就是記錄自己容易忘記的東西,而不是像寫書那樣專門寫給别人看的。是以,除禁止轉載的博文外,其他博文可以轉載。 盡自己的努力,做到更好!