功耗分析2

前面學(xué)習(xí)了進(jìn)行低功耗的目的個(gè)功耗的構(gòu)成,今天就來分享一下功耗的分析。由于是面向數(shù)字IC前端設(shè)計(jì)的學(xué)習(xí),所以這里的功耗分析是基于DC中的power compiler工具;更精確的功耗分析可以采用PT,關(guān)于PT的功耗分析可以查閱其他資料,這里不涉及使用PT的進(jìn)行功耗分析。

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

  上一個(gè)小節(jié)中講解了功耗的構(gòu)成,并且結(jié)合工藝庫(kù)進(jìn)行簡(jiǎn)要地介紹了功耗的計(jì)算。但是實(shí)際上,我們根本不可能人工地計(jì)算實(shí)際的大規(guī)模集成電路的功耗,我們往往借助EDA工具幫我們分析電路的功耗。這里我們就介紹一下EDA工具分析功耗的(普遍)流程,然后下一小節(jié)我們將介紹低功耗電路的設(shè)計(jì)和優(yōu)化。

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

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

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

·tech library:這個(gè)就是包含功耗信息的工藝庫(kù)了,比較精確的庫(kù)里面還應(yīng)該包含狀態(tài)路徑(SDPD)信息,代工廠提供。

·netlist:設(shè)計(jì)的門級(jí)網(wǎng)表電路,可以通過DC綜合得到。

·parasitic:設(shè)計(jì)中連線等寄生參數(shù),比如寄生電容、寄生電阻,這個(gè)一般是后端RC寄生參數(shù)工具提供,簡(jiǎn)單的功耗分析可以不需要這個(gè)文件。

·switch activity:包含設(shè)計(jì)中每個(gè)節(jié)點(diǎn)的開關(guān)行為情況,比如說節(jié)點(diǎn)的翻轉(zhuǎn)率或者可以計(jì)算出節(jié)點(diǎn)翻轉(zhuǎn)率的文件。這個(gè)開關(guān)行為輸入文件是很重要的。這個(gè)開關(guān)行為可以有不同的形式提供,因此就有后面不同的分析功耗的方法。

注意,不管使用什么方法進(jìn)行功耗分析,功耗分析的時(shí)候,輸入設(shè)計(jì)文件的都是門級(jí)網(wǎng)表文件


②開關(guān)行為的一些概念

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


·翻轉(zhuǎn)(次)數(shù):邏輯變化的次數(shù),上圖中信號(hào)的翻轉(zhuǎn)數(shù)為3.

·翻轉(zhuǎn)率:前面也有相關(guān)介紹,這里重提一下,翻轉(zhuǎn)率是單位時(shí)間內(nèi)信號(hào)(包括時(shí)鐘、數(shù)據(jù)等等信號(hào))的翻轉(zhuǎn)次數(shù)。上圖中翻轉(zhuǎn)率為3/6 = 0.5(6個(gè)時(shí)間間隔內(nèi),翻轉(zhuǎn)了3次)

·T1,T0:(節(jié)點(diǎn))信號(hào)的邏輯值為1和0的持續(xù)時(shí)間,上圖中T1為4,T0為2。

·靜態(tài)概率(static ?probability ,SP):(節(jié)點(diǎn))信號(hào)邏輯值為1的概率,上圖中的SP為4/6=2/3。


?③開關(guān)行為(文件)情況表示

前面我們說到了功耗的分析需要開關(guān)行為的情況,一般就是指每個(gè)節(jié)點(diǎn)的翻轉(zhuǎn)率情況,我們有下面方式設(shè)置翻轉(zhuǎn)率:

??·直接命令進(jìn)行:例如命令:

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

這時(shí),翻轉(zhuǎn)率設(shè)置的節(jié)點(diǎn)是輸入,響應(yīng)的翻轉(zhuǎn)率為:Tr = 20/1000 = 0.02GHz

??·SAIF文件:即switching activity interchange format,開關(guān)行為內(nèi)部交換格式文件,用于仿真器和功耗分析之間交換信息的ASCII文件(美國(guó)標(biāo)準(zhǔn)信息交換碼文件)。

??·VCD文件,即value change dump 文件,它也是一個(gè)ASCII文件,文件中包括了一個(gè)設(shè)計(jì)中所選擇變量值的變化信息,這些信息通過在仿真testbench中使用“VCD系統(tǒng)函數(shù)”得到。

