スクリプト内のタイミング・アナライザーのインスタンスおよびエンティティー

author-image

投稿者:

タイミング・アナライザー用にカスタムスクリプトを書く際は、異なる Tcl API 機能がノード名にあるエンティティおよびインスタンス名を処理して返す方法を認識する必要があります。Quartus® II ソフトウェアにある、ノード名用のエンティティ名をディスプレイ と呼ばれる設定は、ノード名の表示にエンティティ名を伴うか否かを制御します。
Tcl API 機能 get_registers は、ノード名用のエンティティ名をディスプレイの設定に関わらず、そのフィルター用のエンティティを含む名前の受け入れが常に可能です。get_registers 機能は、常にノード名用のエンティティ名をディスプレイの設定に応じて、名前を返します。
表 1は、コマンド get_registers <filter> により返されたノード名の例を示しています。デザインには ram:my_ram|ctrl:ctrl_1|addr[0] という名前のレジスターが含まれています。

Tcl API 機能 get_pins および get_cells の動作は、get_registers とは異なります。get_pins および get_cells 機能は、インスタンス名を含む名前のみを受け入れ、また返します。これらは、ノード名用のエンティティ名をディスプレイ の値に関わらず、エンティティのある名前は受け入れず、また返しません。
表 2は、get_pins <filter> により返されたノード名の例を示しています。 デザインには、ram:my_ram|ctrl:ctrl_1|addr[0] という名前のレジスターと、clk という名前のクロックピンが含まれています。get_cells 機能は、同じ方法で動作しますが、セル名を受け入れ、また返します。

注:

  1. get_pins 機能は、指定のフィルターがピンと一致しないことを示す警告を生成します。

エンティティを含むノード名を処理して返す際の、get_registersget_pins、および get_cells の違いを認識していれば、これらの機能を組み合わせるときに生じ得る微妙な問題を回避できます。以下の例は、ノード名用のエンティティ名をディスプレイ がオフでの場合に動作し、オンの場合に失敗するコードを示しています。

foreach_in_collection reg_id [get_registers foo*] {
    set reg_name [get_node_info -name $reg_id]
    # ...
    set pin_id [get_pins ${reg_name}|clk]
    # If reg_name includes entities, the get_pins call always fails
}

ノード名用のエンティティ名をディスプレイがオフの場合、変数 reg_name はエンティティ名を含まないため、get_pins のコールは成功します。ノード名用のエンティティ名をディスプレイがオンの場合、変数 reg_name はエンティティ名を含むため、get_pins のコールは失敗します。

ソリューション

潜在的な問題を回避する最も簡単な方法は、ノード名用のエンティティ名をディスプレイをオフにし、インスタンス名のみを使用してノードを参照することです。このソリューションにより、get_registers が返す名前がインスタンス名のみとなり、get_pins および get_cells で動作するよう徹底できます。

ノード名用のエンティティ名をディスプレイをオフにせず、get_registers が返す名前を get_pins または get_cells にパスする場合、すべてのエンティティ名を確実に削除する必要があります。シンプルな regsub 式を使用して、ほとんどのエンティティ名を削除できます。下記の Tcl コマンドは、エンティティ名に含まれるのが文字、数字、およびアンダースコアのみ (\w 文字クラスにある文字) である限り、ノード名からすべてのエンティティ名を削除します。

regsub -all {\w*:} $reg_name {} reg_name

リストにあるレギュラー式パターンは、HDL 識別子にあるすべての有効な文字を処理するものではありません。生成されたエンティティ名のうち、シンプルな Verilog HDL 識別子、エスケープされた Verilog HDL 識別子、または VHDL 内のエクステンデッド識別子にある、バックスラッシュ (\)、ドル記号 ($) を含むものは処理しません。より高度なレギュラー式を構築して、これらの文字を含むエンティティ名を処理することは可能ですが、ノード名用のエンティティ名をディスプレイをオフにする方が簡単です。
下記の例は、regsub 式と上記の動作しない例を統合する方法を示しています。下記の例では、regsub 式がレジスター名からエンティティ名を (説明にある例外文字を条件に) 削除するため、get_pins コールが失敗しません。この例は、ノード名用のエンティティ名をディスプレイの値に関わらず動作します。

foreach_in_collection reg_id [get_registers foo*] {
    set reg_name [get_node_info -name $reg_id]
    regsub -all {\w*:} $reg_name {} reg_name
    # reg_name no longer includes entities
    # ...
    set pin_id [get_pins ${reg_name}|clk]
    # reg_name no longer includes entities, so get_pins succeeds
}