PrimeTime 時序分析流程和方法(ZZ)


PrimeTime是Synopsys的一個單點的全芯片、門級靜態時序分析器。它能分析大規模、同步、數字ASICS的時序。PrimeTime工作在設計的門級層次,並且和Synopsys其它工具整合得很緊密。
  基本特點和功能:
  時序檢查方面:
建立和保持時序的檢查(Setup and hold checks)
重新覆蓋和去除檢查(Recovery and removal checks)
時鍾脈沖寬度檢查(Clock pulse width checks)
時鍾門鎖檢查(Clock-gating checks)
  設計檢查方面:
沒有時鍾端的寄存器
沒有時序約束的結束點(endpoint)
主從時鍾分離(Master-slave clock separation)
有多哥時鍾的寄存器
對層次敏感的時鍾(Level-sensitive clocking)
組合電路的反饋環(Combinational feedback loops)
設計規則檢查,包括最大電容(maximum capacitance)、最大傳輸時間(maximum transition)和最大扇出(maximum fanout)

PrimeTime 時序分析流程和方法
在時序分析之前需要做的步驟:
1、   建立設計環境
-   建立搜索路徑(search path)和鏈接路徑(link path)
-   讀入設計和庫
-   鏈接頂層設計
-   建立運作條件、連線負載模型、端口負載、驅動和傳輸時間
2、   說明時序聲明(約束)
-   定義時鍾周期、波形、不確定性(uncertainty)和滯后時間(latency)
-   說明輸入、輸出端口的延時
3、   說明時序例外情況(timing exceptions)
-   多周期路徑(multicycle paths)
-   不合法路徑(false paths)
-   說明最大和最小延時、路徑分割(path segmentation)和失效弧(disabled arcs)
4、   進行分析和生成報告
-   檢查時序
-   生成約束報告
-   生成路徑時序報告

開始
先建立目錄並將PrimeTime本身所帶的一個例子拷到新建的目錄下,在下面的內容中將要用到這個例子。
mkdir primetime
cd primetime
cp –r $SYNOPSYS/doc/pt/tutorial .
cd tutorial
確認目錄中有以下這些文件:
AM2910.db             The design .db for the top-level of the design
CONTROL.db           The design .db for the CONTROL block
REGCNT.db             The design .db for the REGCNT block
UPC.db               The design .db for the UPC block
Y.data               The Stamp data file for the Y block
Y.mod               The Stamp model file for the Y block
Y_lib.db               The library .db for the Y block
STACK_lib.db           The library .db for the STACK block
pt_lib.db               The technology library .db
stack.qtm.pt             The quick timing model script for the stack block
optimize.dcsh           The dc_shell optimization script
timing.dcsh             An example DC shell timing script for translation
tutorial.pt               The complete PrimeTime tutorial script for your
reference.

例子是一個AM2910微處理器,如圖所示模塊圖。


運行PrimeTime
pt_shell

定義搜索路徑和鏈接路徑:
pt_shell>set search_path “.”
Pt_shell>set link_path “* pt_lib.db STACK_lib.db Y_lib.db”
* pt_lib.db STACK_lib.db Y_lib.db

  讀入設計:
PrimeTime支持以下設計格式:
. Synopsys database files (.db) (Use the read_db command)
. Verilog netlist files (Use the read_verilog command)
. Electronic Design Interchange Format (EDIF) netlist files (Use the read_edif command.)
. VHDL netlist files (Use the read_vhdl command.)
讀入AM2910的頂層設計文件:
pt_shell> read_db AM2910.db
Loading db file '/u/joe/primetime/tutorial/AM2910.db'
1

鏈接設計:
pt_shell> link_design AM2910
Loading db file '/u/joe/primetime/tutorial/pt_lib.db'
Loading db file '/u/joe/primetime/tutorial/STACK_lib.db'
Loading db file '/u/joe/primetime/tutorial/Y_lib.db'
Linking design AM2010 ...
Loading db file '/u/joe/primetime/tutorial/STACK.db'
...
Designs used to link AM2910:
CONTROL, REGCNT, STACK, UPC, Y
Libraries used to link AM2910:
STACK_lib, Y_lib, pt_lib
Design 'AM2910' was successfully linked