??在Synopsys的低功耗設(shè)計(jì)流程里面,可以使用power compiler(包含在design compiler中)進(jìn)行功耗分析。我們可以通過命令來定義節(jié)點(diǎn)的翻轉(zhuǎn)率的方法來分析功耗----稱為無(wú)向量(vector-free)分析法;由于SAIF文件和VCD文件可以通過對(duì)電路仿真得到,它們是仿真接口格式文件,因此也可以通過VCS仿真器產(chǎn)生SAIF或者VCD文件的方法分析功耗。當(dāng)要分析的結(jié)果比較精確時(shí),一般使用SAIF文件或者VCD文件(VCD文件通過相關(guān)命令轉(zhuǎn)換成SAIF文件,而后使用SAIF進(jìn)行功耗分析)。


  (2)無(wú)向量分析法

  前面我們說到,無(wú)向量分析法就是通過命令來定義節(jié)點(diǎn)的翻轉(zhuǎn)率的方法來分析功耗。我們先來逐條學(xué)習(xí)需要什么的命令,然后在后面進(jìn)行舉例說明無(wú)向量分析法的腳本。

在學(xué)習(xí)設(shè)置翻轉(zhuǎn)率的命令之前,我們先來了解一下什么是設(shè)計(jì)的傳播起點(diǎn)和黑盒子。我們定義傳播的起點(diǎn)為設(shè)計(jì)的輸入端和黑盒子的輸出端,黑盒子是指在工藝庫(kù)里沒有功能描述的單元(比如ROM 、RAM或者一些IP核)。例如對(duì)于下面的設(shè)計(jì)中:

  上面的設(shè)計(jì)有三處起點(diǎn),一處是整個(gè)設(shè)計(jì)的輸入端,一處是黑盒子的輸出端,還有一處是某個(gè)單元的輸入端。最后一處的起點(diǎn)不包含在我們的定義中,但是我們也把它當(dāng)做起點(diǎn),因?yàn)檫@是被標(biāo)記了翻轉(zhuǎn)率,這個(gè)我們后面進(jìn)行講解。

利用無(wú)向量分析法分析功耗時(shí),我們不必提供設(shè)計(jì)內(nèi)部節(jié)點(diǎn)的翻轉(zhuǎn)率,而是通過設(shè)置起點(diǎn)的翻轉(zhuǎn)率就行了。我們有兩種方法設(shè)置翻轉(zhuǎn)率,一種是通過設(shè)置翻轉(zhuǎn)變量,一種是通過標(biāo)記的方法。下面我們就來介紹如何通過這兩種方法進(jìn)行設(shè)置翻轉(zhuǎn)率。

①設(shè)置翻轉(zhuǎn)變量

在power compiler中,可以設(shè)置下面的兩個(gè)翻轉(zhuǎn)變量進(jìn)行設(shè)置翻轉(zhuǎn)率:

power_default_toggle_rate

power_default_static_probability

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

power_default_toggle_rate:其用法我們可以在DC中進(jìn)行man一下,這個(gè)變量設(shè)置設(shè)計(jì)中默認(rèn)使用的翻轉(zhuǎn)率。定義方式是:

set ??power_default_toggle_rate ??翻轉(zhuǎn)值

翻轉(zhuǎn)值默認(rèn)是0.5。這個(gè)翻轉(zhuǎn)值不是翻轉(zhuǎn)率,這個(gè)變量定義的翻轉(zhuǎn)率是個(gè)相對(duì)的值:

·如果設(shè)計(jì)定義了時(shí)鐘,這個(gè)power_default_toggle_rate變量定義的翻轉(zhuǎn)率就以最快的時(shí)鐘為參考,比如翻轉(zhuǎn)值為0.5時(shí),設(shè)計(jì)中最快的時(shí)鐘為10ns,那么翻轉(zhuǎn)率Tr = 0.5/10ns = 0.05GHz,也就是整個(gè)設(shè)計(jì)中默認(rèn)的翻轉(zhuǎn)率是0.05GHz。

·如果設(shè)計(jì)中沒有時(shí)鐘,那么就會(huì)以工藝庫(kù)中的時(shí)間單位作為參考,例如工藝庫(kù)中的時(shí)間單位是ns,翻轉(zhuǎn)值為0.5,那么翻轉(zhuǎn)率Tr = 0.5/1ns = 0.5GHz。

