http://www.javashuo.com/article/p-oeabgmie-mw.htmlhtml
SAIF--RTL BACK分析法函數
RTL backward SAIF文件是經過對RTL代碼進行仿真獲得的,當設計很大的時候,門級仿真時間就會很長,這時候就能夠使用這種方法進行分析。使用這種方法進行分析功耗的速度比較快,可是進度不夠門級仿真SAIF文件的高。工具
①RTL forward SAIF文件post
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"3d
rtl2saif -output fwd_ rtl.saiform
一個示例RTL forward SAIF文件裏面的部份內容以下所示:htm
(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,產生的報告以下所示: