説明
RESET プラグマまたは指示子は、特定のステート変数 (グローバルまたはスタティック) のリセット ポートを追加または無効にします。
リセット ポートは、リセット信号が適用されたときにリセット ポートに接続されているレジスタおよびブロック RAM を初期値に戻すために FPGA で使用されます。RTL リセット ポートの存在と動作は、syn.rtl.reset
コンフィギュレーション設定 (または config_rtl -reset
) で制御されます。リセット コンフィギュレーション設定ではリセットの極性および同期か非同期かを定義できますが、重要なのは、[reset] オプションを使用してリセット信号を適用したときにリセットするレジスタを指定できるということです。詳細は、初期化およびリセット動作の制御を参照してください。
RESET プラグマを使用すると、リセットを詳細に制御できます。グローバルまたはスタティック変数の場合、RESET プラグマを使用してリセットを明示的に有効にしたり、off
に設定して変数をリセットを削除したりできます。これはスタティック配列またはグローバル配列がデザインに含まれる場合に特に便利なことがあります。
構文
C ソース コードの変数のライフ サイクルの境界内に配置します。
#pragma HLS reset variable=<a> off
説明:
-
variable=<a>
- RESET プラグマを適用する変数を指定します。
-
off
- 指定した変数にリセットが生成されないようにします。
例 1
次の例では、グローバル リセット設定が none
または control
の場合でも、関数 foo
の変数 a
にリセットが追加されます。
void foo(int in[3], char a, char b, char c, int out[3]) {
#pragma HLS reset variable=a
例 2
グローバル リセット設定が state
または all
の場合でも、関数 foo
の変数 a
からリセットを削除します。
void foo(int in[3], char a, char b, char c, int out[3]) {
#pragma HLS reset variable=a off
例 3
次の例では、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(...);
}