power_default_static_probability:這個(gè)設(shè)置的是默認(rèn)的靜態(tài)概率,也就是起點(diǎn)的邏輯值是1的概率。至于靜態(tài)概率,這里就不詳細(xì)描述了。這兩個(gè)變量的默認(rèn)翻轉(zhuǎn)值都是0.5,翻轉(zhuǎn)率是很大的,一般情況下需要減小一點(diǎn),比如設(shè)置為0.01和0.02這樣的。


  一般情況下,默認(rèn)的翻轉(zhuǎn)率是設(shè)置在起點(diǎn)上的,也就是說起點(diǎn)的翻轉(zhuǎn)率用的是power_default_toggle_rate這個(gè)變量設(shè)置的翻轉(zhuǎn)率,內(nèi)部節(jié)點(diǎn)的翻轉(zhuǎn)率可以通過傳播得到,如下圖所示:

  需要說明的是,傳播不可以穿過沒有功能描述的黑盒子,也就是不能通過傳播的方式得到黑盒子的輸出翻轉(zhuǎn)率,因此我們?cè)谧钋懊婢投x了,將黑盒子的輸出當(dāng)做起點(diǎn),這樣其他節(jié)點(diǎn)的翻轉(zhuǎn)率可以通過傳播得到(包括黑盒子的輸入),黑盒子輸出的翻轉(zhuǎn)率通過默認(rèn)設(shè)置的翻轉(zhuǎn)率得到,我們就得到了設(shè)計(jì)中所有節(jié)點(diǎn)的翻轉(zhuǎn)率。


②標(biāo)記翻轉(zhuǎn)率

  上面的方式設(shè)置的是默認(rèn)的翻轉(zhuǎn)率。當(dāng)我們需要為某個(gè)節(jié)點(diǎn)標(biāo)記某個(gè)指定的翻轉(zhuǎn)率,而不是使用默認(rèn)的翻轉(zhuǎn)率時(shí),我們就用到了標(biāo)記頻率,如下圖所示:

單元A的輸入端口標(biāo)記了特定翻轉(zhuǎn)率,比如說0.04GHz。標(biāo)記的翻轉(zhuǎn)率比傳播的翻轉(zhuǎn)率優(yōu)先級(jí)更高,被標(biāo)記翻轉(zhuǎn)率的節(jié)點(diǎn)將作為一個(gè)新的起點(diǎn),這就不屬于起點(diǎn)的定義,但還是叫它為起點(diǎn)的原因。標(biāo)記翻轉(zhuǎn)率之后,這個(gè)單元后續(xù)的節(jié)點(diǎn)的翻轉(zhuǎn)率將通過這個(gè)新標(biāo)記的翻轉(zhuǎn)率傳播得到。

  設(shè)置標(biāo)記翻轉(zhuǎn)率(簡(jiǎn)稱設(shè)置翻轉(zhuǎn)率)的命令主要有兩條:

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

set_switching_activity:設(shè)置某個(gè)節(jié)點(diǎn)的翻轉(zhuǎn)率和靜態(tài)概率,在使用無(wú)向量分析法估算功耗的時(shí)候,這個(gè)命令被廣泛使用,越多的節(jié)點(diǎn)上被標(biāo)記翻轉(zhuǎn)率,估算功耗的精度就越高。命令和選項(xiàng)如下所示:

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]

下面來簡(jiǎn)單介紹一下常用的幾個(gè)選項(xiàng),詳細(xì)的介紹可以通過man set_switching_activity獲取。

  -static_probability?:設(shè)置靜態(tài)概率。

  -period?? ?period_value | -base_clock clock:設(shè)置時(shí)鐘(周期),-period和 -base_clock只能設(shè)置其中一個(gè)。

  -toggle_rate:設(shè)置翻轉(zhuǎn)值,與-period或者 -base_clock相關(guān)聯(lián)。翻轉(zhuǎn)率Tr等于:用-base_clock選項(xiàng)指定的時(shí)鐘周期里面的翻轉(zhuǎn)數(shù)目 ?或 用-period選項(xiàng)指定的時(shí)間段里的翻轉(zhuǎn)數(shù)目;當(dāng)沒有這個(gè)設(shè)置兩個(gè)選項(xiàng)時(shí),將使用工藝庫(kù)里面的時(shí)間單位,即翻轉(zhuǎn)率等于在每個(gè)庫(kù)單位時(shí)間內(nèi)的翻轉(zhuǎn)數(shù)目。

下面來舉例說明這個(gè)命令的用法:

例一:

create_clock CLK -period 20

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

上述命令設(shè)置了時(shí)鐘周期為20ns,然后命令使用的是-base_clock的選項(xiàng),所有輸入端的翻轉(zhuǎn)值為0.5,靜態(tài)概率為0.015,于是得到翻轉(zhuǎn)率Tr=0 .5/20=0.025 GHz


例二:

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

上述沒有創(chuàng)建時(shí)鐘,但是使用了period選項(xiàng),意思是1000個(gè)周期內(nèi)翻轉(zhuǎn)了25次,于是我們就可以得到所以輸入的翻轉(zhuǎn)率Tr=25/1000=0. 025 GHz


例三:

set_switching_activity -toggle ?0.025 ?-static ?0.015 [all_inputs]

上述命令中,-period和 -base_clock這兩個(gè)選項(xiàng)都沒有使用,這個(gè)時(shí)候就跟工藝庫(kù)里面的時(shí)間單位有關(guān)了,若庫(kù)中時(shí)間單位為ns,那么我們就得到翻轉(zhuǎn)率Tr=0.025 /1 = 0.025 GHz


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

set_case_analysis用來指定一個(gè)靜態(tài)邏輯值,也就是設(shè)置信號(hào)為常數(shù),不進(jìn)行翻轉(zhuǎn);設(shè)計(jì)里面的一些信號(hào)需要這樣子設(shè)計(jì),例如復(fù)位信號(hào),設(shè)置如下所示:

set_case_analysis ?1 ?[get_ports reset]

則設(shè)置了reset的值常為1.

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

  上面我們講解了設(shè)置翻轉(zhuǎn)率的方法,下面舉例說明一下如何綜合使用這兩種翻轉(zhuǎn)率。例如對(duì)于下面的設(shè)計(jì):

翻轉(zhuǎn)率的設(shè)置要求如下所示:

  1.正確地定義時(shí)鐘;

  2.使用set_case_analysis命令設(shè)置常數(shù)控制信號(hào)reset;

  3.在傳輸起點(diǎn)設(shè)置翻轉(zhuǎn)率,在輸入端和黑盒子輸出端設(shè)置任何已知的翻轉(zhuǎn)率,其他的起點(diǎn)將使用默認(rèn)的翻轉(zhuǎn)率。

  4.讓工具在設(shè)計(jì)中把翻轉(zhuǎn)率傳播下去

上面的沒有要求具體的翻轉(zhuǎn)率,因此我們可以設(shè)置我們想要的翻轉(zhuǎn)率,根據(jù)上面的要求,我們編寫相應(yīng)的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

上面的腳本中,設(shè)置了周期為4(ns)的時(shí)鐘,然后利用set_case_analysis命令,設(shè)置reset端口為常數(shù);翻轉(zhuǎn)值為0.003,那么對(duì)應(yīng)的翻轉(zhuǎn)率為0.003/4ns,這個(gè)是默認(rèn)的翻轉(zhuǎn)率;然后利用set_switching_activity命令指定a、b、x的翻轉(zhuǎn)值,其翻轉(zhuǎn)率為 翻轉(zhuǎn)值/4ns。

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

前面介紹了無(wú)向量分析法進(jìn)行功耗分析,在介紹一下使用SAIF文件的方法進(jìn)行功耗分析之前,我們先來介紹一下綜合不變物體綜合變化物體的概念,下圖為一個(gè)電路的RTL設(shè)計(jì)和門級(jí)設(shè)計(jì):


根據(jù)定義,在綜合前和綜合后,設(shè)計(jì)中的寄存器數(shù)目和寄存器的結(jié)構(gòu)是不變的,輸入/輸出端口層次邊界是不變的,設(shè)計(jì)中的黑盒子是不變的。這些不變的物體稱為綜合不變物體(Synthesis Invariant Objects,有時(shí)候也叫綜合不變對(duì)象)。設(shè)計(jì)中大部分的組合電路生成與設(shè)計(jì)約束有很大的關(guān)系,不同的約束產(chǎn)生不同的組合電路。這些變化的物體稱為綜合變化的物體(Synthesis Variant Objects)。由于SAIF文件中涉及這兩個(gè)概念,這里先進(jìn)行介紹。

介紹完這兩個(gè)概念之后,下面我們就來了解一下使用SAIF進(jìn)行功耗分析。SAIF文件當(dāng)做翻轉(zhuǎn)率輸入文件的方法有兩種方式,也就是說利用SAIF進(jìn)行功耗分析有兩種方法——對(duì)RTL級(jí)的電路仿真后得到的SAIF文件(稱為RTL backward SAIF)以及對(duì)門級(jí)網(wǎng)表的電路仿真后得到的文件(稱為Gate backward SAIF)。下面逐個(gè)進(jìn)行具體介紹。


  (3)SAIF--RTL BACK分析法

RTLbackwardSAIF文件是通過對(duì)RTL代碼進(jìn)行仿真得到的,當(dāng)設(shè)計(jì)很大的時(shí)候,門級(jí)仿真時(shí)間就會(huì)很長(zhǎng),這時(shí)候就可以使用這種方法進(jìn)行分析。使用這種方法進(jìn)行分析功耗的速度比較快,但是進(jìn)度不夠門級(jí)仿真SAIF文件的高。

①RTL?forward?SAIF文件

RTL?forwardSAIF文件是記錄RTL設(shè)計(jì)中綜合不變物體的開關(guān)行為文件,可以簡(jiǎn)單地理解:RTL?forwardSAIF文件簡(jiǎn)要地記錄了綜合不變物的翻轉(zhuǎn)率。RTLbackwardSAIF文件的產(chǎn)生需要RTL?forwardSAIF文件,因此我們首先需要產(chǎn)生RTL forward ?SAIF文件。產(chǎn)生RTL ?forward ?SAIF文件的流程如下:

  RTL ?forward ?SAIF文件是由power compiler (包含在design compiler中)產(chǎn)生的,根據(jù)流程,我們知道,主要設(shè)置一些變量,然后讀入RTL設(shè)計(jì)(RTL.v設(shè)計(jì)),接著讀出SAIF文件就可以了。相應(yīng)的腳本如下所示:

set ?power_preserve_rtl-hier_names ?true

    read_verilog ??"sub.v top. v"

    rtl2saif ?-output ?fwd_ rtl.saif

一個(gè)示例RTL ?forward ?SAIF文件里面的部分內(nèi)容如下所示:

(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\)

??······

我們可以看到,文件里面包含設(shè)計(jì)中一系列綜合不變的物體。在后續(xù)仿真中,仿真器只監(jiān)視這些物體的開關(guān)行為。


②RTL?backward?SAIF文件的產(chǎn)生

下面是產(chǎn)生RTL backward SAIF文件的流程:


從上圖中,我們知道,產(chǎn)生RTL backward SAIF文件,需要在仿真器輸入testbench測(cè)試平臺(tái)文件、RTL.v設(shè)計(jì)、RTL forward SAIF文件,然后使用VCS產(chǎn)生RTL forward SAIF文件時(shí),需要在testbench調(diào)用PLI監(jiān)測(cè)節(jié)點(diǎn)的翻轉(zhuǎn)率。下面我們就來介紹一下這幾個(gè)部分。

·首先是PLI。使用VCS產(chǎn)生SAIF文件,需要用到程序設(shè)計(jì)語(yǔ)言接口(programming?language interface,PLI)。通過PLI監(jiān)測(cè)節(jié)點(diǎn)的翻轉(zhuǎn),得到節(jié)點(diǎn)的翻轉(zhuǎn)率。主要需要下面的系統(tǒng)任務(wù):

  $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就是設(shè)計(jì)源文件了,然后RTL forward SAIF文件在前面也講過了,這里就從略。

  · 最后是testbench。testbench中調(diào)用RTL設(shè)計(jì)、調(diào)用一下上述的PLI系統(tǒng)函數(shù)、調(diào)用RTL forward SAIF文件等。一個(gè)簡(jiǎn)單的示例testbench文件如下所示:

module ?testbench;

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

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