顯示當前已載入的設計:
pt_shell>list_designs
得到當前載入單元的信息:
pt_shell>report_cell

編譯一個標記模型(Stamp Model):
標記模型是一個諸如像DSP或RAMS那樣復雜模塊的靜態時序模型。
標記模型與.lib模型共存,而不能代替它們。
-   建立標記模型是用在晶體管層次的設計上,在這個層次上沒有門級網表。
-   標記模型語言是一種源代碼語言,被編譯成Synopsys的.db文件格式,可以被PrimeTime或Design Compiler使用。
-   標記模型包含引腳到引腳的時序弧、建立和保持時間數據、模式信息、引腳的電容和驅動能力等等。標記模型還能保存屬性(面積等等)。
-   三態輸出、鎖存器和內部生成的時鍾都可以被建模。
一個標記模型包括兩種源代碼文件格式:
-   .mod文件
僅包含引腳到引腳的弧的描述(沒有延時數據)。
-   .data文件
包含.mod文件中每條弧的延時數據。
標記模型可以有多個.data文件來描述不同運作條件下的時序。
兩種文件格式都需要編譯成一個.db模型。

編譯AM2910中Y模塊的標記模型(標記源代碼文件是Y.mod和Y.data):
pt_shell> compile_stamp_model -model_file Y.mod \
-data_file Y.data -output Y
Wrote model library core to ‘./Y_lib.db’
Wrote model to ‘./Y.db’
PrimeTime生成兩個.db文件:
Y_lib.db:一個庫文件,包含一個單元(cell)。這個單元叫做核(core)。
Y.db:一個設計文件,引用Y_lib.db中的單元核。


編譯一個快速時序模型(Quick Timing Model):
可以為設計中還沒有完成的模塊建立一個快速時序模型,以使得完整的時序分析能夠進行。通常的情形是:
-   模塊的HDL代碼還沒有完成時
-   為了划分設計,在評估階段為實際設計進行時序預測、約束估計時
-   模塊的標記模型還沒有完成時
一個快速時序模型是一組PrimeTime命令,而不是一種語言。為了方便和文檔化可以將它們寫在一個腳本文件中,然后保存為.db的格式。在PrimeTime和Design Compile中快速時序模型很有用處。
還可以將快速時序模型保存為標記模型,這是開始一個復雜標記模型的一種便利的方法。
例子中STACK模塊的快速時序模型腳本文件是stack.qtm.pt,建立這個模型:
pt_shell> source -echo stack.qtm.pt
...
pt_shell> report_qtm_model;
...
pt_shell> save_qtm_model -output STACK -format db
Wrote model library core to './STACK_lib.db'
Wrote model to './STACK.db'


進行時序分析
配置運作環境

讀入並鏈接AM2910設計
pt_shell> set search_path "."
pt_shell> set link_path "* pt_lib.db STACK_lib.db Y_lib.db"
pt_shell> read_db AM2910.db
pt_shell> link_design AM2910
鏈 接了AM2910會導致其它已經鏈接的設計變為不鏈接的狀態。在內存里只允許有一個鏈接的設計。當一個設計不鏈接,所有時序信息將被去除,並會出現警告, 這和Design Compiler不同。如果需要保存所標注的信息,可以在鏈接一個新的設計之前用write_script命令。如果以后重新鏈接這個設計,只要運行這個 腳本就可以了。

建立運作條件和連線負載模型
PrimeTime在生成建立時序報告(setup timing reports)時使用最大(Maximum)運作條件和連線負載模型;在生成保持時序報告(hold timing reports)時使用最小(Minimum)運作條件和連線負載模型。
pt_shell> set_operating_conditions -library pt_lib -min BCCOM -max WCCOM
pt_shell> set_wire_load_mode top
pt_shell> set_wire_load_model -library pt_lib -name 05x05 -min
pt_shell> set_wire_load_model -library pt_lib -name 20x20 –max
如果運作條件在兩個不同的庫中,用set_min_library命令來在最大庫和最小庫中建立聯系。
得到一張庫的列表:
pt_shell> list_libraries
Library Registry:
STACK_lib /home/gray/primetime/tutorial/
STACK_lib.db:STACK_lib
Y_lib /home/gray/primetime/tutorial/Y_lib.db:Y_lib
* pt_lib /home/gray/primetime/tutorial/
pt_lib.db:pt_lib
得到一個庫的詳細信息:
pt_shell>report_lib pt_lib

基本聲明
  pt_shell> create_clock -period 30 [get_ports CLOCK]
pt_shell> set clock [get_clock CLOCK]
pt_shell> set_clock_uncertainty 0.5 $clock
pt_shell> set_clock_latency -min 3.5 $clock
pt_shell> set_clock_latency -max 5.5 $clock
pt_shell> set_clock_transition -min 0.25 $clock
pt_shell> set_clock_transition -max 0.3 $clock

時鍾門鎖檢查(Clock-Gating Checks):
  pt_shell> set_clock_gating_check -setup 0.5 -hold 0.1 $clock
pt_shell> set_min_pulse_width 2.0 $clock
如果設計被反標過,PrimeTime用SDF的建立和保持時間值,以及時鍾脈沖寬度說明。

得到一個時序摘要:
pt_shell>report_design

pt_shell>report_reference


檢查時序聲明和設計的結構
在進行時序分析之前運行check_timing命令是關鍵。這個命令能夠檢查到所有可能的時序問題。
在這個例子中將會出現警告,原因是存在沒有約束條件的端口。


運行時序分析

設置端口延時並檢查時序:
pt_shell> set_input_delay 0.0 [all_inputs] -clock $clock
pt_shell> set_output_delay 2.0 [get_port INTERRUPT_DRIVER_ENABLE] -clock $clock
pt_shell> set_output_delay 1.25 [get_port MAPPING_ROM_ENABLE] -clock $clock
pt_shell> set_output_delay 0.5 [get_port OVERFLOW] -clock $clock
pt_shell> set_output_delay 1.0 [get_port PIPELINE_ENABLE] -clock $clock
pt_shell> set_output_delay 1.0 [get_port Y_OUTPUT] -clock $clock
pt_shell> set_driving_cell -lib_cell IV -library pt_lib [all_inputs]
pt_shell> set_capacitance 0.5 [all_outputs]
pt_shell> check_timing

保存設置:
將所設置的時序信息保存為腳本文件可以確保在接下去的運行中保留一個時序環境的復本。使用write_script命令,這個命令將以下這些信息保存到一個命令文件中:
Clocks             Names, waveforms, latency, and uncertainty
Exceptions         False and multicycle paths, minimum and maximum
delays, and path groups
Delays           Input and output delays, all delay annotations, and
timing checks
Net and port attributes   Capacitance, resistance, and fanout
Design environment   Wire load model, operation condition, drive, driving cell,
and transition
Design rules         Minimum and maximum capacitance, minimum and
maximum fanout, and minimum and maximum transition
write_script命令可以將腳本寫成Design Compiler格式(dcsh or dctcl mode)或者PrimeTime格式(ptsh)。
不能用PrimeTime寫一個被標注設計的.db文件,因為PrimeTime只能寫時序模型的.db文件。以腳本為主要方式是為了和Design Compiler傳遞數據。
pt_shell> write_script -format dctcl -output AM2910.tcl
pt_shell> write_script -format dcsh -output AM2910.dcsh
pt_shell> write_script -format ptsh -output AM2910.pt

運行基本的分析
1.   得到AM2910的約束報告:
pt_shell>report_constraint
2. 檢查報告中的時序違規(timing violations)和約束違規(constraints violations)
3.   到更多關於違規的信息:
pt_shell> report_constraint -all_violators
4.   檢查這份報告:
這里有多少違規的結束點(endpoints)?

報告基於路徑的時序信息:
pt_shell>report_timing

