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

  前面學習了進行低功耗的目的個功耗的構成,今天就來分享一下功耗的分析。因爲是面向數字IC前端設計的學習,因此這裏的功耗分析是基於DC中的power compiler工具;更精確的功耗分析能夠採用PT,關於PT的功耗分析能夠查閱其餘資料,這裏不涉及使用PT的進行功耗分析。前端

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

  上一個小節中講解了功耗的構成,而且結合工藝庫進行簡要地介紹了功耗的計算。可是實際上,咱們根本不可能人工地計算實際的大規模集成電路的功耗,咱們每每藉助EDA工具幫咱們分析電路的功耗。這裏咱們就介紹一下EDA工具分析功耗的(廣泛)流程,而後下一小節咱們將介紹低功耗電路的設計和優化。函數

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

   功耗分析的流程(從輸入輸出關係看)以下所示:post

           

上面的圖中,須要四種東西:學習

  ·tech library:這個就是包含功耗信息的工藝庫了,比較精確的庫裏面還應該包含狀態路徑(SDPD)信息,代工廠提供。測試

  ·netlist:設計的門級網表電路,能夠經過DC綜合獲得。優化

  ·parasitic:設計中連線等寄生參數,好比寄生電容、寄生電阻,這個通常是後端RC寄生參數工具提供,簡單的功耗分析能夠不須要這個文件。spa

  ·switch activity:包含設計中每一個節點的開關行爲狀況,好比說節點的翻轉率或者能夠計算出節點翻轉率的文件。這個開關行爲輸入文件是很重要的。這個開關行爲能夠有不一樣的形式提供,所以就有後面不一樣的分析功耗的方法。命令行

注意,無論使用什麼方法進行功耗分析,功耗分析的時候,輸入設計文件的都是門級網表文件

 

②開關行爲的一些概念

  說到開關行爲,咱們前面的翻轉率也是一種開關行爲。此外咱們還有其餘關於開關行爲描述的概念,這裏咱們經過舉例說明,以下圖所示:

                   

 

  ·翻轉(次)數:邏輯變化的次數,上圖中信號的翻轉數爲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核)。例如對於下面的設計中:

                       

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

  利用無向量分析法分析功耗時,咱們沒必要提供設計內部節點的翻轉率,而是經過設置起點的翻轉率就好了。咱們有兩種方法設置翻轉率,一種是經過設置翻轉變量,一種是經過標記的方法。下面咱們就來介紹如何經過這兩種方法進行設置翻轉率。

①設置翻轉變量

在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這個變量設置的翻轉率,內部節點的翻轉率能夠經過傳播獲得,以下圖所示:

         

  須要說明的是,傳播不能夠穿過沒有功能描述的黑盒子,也就是不能經過傳播的方式獲得黑盒子的輸出翻轉率,所以咱們在最前面就定義了,將黑盒子的輸出當作起點,這樣其餘節點的翻轉率能夠經過傳播獲得(包括黑盒子的輸入),黑盒子輸出的翻轉率經過默認設置的翻轉率獲得,咱們就獲得了設計中全部節點的翻轉率。

 

②標記翻轉率

  上面的方式設置的是默認的翻轉率。當咱們須要爲某個節點標記某個指定的翻轉率,而不是使用默認的翻轉率時,咱們就用到了標記頻率,以下圖所示:

                 

單元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.

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

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

               

翻轉率的設置要求以下所示:

  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設計和門級設計:

               

 

根據定義,在綜合前和綜合後,設計中的寄存器數目和寄存器的結構是不變的,輸入/輸出端口層次邊界是不變的,設計中的黑盒子是不變的。這些不變的物體稱爲綜合不變物體(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文件的流程以下:

                   

  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文件的流程:

                   

從上圖中,咱們知道,產生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文件以後,咱們根據前面的功耗分析的流程(從輸入輸出關係看),就能夠分析功耗了:

               

這裏的開關活動文件就是RTL backward SAIF文件了。而後在power compiler中利用RTL backward SAIF文件進行功耗分析的流程以下所示:

                 

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

    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生成,流程以下所示:

         

 

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

    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文件的流程:

                 

從上圖中咱們能夠看到,產生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中進行功耗分析了,分析功耗的流程圖以下所示:

             

對應的一個示例腳本文件以下所示:

    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文件),流程示意圖以下所示:

           

相應的一個示例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文件,以下圖所示:

         

 

vcd2saif是在UNIX命令行使用的一個程序。vcd2saif程序也能夠把VPD文件(二進制格式的VCD文件)轉化爲SAIF格式的文件。若是設計很大,仿真的時間長,vcd2saif程序能夠用管道傳遞的方式把VCD轉化爲SAIF文件。這時vcd文件不存放在文件裏,vcd經過先入先出(First-In  First-()nt,簡稱FIFO把數據傳給vcd2saif程序,而後產生SAIF文件。轉換的SAIF文件裏沒有SDPD的信息。以下圖所示:

         

有了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文件;這些方法能夠混合使用,其優先次序以下所示:

             

 

用read_ saif命令標記的開關行爲優先級最高;用set_switching_activity命令設置的開關行爲優先級次之;優先級最低的是用默認的變量power_default_toggle_rate指定的翻轉率。

    開關行爲能夠被清除,使用「reset_switching_activity」命令能夠清除全部被標記的翻轉率和經過傳輸獲得的翻轉率。用report_saif能夠顯示讀入saif文件後設計中的開關行爲信息。一個完整的SAIF文件,"user annotated」應該是100%。若是SAIF不完整,那麼默認的翻轉率將附加到輸入端和黑盒子的輸出端。翻轉率經過零延遲仿真傳輸下去,這樣就能夠計算出設計的功耗。

  使用report_saif命令的一個例子以下:

               

 

與開關行爲有關的命令有:

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,產生的報告以下所示:

    

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

相關文章
相關標籤/搜索