上面的測(cè)試平臺(tái)中,用了系統(tǒng)任務(wù)程序$read_rtl_saif ("myrtl. saif"),該命令讀入綜合不變物體文件——RTL?forwardSAIF。因此,仿真時(shí),仿真器僅僅監(jiān)視這些綜合不變物體的開關(guān)行為。向量中$set_toggle_region (u1)命令選擇要監(jiān)視的模塊。$toggle_start$toggle_stop命令用于控制監(jiān)視的起始和終止時(shí)間。$toggle_report("rtl. saif",1. 0e-9,"top")命令輸出SAIF信息到指定的文件。

  一起都準(zhǔn)備就緒了,下面就可以使用VCS運(yùn)行仿真:

vcs ?-R ??rtl. v ?testbench. v

注意,這里我們進(jìn)行的是RTL設(shè)計(jì)文件的仿真,仿真完成后,就可以得到rtl.saif文件,這個(gè)文件就是RTLbackwardSAIF文件。


③功耗的分析

  對(duì)RTL代碼仿真后,所得到的RTL Backward SAIF文件包含了設(shè)計(jì)中綜合不變物體的開關(guān)行為信息。進(jìn)行功耗分析時(shí),分析工具通過其內(nèi)部仿真器把綜合不變物體的翻轉(zhuǎn)率傳播下去,從而得到其他所有節(jié)點(diǎn)的翻轉(zhuǎn)率,進(jìn)行門級(jí)電路的功耗分析。得到了RTL backward SAIF文件之后,我們根據(jù)前面的功耗分析的流程(從輸入輸出關(guān)系看),就可以分析功耗了:

這里的開關(guān)活動(dòng)文件就是RTL backward SAIF文件了。然后在power compiler中利用RTL backward SAIF文件進(jìn)行功耗分析的流程如下所示:

一個(gè)相應(yīng)的示例腳本如下所示:

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文件分析功耗的過程就是上面這個(gè)樣子了。上面的流程和腳本適用于前版圖(pre-layout)的設(shè)計(jì),沒有用到寄生參數(shù)文件。連線的RC參數(shù)使用工藝庫(kù)里的線負(fù)載模型。如果是后版圖(post-layout)的設(shè)計(jì),要盡量使用寄生參數(shù)文件,提高功耗分析的精確度。

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

power compiler 產(chǎn)生 RTL forward SAIF文件 ——》VCS仿真產(chǎn)生RTL ?backward SAIF文件 ——》power compiler 進(jìn)行分析功耗。


  (4)SAIF--GATE分析法

  前面介紹了RTL backward SAIF文件分析功耗的方法和流程,下面介紹一下Gate backward SAIF文件分析功耗的方法和流程,這個(gè)與RTL backward SAIF文件的很類似。

①library ?forward ?SAIF 文件(簡(jiǎn)稱為 庫(kù)SAIF文件)

  庫(kù)SAIF文件是包含SDPD(電路狀態(tài)路徑)信息的SAIF文件。Gate backward SAIF文件的生成需要庫(kù)SAIF文件,該文件可以通過power compiler生成,流程如下所示:


對(duì)應(yīng)該流程的一個(gè)示例腳本如下所示:

 read_db ?mylib.db

    lib2saif ?-output ?mylib. saif ?-lib_pathname ??mylib.db

示例庫(kù)SAIF文件的部分內(nèi)容如下所示:

(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)

????????)

······

庫(kù)SAIF文件中包含了SDPD信息。有了庫(kù)SAIF文件,仿真時(shí),仿真器會(huì)根據(jù)庫(kù)中的SDPD信息,監(jiān)視節(jié)點(diǎn)的開關(guān)行為。


②Gate Backward SAIF文件的生成

下面是產(chǎn)生gate backward SAIF文件的流程:

從上圖中我們可以看到,產(chǎn)生gate backward SAIF需要testbench測(cè)試平臺(tái)、門級(jí)網(wǎng)表、標(biāo)準(zhǔn)延時(shí)格式(standard delay format)文件SDF、庫(kù)SAIF文件。其中SDF文件反標(biāo)了門級(jí)網(wǎng)表中的RC延時(shí)參數(shù)等,可以更為準(zhǔn)確地得到線網(wǎng)的延時(shí)。