設置時序例外情況:
因為PrimeTime直到進行完整的時序升級(timing update)之前才檢查時序例外情況的正確性,所以要運行report_exceptions以確定它們的正確性。
聲明AM2910的時序例外情況。設置一條兩個時鍾周期的路徑,其中建立時間為2,保持時間為1:
pt_shell> set_false_path -from U3/OUTPUT_reg

  • /CP \
    -to U2/OUTPUT_reg
  • /D
    pt_shell> set_multicycle_path -setup 2 -from \
    INSTRUCTION
  • -to U2/OUTPUT_reg

  • pt_shell> set_multicycle_path -hold 1 -from \
    INSTRUCTION
  • -to U2/OUTPUT_reg

  • pt_shell> update_timing
    pt_shell> report_exceptions
    pt_shell> report_exceptions -ignored

    評估時序例外情況結果:
    1.   得到另外一個約束報告並評估違規情況:
    pt_shell>report_constraint –all_violators
    2.   檢查這份約束報告
    3.   確信所設置的例外情況是否能夠使得設計中的違規顯現比以前更少。設計中最差余量(the worst slack)是什么?
    pt_shell>report_timing
    4. 檢查這份詳細的時序報告。
    5. 看其它的違規路徑。從這份約束報告中選擇一個結束點,並鍵入:
        pt_shell> report_timing -to endpoint
    6. 檢查這份報告。

    提取一個子設計的邊界時序特性信息:
    一個子設計的相關時序特性信息的提取是基於它相關的上級設計環境。這些信息有
    兩個主要用途:
    一個主要用途是PrimeTime將這些相關特性信息提供給Design Compiler作為約束信息。這是DC中從芯片級分析到模塊級優化主要的紐帶,與只是作分析的單點工具相比提供了更佳的整合性。
    提取了相關特性信息之后,命令PrimeTime寫一個包含子設計或模塊時序信息的腳本。
    在提取時序特性的同時,要注意:
    1.   特性信息提取不能夠預計子設計的時序狀況;
    2.   特性信息提取沒有最大或最小這兩種工作模式。所以在做這步工作之前要設置單一的、正確的運作條件。
    對於PrimeTime而言,相關時序信息允許作層次化的時序分析,並觀察芯片層次的
    時序約束;對於Design Compiler而言,相關時序信息允許在綜合或邏輯優化時設置時序約束。
    在Design Compiler中設置綜合或優化約束的步驟是:
    1.   在PrimeTime中讀入頂層設計
    2.   確認需要優化的子設計
    3.   提取每一個子設計的特性信息
    4.   為每一個子設計生成一個Design Compiler的腳本
    5.   將這些子設計讀到Design Compiler中
    6.   將步驟4中生成的腳本引入進來
    7.   進行模塊級的優化
    僅將需要優化的子設計讀入到DC中去,這樣DC運行起來可以效率高一些。優化完這
    些模塊之后,再將它們讀入到PrimeTime中去作新一輪的時序分析。
    在這個例子中,從時序報告中可以看出模塊U3(REGCNT)和U2(UPC)可以進一步優化,也許能消除一些違規情況。
    因為要糾正建立時序違規,所以要配置最差情況的運行條件。
    pt_shell> set_operating_conditions -library pt_lib WCCOM
    pt_shell> characterize_context {U2 U3}
    pt_shell> write_context U2 -output UPC.char.dcsh \
    -format dcsh
    pt_shell> write_context U3 -output REGCNT.char.dcsh \
    -format dcsh
    pt_shell> write_script -format ptsh -output AM2910.new.pt

      % dc_shell
    dc_shell> include optimize.dcsh
    ...
    dc_shell> quit

    pt_shell> read_db {REGCNT.opt.db UPC.opt.db}
    pt_shell> current_design AM2910
    pt_shell> swap_cell U3 {REGCNT.opt.db:REGCNT}
    pt_shell> swap_cell U2 {UPC.opt.db:UPC}
    pt_shell> source AM2910.new.pt
    pt_shell> check_timing
    pt_shell> report_constraint -all_violators
    pt_shell> report_constraint -all_violators –verbose
    看新生成的報告,違規情況是不是比原來少了?

            高級分析
    情形分析(Case Analysis):
    PrimeTime允許將設計中的端口設置成邏輯1或邏輯0,並使其像實際中那樣生效,恰當地使時序弧有效或無效。這叫做情形分析(case analysis)或常量傳播(constant propagation)。
    情形分析能沿着電路正向地使所指定的邏輯常量生效,但是逆向不行。PrimeTime可以這樣做是因為它知道門的邏輯功能。PrimeTime不能使邏輯常量通過RAMs或其他黑箱單元傳播。黑箱單元是沒有定義功能的單元。
    可以使用標記時序模型有條件地定義被情形分析影響到的時序弧。使用情形分析,可以在不同的條件下進行時序分析,例如,測試模式的開或關。
    PrimeTime自動使一直高或一直低的信號生效。如圖所示使用情形分析時的常量傳播。

    如果將Sel端口設置成邏輯0,PrimeTime只跟蹤INa到U3的路徑;
    如果將Sel端口設置成邏輯1,PrimeTime只跟蹤INb到U3的路徑;
    如果將U2的B引腳設置成邏輯0,PrimeTime將不跟蹤到U3/Ten的路徑。
    作為情形分析的范例,完成以下一些步驟:
    1.   在設計中的一個端口上設置一個情形分析邏輯常量,觀察時序弧受到的影響
    pt_shell> set_case_analysis 0 [get_ports CONDITION_CODE]
    pt_shell> report_case_analysis
    pt_shell> report_disable_timing
    report_disable_timing命令顯示所有因為情形分析而無效的時序弧。
    2.   看時序的改變
    pt_shell> report_constraint
    pt_shell> report_timing
    3.   檢查報告
    在這種情況下,將CONDITION_CODE端口設置成0改變了時序,所以關鍵路徑也不一樣了。
    4.   將CONDITION_CODE設置成1,觀察結果
    5.   去除剛才所設置的邏輯常量
    pt_shell> remove_case_analysis [get_ports CONDITION_CODE]

    模式分析(Mode Analysis):
    一些復雜的設計可能會有好多種功能模式,在每種模式種時序路徑和特性完全不同。
    在 PrimeTime中可以定義和說明這些模式的時序,然后再為每種模式分別進行分析。這樣做可以去除許多不合法的時序違規現象,因為那些路徑被設置成是無 效的。例如,一個RAM的寫地址和讀地址路徑是不同的。一個時序報告可能會顯示一條RAM的寫地址路徑,但是這條路徑只有在RAM工作在讀模式時才有效。
    有兩種方法定義模式:
    . 在標志模型中將模式和時序弧聯系起來
    . 為一條特殊的路徑定義一種模式
    在定義了模式之后,可以用一部分或所有定義的模式來進行時序分析。
    1.   AM2910的Y模塊有模式功能,因為在它的標記模型中已經定義了。在Y.mod文件中查看已定義的模式:
    pt_shell>report_mode
    2.   看設置了模式之后時序的改變:
        pt_shell> set_case_analysis 0 [get_pins U4/OPERATION
  • ]
    pt_shell> set_mode data U4/core
    pt_shell> report_mode
    pt_shell> report_timing -to Y_OUTPUT*
    pt_shell> set_mode stack U4/core
    pt_shell> report_mode
    pt_shell> report_timing -to Y_OUTPUT*
    3.   將所定義的模式復位:
    pt_shell>reset_mode

    報告合法路徑(True Paths):
    PrimeTime能夠自動探測到設計中存在的一些不合法路徑。這些路徑可能是功能不合法
    路徑或是延時不合法路徑。
    下圖所示一條功能不合法路徑,因為它永遠也不敏感(sensitize)。

    PrimeTime還可以用自動生成測試模式automatic test-pattern generation(ATPG)方法在需要測試的時序路徑上生成測試向量來進行分析。用戶不用自己去說明這些向量,PrimeTime會自動生成並使其生效。
    如果PrimeTime能夠生成一個向量,它會認為這條路徑是合法的,否則是不合法的。
    PrimeTime不能在包含有黑箱單元的部分使用合法路徑分析,因為它無法推算ATPG向量經過不知道功能的黑箱單元之后將是什么樣的輸出。
    report-timing 命令有三個選項可以用來作合法路徑報告:
    -justify
    對於所需分析的路徑,報告每一條是合法還是不合法。如果合法,PrimeTime顯示一條可以使其敏感的輸入向量。將這個選項用在違規路徑上查看潛在不合法違規。加上-nworst和-max_paths選項檢查多條路徑。
    -true
    啟用一種搜索算法尋找最長的合法路徑。使用這個選項在某些設計中會使CPU的運行時間延長。
    -false
    只報告不合法的路徑。
    僅在生成報告時使用合法路徑分析。它不是PrimeTime的一種時序模型。
    在例子中用合法路徑報告來驗證路徑:
    pt_shell> report_timing -true
    pt_shell> report_timing -justify -to MAPPING_ROM_ENABLE
    pt_shell> report_timing -false -max_paths 5

    提取一個時序模型:
    時序模型提取是從一個門級網表生成一個.db文件。PrimeTime和DC都能夠使用這種提取得到的.db文件。
    供應商(Vendors)用提取的方法提供時序模型。設計者可以用提取的方式生成一個完全與其他模塊不相關的時序模型(可以被多次引用)。
    提取是自動地從網表中提取時序模型並把信息保存為兩個.db文件,類似於編譯標記模型時的輸出。
    用這種方法提取一個時序模型:
    1.   讀入要提取的網表
    2.   定義時鍾
    3.   反標延時和電容(如果可行的話)
    4.   設置連線負載模型(如果可行的話)
    5.   去除內部的例外情況(這些不保存到模型中)
    6.   進行時序檢查並改正任何錯誤
    7.   設置提取時的環境變量
    8.   在所有需要的運作條件下提取模型
    9.   交換(Swap)提取的時序模型
    現在UPC設計已經優化了,提取它的一個時序模型,用到芯片級的時序分析中去。
    pt_shell> link_design UPC
    pt_shell> create_clock -period 30 [get_ports CLOCK]
    pt_shell> set_wire_load_model -name 20x20 -library pt_lib UPC
    pt_shell> check_timing; # Unconstrained outputs are OK
    pt_shell> set extract_model_tolerance 0.05
    pt_shell> set extract_model_transition_limit 5.0
    pt_shell> set extract_model_capacitance_limit 64
    pt_shell> set extract_model_min_resolution 0.1
    pt_shell> set extract_model_min_delay_threshold 0.5
    pt_shell> set extract_model_conservative true
    pt_shell> extract_model -operating_conditions {WCCOM NOM BCCOM} -output UPC.ext
    pt_shell> set link_path "$link_path UPC.extr_lib.db"
    pt_shell> read_db UPC.extr.db
    pt_shell> link_design AM2910
    pt_shell> swap_cell U2 {UPC.extr.db:UPC}
    pt_shell> source AM2910.new.pt
    pt_shell> report_cell; # Note UPC is now marked as a model
    pt_shell> report_constraint -all
    檢查結果。

    反標標准延時格式文件(SDF):
    PrimeTime支持以下版本的SDF文件:
    讀:1.0, 2.0, 2.1;
    寫:1.0, 2.1。
    當PrimeTime用SDF進行延時標注時,它假定與負載相關的延時部分被包含到單元延時中。如果SDF在連線延時中包含了負載相關延時,在read_sdf命令中用-load_delay net選項。
    寫一個AM2910的最大和最小延時SDF文件:
    pt_shell> set_operating_conditions -library pt_lib -min BCCOM -max WCCOM
    pt_shell> write_sdf -version 2.1 AM2910.sdf
    將這個SDF文件讀回PrimeTime中:
    pt_shell> read_sdf -min_max AM2910.sdf
    pt_shell> report_timing
    檢查報告。注意每一個反標延時都被標上了*號。

    讀寄生參數文件:
    PrimeTime支持以下幾種寄生參數文件:
    Reduced Standard Parasitic Format (RSPF)
    Detailed Standard Parasitic Format (DSPF)
    Standard Parasitic Exchange Format (SPEF)
    命令格式為:
    pt_shell> read_parasitics filename


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM