タイミング・アナライザーの例: クロック・サマリー失敗レポート

author-image

投稿者:

このページのスクリプトは、デザイン内にあるすべてのクロックのセットアップ、保留、リカバリー、および削除のタイミング分析を、サポート対象のあらゆる操作条件で実行します。このスクリプトは、タイミングが失敗したすべての分析に関する情報をリストにした表を作成します。スクリプトはこの表を、<revision>.failing_clock_domains と呼ばれるファイルに書き込みます。失敗した分析がない場合、スクリプトはこのファイルに、失敗した分析がないというメッセージを書き込みます。

スクリプトを使用して、デザインにおいて失敗したタイミング分析結果の、迅速でシンプルな概要を取得できます。スクリプトの保存先を、failing_clock_domains.tcl と呼ばれるファイルにした場合、これを実行するには以下のコマンドを使用します。

quartus_sta --report_script=failing_clock_domains.tcl <project name> [-c <revision name>]

こちらは、タイミングが失敗した分析がある場合に、スクリプトが生成する表の例です。この表には、ワーストケースのスラック、トータルネガティブスラック(TNS)、クロック名、失敗が発生した操作条件、および失敗した分析のタイプが含まれています。

クロックドメイン失敗タイミング

+--------+---------------+------------+-----------------------+-----------------+
; Slack  ; End Point TNS ; Clock      ; Operating conditions  ; Timing analysis ;
+--------+---------------+------------+-----------------------+-----------------+
; -0.113 ; -0.321        ; IF_RXCLK   ; Slow 1100mV 85C Model ; Setup           ;
; -0.098 ; -0.223        ; core_clk   ; Fast 1100mV 0C Model  ; Hold            ;
+--------+---------------+------------+-----------------------+-----------------+

スクリプトを使用するため、以下の TCL コードをコピーし張り付けてファイルに保存します。

# デザインにネガティブスラックのあるクロックドメインがあるかどうかをレポートします。
# ネガティブスラックのあるクロックドメインがある場合、その情報を
# 表にしてファイルに書き出します。
# 必要に応じてファイル名をここで変更します
set output_file_name [get_current_revision].failing_clock_domains

package require struct::matrix
package require report

# 失敗したパスに関する情報を保存するマトリクスを作成します
set failing_paths_matrix [::struct::matrix];
$failing_paths_matrix add columns 5

# あらゆる操作条件に対する分析が実行される必要があります
set all_operating_conditions_col [get_available_operating_conditions]

# 各クロックドメインについてこれらのタイプの分析を実行します。
set analysis_list [list "setup" "hold" "recovery" "removal"]

# あらゆる操作条件を検証します。
foreach_in_collection operating_conditions_obj $all_operating_conditions_col {

   # 操作条件を設定し、タイミング・ネットリストを更新します
   set_operating_conditions $operating_conditions_obj
   update_timing_netlist

   # 操作条件の英字名を取得します
   set operating_conditions_display_name   [get_operating_conditions_info -display_name $operating_conditions_obj]

   # 全タイプの分析を実行します   
   foreach analysis_type $analysis_list {

      # プリントする必要がある場合、分析タイプの名前を取得します
      set analysis_display_name [string totitle $analysis_type]

      # すべてのクロックドメインに関する情報を取得します
      set clock_domain_info_list [get_clock_domain_info -${analysis_type}]

      # すべてのクロックドメインを検証し、ネガティブスラックがあるものを
      # 引き出します
      foreach domain_info $clock_domain_info_list {

         # domain_info にはクロック名、スラック、および TNS があります。
         # これらを解凍します。      
         foreach { clock_name slack endpoint_tns edge_tns } $domain_info { break }

         # スラックがネガティブな場合、情報の行をまとめ、
         # 表でレポートします
         if { 0 > $slack } {
            $failing_paths_matrix add row [list $slack $endpoint_tns $clock_name \
               $operating_conditions_display_name $analysis_display_name]
         }
      }
      # 特定のタイミング分析 (セットアップ、保留等) について、
      # すべてのクロックドメインの検証が完了しました  
   }
   # 特定の操作条件について、すべての分析タイプの検証が
   # 完了しました
}
# すべての操作条件の検証が完了しました
# 結果サマリーをファイルに書き出す準備をします

# マトリクス内に行がある場合、タイミングが失敗したパスがあります。
# その情報を記載した表をプリントアウトする必要があります。表に行がない場合
# タイミングが失敗したパスはないので、成功メッセージを書き込みます
if { 0 == [$failing_paths_matrix rows] } {

   # Print out a quick message
   post_message "There are no clock domains failing timing"

   # ファイルを開く際エラーになる場合は、それを伝えるメッセージをプリント
   # します。もしくは、タイミングが失敗したドメインは無いと伝えます
   if { [catch { open $output_file_name w } fh] } {
      post_message -type error "Couldn't open file: $fh"
   } else {   
      puts $fh "There are no clock domains failing timing"
      catch { close $fh }
   }
} else {
   # Sort the matrix rows so the worst slack is first
   $failing_paths_matrix sort rows -increasing 0

   # ヘッダー行を挿入します
   $failing_paths_matrix insert row 0[list "Slack" "End Point TNS" "Clock" \
      "Operating conditions" "Timing analysis" ]   

   # 結果の表をプリントアウトするため、スタイルを指定する必要があります
   catch { ::report::rmstyle basicrpt }
   ::report::defstyle basicrpt {{cap_rows 1}} {
      data set [split "[string repeat " " [columns]];"]
      top set [split "[string repeat "+ - " [columns]]+"]
      bottom set [top get]
      topcapsep set [top get]
      topdata set [data get]
      top enable
      topcapsep enable
      bottom enable
      tcaption $cap_rows 
   }

   # レポートを作成し、列にパディングとしてスペースを 1 つ入れる設定にして、
   # 指定のフォーマットでマトリクスをプリントアウトします
   catch { r destroy }
   ::report::report r 5 style basicrpt
   for { set col 0 } { $col < [r columns]} { incr col } {
      r pad $col both " "
   }
   post_message "Clock domains failing timing\n[r printmatrix $failing_paths_matrix]"

   # レポートをファイルに保存します
   if { [catch { open $output_file_name w } fh] } {
      post_message -type error "Couldn't open file: $fh"   
   } else {
      puts $fh "Clock domains failing timing"
      r printmatrix2channel $failing_paths_matrix $fh
      catch { close $fh }
   }
}