testbench的示例內(nèi)容如下所示:

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測(cè)試平臺(tái)主要是調(diào)用門級(jí)網(wǎng)表、SDF文件、庫(kù)SAIF文件。testbench中,用$sdf_annotate("my. sdf", dut)命令作SDF標(biāo)記,以保證時(shí)序的正確性,從而得到正確的翻轉(zhuǎn)數(shù)目。$ read_lib_saif ("mylib. saif")命令讀取庫(kù)SAIF文件中的SDPD信息。仿真器只監(jiān)視在SAIF文件里列出的SDPD開關(guān)行為。$ set_toggle_region (u1)命令選擇要監(jiān)視的模塊。$ toggle_start$toggle_stop命令控制開始和結(jié)束時(shí)間。$ toggle_report("gate. saif",1. 0e-9, "top")命令把SAIF輸出到指定的文件。

    萬(wàn)事俱備,只欠仿真,接下來就是使用VCS進(jìn)行仿真了:

   vcs ??-R ??top.v ??testbench. v

注意,這里的仿真是對(duì)門級(jí)網(wǎng)表的仿真,也就是說這里的top.v是門級(jí)網(wǎng)表。產(chǎn)生的示例gate forward SAIF文件的部分內(nèi)容如下所示:

(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文件是通過對(duì)門級(jí)網(wǎng)表進(jìn)行仿真所得到的。如果設(shè)計(jì)很大,仿真需要的時(shí)間很長(zhǎng)。好處是精確度很高。VCS所產(chǎn)生的Gate Backward SAIF文件中包含了一些或所有連線的開關(guān)行為和單元的開關(guān)行為。這些開關(guān)行為分別以上升和下降表示,與狀態(tài)和路徑有關(guān)。用這個(gè)信息可以進(jìn)行精確的功耗分析。


③功耗分析

  有了門級(jí)網(wǎng)表、gate backward SAIF文件和SDF文件,就可以在power ?compiler中進(jìn)行功耗分析了,分析功耗的流程圖如下所示:

對(duì)應(yīng)的一個(gè)示例腳本文件如下所示:

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)的設(shè)計(jì),spef文件在做完版圖后產(chǎn)生。使用寄生參數(shù)文件,提高了功耗分析的精確度。如果是前版圖( pre-layout)的設(shè)計(jì),沒有寄生參數(shù)文件,連線的RC參數(shù)使用工藝庫(kù)里的線負(fù)載模型。

最后總結(jié)一下,這里分析功耗流程為:

power compiler 產(chǎn)生庫(kù)SAIF文件——》VCS產(chǎn)生gate backward SAIF文件——》power compiler進(jìn)行功耗分析。



  (5)VCD轉(zhuǎn)SAIF分析法

前介紹了使用SAIF文件分析功耗的方法,這個(gè)方法都是通過VCS仿真得到相應(yīng)的SAIF文件,然后進(jìn)行功耗分析。下面我們介紹使用VCD文件轉(zhuǎn)換成SAIF文件的方法,然后進(jìn)行功耗分析。

①VCD文件的產(chǎn)生

首先,我們?cè)谶M(jìn)行仿真的時(shí)候,需要通過在testbench中加入相關(guān)的系統(tǒng)函數(shù),產(chǎn)生相應(yīng)的VCD文件(和SDF文件),流程示意圖如下所示:

相應(yīng)的一個(gè)示例testbench如下所示:

module testbench;

······

initial

??$sdf_annotate("my.sdf",dut)

initial begin

??$dumpfile("vcd.dump");

??$dumpvars;

······

endmodule

然后使用下面命令進(jìn)行仿真:

 vcs ?-R dut.v ?testbench.v ?+delay_mode_path

完成仿真之后,就可以得到VCD文件了。


②VCD文件轉(zhuǎn)換成SAIF文件

仿真時(shí)產(chǎn)生的VCD文件也包含了設(shè)計(jì)中節(jié)點(diǎn)和連線的開關(guān)行為。在Power Compiler中,可以使用程序vcd2saif可以把VCD文件轉(zhuǎn)化為SAIF文件,如下圖所示:


