syn.directive.reset - 2024.1 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2024-07-03
Version
2024.1 日本語

説明

RESET プラグマまたは指示子は、特定のステート変数 (グローバルまたはスタティック) のリセット ポートを追加または無効にします。

リセット ポートは、リセット信号が適用されたときにリセット ポートに接続されているレジスタおよびブロック RAM を初期値に戻すために FPGA で使用されます。RTL リセット ポートの存在と動作は、syn.rtl.reset コンフィギュレーション ファイルで制御されます。リセット コンフィギュレーション設定ではリセットの極性および同期か非同期かを定義できますが、重要なのは、[reset] オプションを使用してリセット信号を適用したときにリセットするレジスタを指定できるということです。詳細は、『高位合成ユーザー ガイド』 (UG1399) の「初期化およびリセット動作の制御」を参照してください。

RESET プラグマを使用すると、リセットを詳細に制御できます。グローバルまたはスタティック変数の場合、RESET プラグマを使用してリセットを明示的に有効にしたり、off に設定して変数をリセットを削除したりできます。これはスタティック配列またはグローバル配列がデザインに含まれる場合に特に便利なことがあります。

注記: クラスのパブリック変数の場合、RESET プラグマが関数またはファイル レベルで宣言された変数にのみ適用されるリセット コンフィギュレーション設定として使用される必要があります。さらに、RESET プラグマは、最上位関数または下位関数内のクラスのオブジェクトに適用される必要があり、クラスのプライベート変数には適用できません。

構文

C ソース コードの変数のライフ サイクルの境界内に配置します。

syn.directive.reset=<location> [ variable=<a> | off=true ]

説明:

location>
変数を定義する場所を function[/label] というフォーマットで指定します。
variable=<a>
RESET プラグマを適用する変数を指定します。
off または off=true
指定した変数にリセットが生成されないようにします。

グローバル リセット (syn.rtl.reset) 設定が none または control の場合でも、関数 foo の変数 a にリセットを追加します。

syn.directive.reset=foo a

グローバル リセット設定が state または all の場合でも、関数 foo の変数 static int a からリセットを削除します。

syn.directive.reset=off foo a

次の例では、RESET プラグマや指示子をクラス変数やメソッドと組み合わせて使用しています。クラス内で宣言された変数は、クラス内の public static 変数である必要があります。クラスのメソッド内、または HLS デザインの最上位関数や下位関数内でクラスのオブジェクトが生成された後に、その変数に対して RESET プラグマが指定できます。

class bar {
public:
  static int a; // class level static; must be public
  int a1;       // class-level non-static; must be public
  bar(...) {
  // #pragma reset does not work here for a or a1
  }
  // this is the function that is called in the top
  void run(...) {
  // #pragma reset does not work here for non-static variable a1
  // but does work for static variable a
  #pragma reset variable=a
  }
};
static int c; // file level 
int d; // file level
void top(...) {
#pragma HLS top
  static int b; // function level
  bar t;
  static bar s;

  // #pragma reset works here for b, c and d, as well as t and s members
  // except for t.a1 because it is not static
  #pragma reset variable=b
  #pragma reset variable=c
  #pragma reset variable=d
  #pragma reset variable=t.a
  #pragma reset variable=s.a
  #pragma reset variable=s.a1
  t.run(...); 
  s.run(...); 
} 
上記の関数 top に指定される syn.directive.reset コマンドは、次のようになります。
syn.directive.reset=top variable=b
syn.directive.reset=top variable=c
syn.directive.reset=top variable=d
syn.directive.reset=top variable=t.a
syn.directive.reset=top variable=s.a
syn.directive.reset=top variable=s.a1