vcd2saif是在UNIX命令行使用的一個(gè)程序。vcd2saif程序也可以把VPD文件(二進(jìn)制格式的VCD文件)轉(zhuǎn)化為SAIF格式的文件。如果設(shè)計(jì)很大,仿真的時(shí)間長(zhǎng),vcd2saif程序可以用管道傳遞的方式把VCD轉(zhuǎn)化為SAIF文件。這時(shí)vcd文件不存放在文件里,vcd通過先入先出(First-In ?First-()nt,簡(jiǎn)稱FIFO把數(shù)據(jù)傳給vcd2saif程序,然后產(chǎn)生SAIF文件。轉(zhuǎn)換的SAIF文件里沒有SDPD的信息。如下圖所示:

有了SAIF文件之后,我們就可以像前面那樣使用SAIF文件進(jìn)行功耗分析了,至于是版圖前的功耗分析還是版圖后的功耗分析,取決于功耗分析時(shí)有沒有與版圖中有關(guān)的信息,比如是SPEF文件。因此流程為:

VCS產(chǎn)生VCD文件——》power compiler 將VCD文件轉(zhuǎn)換為SAIF文件——》power compiler 進(jìn)行分析功耗

最后,我們來說一下這里使用vcd2saif程序的好處,主要有下面三點(diǎn):

  1. ?VCD產(chǎn)生的速度快;

  2. ?VCD是IEEE的標(biāo)準(zhǔn)并且適用于進(jìn)行后仿真;

  3. ?轉(zhuǎn)換的過程快。

?=============================================================================================

我們已經(jīng)介紹四種為設(shè)計(jì)產(chǎn)生開關(guān)行為的方法,分別是直接設(shè)置翻轉(zhuǎn)率、RTL backward SAIF文件、gate back SAIF文件和VCD轉(zhuǎn)SAIF文件;這些方法可以混合使用,其優(yōu)先次序如下所示:


用read_ saif命令標(biāo)記的開關(guān)行為優(yōu)先級(jí)最高;用set_switching_activity命令設(shè)置的開關(guān)行為優(yōu)先級(jí)次之;優(yōu)先級(jí)最低的是用默認(rèn)的變量power_default_toggle_rate指定的翻轉(zhuǎn)率。

開關(guān)行為可以被清除,使用“reset_switching_activity”命令可以清除所有被標(biāo)記的翻轉(zhuǎn)率和通過傳輸?shù)玫降姆D(zhuǎn)率。用report_saif可以顯示讀入saif文件后設(shè)計(jì)中的開關(guān)行為信息。一個(gè)完整的SAIF文件,"user annotated”應(yīng)該是100%。如果SAIF不完整,那么默認(rèn)的翻轉(zhuǎn)率將附加到輸入端和黑盒子的輸出端。翻轉(zhuǎn)率通過零延遲仿真?zhèn)鬏斚氯ィ@樣就可以計(jì)算出設(shè)計(jì)的功耗。

  使用report_saif命令的一個(gè)例子如下:


與開關(guān)行為有關(guān)的命令有:

merge_saif #合并SAIF文件

read_sai f #讀backward SAIF文件

report_saif #報(bào)告開關(guān)行為的信息

rtl2saif #產(chǎn)生RTL forward SAIF文件

write_ saif #寫出一個(gè)backward SAIF文件

lib2saif #產(chǎn)生library forward SAIF文件

propagate_switching_activity #傳輸功耗清除

reset_switching_activity #清除開關(guān)行為和/或翻轉(zhuǎn)率

set_switching_activity #在指定的物體上設(shè)置開關(guān)行為




  (6)功耗分析報(bào)告

我們是通過分析功耗報(bào)告(report_power命令產(chǎn)生)來查看設(shè)計(jì)功耗的,一個(gè)功耗報(bào)告的示例部分內(nèi)容如下所示:

    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

其中第一項(xiàng)為內(nèi)部短路功耗,第二項(xiàng)為開關(guān)功耗,合起來為動(dòng)態(tài)功耗;最后一項(xiàng)為靜態(tài)功耗,也就是泄漏功耗。如果要報(bào)告設(shè)計(jì)中每個(gè)模塊和單元的功耗,在report_power命令后加選項(xiàng) -hier,例如: ?report_power ?-hier,產(chǎn)生的報(bào)告如下所示:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,615評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評(píng)論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,826評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,227評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,447評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,992評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,807評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,001評(píng)論 1 370
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評(píng)論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,243評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評(píng)論 1 287
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,709評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,996評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容