インテル® HLS コンパイラー: リファレンス・マニュアル

ID 683349
日付 6/23/2017
Public
ドキュメント目次

A. HLS コンパイラー・クイック・リファレンス

表 14.  i++ コマンドライン引数
コマンドオプション デフォルト値 説明
-c   オブジェクト・ファイルの前処理、解析、生成。  
--clock <clock target> 240 MHz 指定したクロック周波数または周期で RTL を最適化する。
i++ -march="Arria 10" test.cpp --clock 100MHz
i++ -march="Arria 10" test.cpp --clock 10ns
--component <component name>   RTL に合成するための関数名のコンマ区切りのリスト。  
-D<macro>[=<val>]   値としての <val> での <macro> を定義する。  
--fpc   可能時に中間丸めと変換を削除する。  
--fp-relaxed   浮動小数点演算動作の順序を緩和する。  
-ghdl   シミュレーションでのすべての HDL 信号の完全なデバッグの可視化およびログ付けを有効にする。  
-L<dir>   -i を検索できるディレクトリーのリストにディレクトリー <dir> を追加する。  
-l<library>   リンクキングの際にライブラリー名 <library> を検索する。  
-march=[x86-64 | "<FPGA_family>" | "<FPGA_part_number>" x86-64 エミュレーター・フロー (x86-64)、または指定された FPGA ファミリーもしくは FPGA パートナンバーのコードを生成する。  
--promote-integers   余分な FPGA リソースを使用し g++ 整数昇格を模倣する。  
--quartus-compile   Quartus® Primeから生成された HDL を実行する。  
--simulator none   テストベンチなしでコンポーネントの RTL を生成する。  
表 15.  HLS ヘッダーファイル
ヘッダーファイル 説明
#include "HLS/hls.h" コンポーネントの識別と明示的なインターフェイスで必要である。
#include "HLS/math.h" 動作システム用のmath.hからのすべての数学関数を含む。
#include "HLS/extendedmath.h" math.hではない追加の数学関数を含む。
#include "HLS/ac_int.h" ac_intヘッダーファイルのインテル HLS バージョンであり、

最適化された任意のサイズの整数サポートを提供する。

#include "HLS/ac_fixed.h" ac_fixedヘッダーファイルのインテル HLS バージョンであり、

任意の長さの固定小数点サポートを提供する。

表 16.  HLS キーワード
キーワード デフォルト値 説明
component   関数がコンポーネントであることを示すために使用される。
component void foo() 
表 17.  HLS シミュレーション API ( テストベンチのみ )
関数 説明
ihc_hls_enqueue(/*ptr to return type*/, /*function arguments*/) この関数は HLS コンポーネントの 1 つの呼び出しをエンキューする。戻り値は、戻り型へのポインターである最初の引数に格納される。コンポーネントはihc_hls_component_run_all()関数が呼び出されるまで実行されない。
component int foo(int val) {
 // function definition
}

component void bar (int val) {
 // function definition
}
int main() {
 // ……. 
 int input = 0;
 int res;
 ihc_hls_enqueue(&res, &foo, input);
 ihc_hls_enqueue_noret(&bar, input);
 input = 1;
 ihc_hls_enqueue(&res, &foo, input);
 ihc_hls_enqueue_noret(&bar, input);
 ihc_hls_component_run_all(foo);
 ihc_hls_component_run_all(bar);
 } 
ihc_hls_enqueue_noret(/*function arguments*/) この関数は HLS コンポーネントの 1 つの呼び出しをエンキューする。この機能は HLS コンポーネントの戻り値が void の場合に使用される。コンポーネントはihc_hls_component_run_all() 関数が呼び出されるまで実行されない。
ihc_hls_component_run_all(/*function name*/) この関数は HLSコンポーネントの名前を受け入れる。実行時、コンポーネントのエンキューされたすべての呼び出しは、コンポーネントが新しい呼び出しをできるだけ早く受け入れられるように、HDL シミュレーターのコンポーネント内にプッシュされる。
int ihc_hls_sim_reset(void) この関数は自動シミュレーション中にリセット信号をコンポーネントに送る。リセットが実行されると 1 を返し、それ以外の場合は 0 を返す。
表 18.  HLS コンポーネント・メモリー属性
属性 デフォルト値 説明
hls_register アクセスパターンに基づいた値 コンポーネント内の変数 / アレイを強制的にレジスターとして実装する。
hls_memory アクセスパターンに基づいた値 コンポーネント内の変数 / アレイを強制的にエンベデッド・メモリーとして実装する。
hls_singlepump アクセスパターンに基づいた値 ローカル変数を実装しているメモリーがシングルポンプする必要があることを指定する。
hls_doublepump アクセスパターンに基づいた値 ローカル変数を実装しているメモリーがダブルポンプする必要があることを指定する。
hls_numbanks(N) アクセスパターンに基づいた値 ローカル変数を実装しているメモリーが、Nが 0 より大きい 2 のべき乗の定数であるNバンクを有する必要があることを指定する。
hls_bankwidth(N) アクセスパターンに基づいた値 ローカル変数を実装しているメモリーが、Nが 0 より大きい 2 のべき乗の定数であるNバイト幅のバンクを有する必要があることを指定する。
hls_bankbits(b 0 , b 1 , ..., b n ) バンク数に基づくアドレスの最下位ビット {b 0 , b 1 , ..., b n } がバンク選択ビットを形成するように、メモリーシステムを強制的に 2nのバンクに分割するようにする。
重要: b 0 , b 1 , ..., b n は連続した正の整数である必要がある。
 
hls_numports_readonly_writeonly(M, N) アクセスパターンに基づいた値 ローカル変数を実装しているメモリーが、MおよびNが 0 より大きい定数であるMリードポートとNライトポートを有することを指定する。                   
hls_simple_dual_port_memory   hls_singlepumpおよびhls_numports_readonly_writeonly(1,1)マクロの両方の存在により定義される構成を指定する。
hls_merge("mem_name", "depth")   2 つ以上のローカル変数を単一マージド・メモリーシステムとして深さ方向にコンポーネント・メモリー内に実装できることを可能にする。
hls_merge("mem_name", "width")   2 つ以上のローカル変数を単一マージド・メモリーシステムとして横方向にコンポーネント・メモリー内に実装できることを可能にする。
hls_init_on_reset 静的変数でのデフォルト動作の値 この属性は、コンポーネント・リセット信号がアサートされると、コンポーネント内部の静的変数を強制的にリセットする。これはコンポーネント・メモリーへの追加のライトポートの実装を必要とし、コンポーネントのリセット時にパワーアップ・レイテンシーを増加できる。
hls_init_on_powerup   この属性は、FPGA がプログラムされている際に静的変数を実装するコンポーネント・メモリーを電源投入に設定するように設定する。コンポーネントがリセットの場合、コンポーネント・メモリーは静的初期化値にリセットが戻されない。
表 19.  HLS ループプラグマ
プラグマ 説明
#pragma ii <N> これが適用されるループに <N> の値が 0 より大きい II の <N> を強制する。
#pragma ii 2
for (int i = 0; i < 8; i++) {
 // Loop body
}
#pragma ivdep safelen(<N>) array(<array_name>) このループの反復間のメモリー依存をコンパイラーに無視するように通知する。アレイの名前を指定するオプションの引数を受け入れることができる。これを指定しない場合、すべてのコンポーネント・メモリー依存は無視される。safelenパラメーターはオプションであるが、推奨されている。ループ内のロード / ストアー間の依存距離を指定する。コンパイラーはこの情報を使用して依存関係に適切な注釈を付ける。safelenを含まないことが安全である唯一のケースは、依存距離が無限大 ( つまり、実際の依存関係がない ) 場合である。
#pragma ivdep safelen(2)
for (int i = 0; i < 8; i++) {
 // Loop body
}
#pragma loop_coalesce <N> コンパイラーはこのループ内にネストされたすべてのループを 1 つのループに結合しようと試みる。このプラグマは一緒に結合するループの数を示すオプションの <N> を受け入れる。
#pragma loop_coalesce
for (int i = 0; i < 8; i++) {
 for (int j = 0; j < 8; j++) {
 // Loop body 
 } 
}
#pragma unroll <N> このプラグマはループを完全に、または <N> 回 (<N> はオプションで正の整数値 ) で、アンロールする。
#pragma unroll
for (int i = 0; i < 8; i++) {
 // Loop body
}
#pragma max_concurrency <N> このプラグマはいつでも同時に実行できるループの反復の数を制限する。主にループのスループットを向上させるためにコンポーネント・メモリーが複製されている場合に役立つ ( ループ分析ペイン内のループの詳細ペインに記載されている )。これはコンポーネント・メモリーのスコープ ( 宣言またはアクセスパターンによる ) がこのループに制限されている場合にのみ発生する。このプラグマを追加すると、いくつかのスループットを犠牲にして消費するループのエリアを節約できる。
// Without this pragma, multiple copies 
// of the array "arr"
#pragma max_concurrency 1
for (int i = 0; i < 8; i++) {
 int arr[1024];
 // Loop body
}
表 20.  HLS コンポーネント属性
コンポーネント属性 説明
hls_max_concurrency(<N>) コンポーネント・メモリーがインスタンス化されている場合、( つまり、静的変数ではない )、コンポーネント・メモリがーインスタンス化されている場合、( およびコンポーネント・メモリーのスコープがループだけでなくコンポーネント全体である場合 )、単一のコピーのみがインスタンス化される。これによりコンポーネントがパイプラインされ、複数の呼び出しが一度に実行される際にパフォーマンスを制限することができる。この属性はコンポーネントに追加でき、メモリーの複数のコピーが作成され、メモリー内の異なるスペースで異なる呼び出しが並列実行できるようになる。異なるコピーがすべて同じメモリーシステムにマップされることは、レプリケーションが深刻であることに注意する必要がある。
hls_max_concurrency(2)
void foo(ihc::stream_in<int> &data_in,
      ihc::stream_out<int> &data_out) {
 int arr[N];
 for (int i = 0; i < N; i++) {
 arr[i] = data_in.read();
 }
 // Operate on the data and modify in place
 for (int i = 0; i < N; i++) {
 data_out.write(arr[i]);
 }
}
表 21.  HLS デフォルト・インターフェイス
デフォルト・インターフェイス 説明
コンポーネント呼び出しと戻り値 コンポーネント呼び出しインターフェイスは、start と busy コンデュイットから成るストリーミング・インターフェイスとして実装される。

コンポーネント戻り値インターフェイスも done と stall 信号を含むストリーミング・インターフェイスとして実装される。

スカラー引数 スカラー引数はコンポーネント呼び出しインターフェイスに同期されるコンデュイットとして実装される。
ポインター引数 ポインター引数はデフォルトのパラメーター化でのmm_masterインターフェイスとして実装される。

デフォルトでは、ベースアドレスはスカラー引数として扱われるため、コンポーネント呼び出しインターフェイスに同期されるコンデュイットとして実装される。

メモリーマップド・インターフェイスもコンポーネント上に公開される。

表 22.  HLS コンポーネント呼び出しインターフェイス引数
コンポーネント呼び出しインターフェイス引数 説明
restrict restrict キーワードを含めることで、可能な場合に インテル® HLS コンパイラーが非競合のリードおよびライト動作間の不要なメモリー依存関係の作成を回避できる。
component void foo (restrict int *ptr1, restrict int *ptr2);
hls_avalon_streaming_component

これはデフォルトのコンポーネント呼び出しインターフェイスである。

この属性は関数コールとリターンストリームの両方のストリーミング・プロトコルに従う。コンポーネントは start 信号がアサートされて busy 信号がディアサートされると、不安定引数を消費する。コンポーネントは done 信号がアサートされると戻り値データを生成する。

トップレベルのモジュールポート : 関数コール—start、busy 関数リターン—done、stall

hls_avalon_streaming_component void foo(/*component arguments*/)
hls_avalon_slave_component start、done、および returndata ( 可能な場合 ) 信号はコンポーネントのスレーブ・メモリー・マップにレジスターされる。詳しくは、CSR スレーブの項を参照。

トップレベルのモジュールポート : Avalon-MM スレーブ・インターフェイスおよび irq_done 信号

hls_avalon_slave_component void foo(/*component arguments*/)
hls_always_run_component Start 信号はコンポーネント内で 1 に結び付けられる。done 信号は出力されない。コンポーネントのデータパスが入力 / 出力用の明示的なストリームでのみ依存する場合にこのプロトコルを使用する。

注意 : IP 検証ではこのコンポーネント呼び出しプロトコルを使用するコンポーネントはサポートされていない。

トップレベルのモジュールポート : なし

hls_always_run_component void foo(/*component arguments*/)
表 23.  HLS コンポーネント引数マクロ
コンポーネント引数マクロ 説明
hls_conduit_argument

これはスカラー引数のデフォルト・インターフェイスである。

コンパイラーはコンポーネントの呼び出し (start と busy) に同期する入力コンデュイットとして引数を実装する。
void foo( hls_conduit_argument int b)
hls_avalon_slave_register_argument コンパイラーは Avalon-MM スレーブ・インターフェイス上で読み書きできるレジスターとして引数を実装する。引数は、コンデュイット実装と同様にコンポーネントのパイプラインにリードされる。実装は、start および busy インターフェイスに同期する。
void foo( 
  hls_avalon_slave_register_argument int b)
hls_avalon_slave_memory_argument(N) コンパイラーはオンチップ・メモリーブロックに引数を実装し、これは専用スレーブ・インターフェイス上で読み書きできる。生成されたメモリーは他のすべての内部コンポーネント・メモリー ( つまり、バンキング、結合など ) と同じアーキテクチャーの最適化を行う。

コンパイラーが静的結合最適化を実行すると、スレーブ・インターフェイスのデータ幅は結合された幅になる。この属性は、ポインター引数でのみ適用する。

コンポーネントのデータパスで行われたこの引数の値の変更はこのレジスターに反映されない。

component void foo(
   hls_avalon_slave_memory_argument(128) *a)
hls_stable_argument stable 引数は、ライブデータがコンポーネントにある間 ( つまり、パイプライン化関数呼び出しの間 ) は変更されない引数である。

コンポーネント実行中の stable 引数の変更は、未定義の動作を引き起こす。つまり、stable 引数の使用のたびに古い値または新しい値が使用される可能性があるが、一貫性の保証はない。同じ呼び出しでの同じ変数では複数の値が現れる場合がある。

stable 引数を使用すると、適切な場合にデザインの多くのレジスター数を節約できる場合がある。

stable 引数はコンデュイット、mm_master インターフェイス、slave_registers で使用できる。

component int dut(
   hls_stable_argument int a,
   hls_stable_argument int b) {
 return a * b;}
表 24.  HLS ストリーミング用入力インターフェイス
入力インターフェイス デフォルト値 有効値 説明
stream_in 宣言
void foo (ihc::stream_in<int> &a) {
 int x = a.read(); 
// Blocking read
}
void foo_nb (ihc::stream_in<int> &a) {
 bool success = false;
 int x = a.tryRead(&success);
 // Blocking read
 if (success) {
 // x is valid
 }
}

int main() {
 ihc::stream_in<int> a;
 ihc::stream_in<int> b;
 for (int i = 0; i < 10; i++) {
 a.write(i);
 b.write(i);
 }
 foo(&a);
 foo_nb(&b);
}
ihc::stream_in<datatype>     コンポーネントへのストリーミング用の入力インターフェイスであり、テストベンチはこのバッファーをコンポーネントに送信する前に配置する必要がある。
ihc::buffer 0 正の整数値 ストリームに関連する入力データ上の FIFO バッファーのワード単位での容量。

このパラメーターは入力ストリーム上でのみ使用可能。

このパラメーターはvoid foo (ihc::stream_in<int, ihc::buffer<16 > &a);

など、関数引数に追加される。
ihc::readylatency 0 正の整数値 ( 0-8 の間 ) リード信号がディアサートされてから入力ストリームが新しい入力を受け入れられなくなるまでのサイクル数。概念的には、このパラメーターはストリームと関連するデータの入力 FIFO バッファー上の almost ready レイテンシーとして確認することができる。
ihc::bitsPerSymbol データ型サイズ データ型サイズを均等に分割する正の整数値 データがデータバス上のシンボルにどのようにブレークされるかを記述する。データは常にリトル・エンディアンの順に中断される。
ihc::usesPackets false trueまたはfalse ストリーム・インターフェイス上の startofpacket と endofpacket 信号を公開する。これは、パケットベースの読み出し / 書き込みによりアクセス可能。
ihc::usesValid true trueまたはfalse 有効な信号がストリーム・インターフェイス上に存在するかどうかを制御する。falseの場合は、アップストリーム・ソースは ready がアサートされるサイクルごとに有効なデータを提供する必要がある。

これはストリームリード呼び出しをtryReadに変更し、successを常にtrueを保つこととと同じである。

trueに設定する場合は、bufferreadyLatencyは 0 である必要がある。

stream_in 関数 API
T read()     コンポーネント内から使用されるブロッキング・リードコール。
T read(bool& sop, bool& eop)    

usesPackets<true>が設定されている場合にのみ有効である。

sideband 信号によるブロッキング・リード。
T tryRead(bool &success)     コンポーネント内から使用されるノンブロッキング・リードコール。読み込みが有効であれば、success bool は true に設定される。
T tryRead(bool& success, bool& sop, bool& eop)    

usesPackets<true>が設定されている場合にのみ有効である。

sideband 信号によるノンブロッキング・リード。
void write(T data)     コンポーネントに送信される FIFO を配置するためにテストベンチから使用されるブロッキング・ライトコール。
void write(T data, bool sop, bool eop)    

usesPackets<true>が設定されている場合にのみ有効である。

sideband 信号によるブロッキング・ライトコール。
表 25.  HLS ストリーミング用出力インターフェイス
出力インターフェイス デフォルト値 有効値 説明
Stream_out 宣言
void foo (ihc::stream_out<int> &a) {
 static int count = 0;
 a.write(count++); // Blocking write
}
void foo (stream_in<int> &a) {
 static int count = 0;
 bool success = a.tryWrite(count++); // Non-blocking write
 if (success) {
 // write was successful
 }
}    
ihc::stream_out<datatype>     コンポーネントからのストリーミング用の出力インターフェイス。テストベンチはコンポーネントが返されるとこのバッファーから読み出しが可能。
ihc::readylatency 0 正の整数値 (0-8 の間 ) リード信号がディアサートされてから入力ストリームが新しい入力を受け入れられなるまでのサイクル数。

概念的には、このパラメーターはストリームと関連するデータの入力 FIFO バッファー上の almost ready レイテンシーとして確認することができる。

ihc::bitsPerSymbol データ型サイズ データ型サイズを均等に分割する正の整数値 データがデータバス上のシンボルにどのようにブレークされるかを記述する。データは常にリトル・エンディアンの順に中断される。
ihc::usesPackets false trueまたはfalse ストリーム・インターフェイス上の startofpacket と endofpacket 信号を公開する。これは、パケットベースの読み出し / 書き込みによりアクセス可能。
ihc::usesReady true trueまたはfalse ready 信号が存在するかどうかを制御する。trueの場合は、ダウンストリーム・シンクは valid がアサートされるサイクルごとにデータを受け入れる必要がある。

これはストリーム・リードコールをtryWriteに変更し、successを常にtrueを保つこととと同じである。

falseに設定する場合は、bufferreadyLatencyは 0 である必要がある。

stream_out 関数呼び出し API
void write(T data)     コンポーネント内からのブロッキング・ライトコール。
void write(T data, bool sop, bool eop)    

usesPackets<true>が設定されている場合にのみ有効。

sideband 信号によるコンポーネントからのブロッキング・ライトコール。
bool tryWrite(T data)     コンポーネント内からのノンブロッキング・ライトコール。書き込みが成功したかどうかの戻り値を表す。
bool tryWrite(T data, bool sop, bool eop)    

usesPackets<true>が設定されている場合にのみ有効。

コンポーネント内からのノンブロッキング・ライトコールし。書き込みが成功したかどうかの戻り値を表す。
T read()     コンポーネントからデータを読み戻すためにテストベンチで使用されるブロッキング・リードコール。
T read(bool &sop, bool &eop)    

usesPackets<true>が設定されている場合にのみ有効。

sideband 信号によるコンポーネントからデータを読み戻すためにテストベンチで使用されるブロッキング・リードコール。
表 26.  HLS mm_master インターフェイス
mm_master インターフェイス 有効値 デフォルト値 Description
ihc::mm_master<datatype, /*template arguments*/ >   ポインター引数におけるデフォルト・インターフェイス メモリーマスター・インターフェイスの引数 : 複数のテンプレート引数がサポートされている。テンプレートの引数は下記のとおりである。有効なハードウェア・コンフィグレーションを要求する限り、任意の組み合わせを使用できる。各コンフィグレーションのデフォルト値は、HLS リファレンス・ガイドに記載されている。
component int dut(
 ihc::mm_master<int, 
   ihc::aspace<2>, ihc::latency<3>,
   ihc::awidth<10>, ihc::dwidth<32>
  > &a) 
ihc::dwidth<value> 8、16、32、64、128、256、512、または 1024 64 ビット単位でのメモリーマップド・データバスの幅
ihc::awidth<value> 範囲 1 – 64 の整数値 64 ビット単位でのメモリーマップド・アドレスバスの幅
ihc::aspace<value> 0 より大きい整数値 1 マスターに関連するインターフェイスのアドレススペース。同じアドレススペースのすべてのマスターは、コンポーネント内で 1 つのインターフェイスに調停される。したがって、これらのマスターはインターフェイスを記述する同じテンプレート・パラメーターを共有する必要がある。
ihc::latency<value> 正の整数値 1 外部メモリーが有効な読み出しデータを返す際に、リードコマンドがコンポーネントを終了してからの保証されたレイテンシー。このレイテンシーが変数であれば、0 に設定します。
ihc::maxburst<value> 範囲 1 - 1024 の整数値 1 リード・トランザクションまたはライト・トランザクションに関連されるデータ転送の最大数。

固定レイテンシー・インターフェイスでは、この値は 1 に設定される必要がある。

詳しくはAvalon Interface Specificationsを参照。

ihc::align<value> データ型のアラインメントより大きい整数値 データ型のアラインメント ベースポインター・アドレスのバイト・アラインメント。HLS コンパイラーはこの情報を使用して、このポインターへのロードとストアーで可能な結合の量を決定する。

データ型幅がマスターデータ幅以下の場合、この引数を少なくともマスター幅以上に設定する。

例えば、型charが 64 ビットのマスター幅に設定されている場合、各クロックサイクルで 8 文字の読み出しと書き込みが可能となるように、alignテンプレート引数は 8 バイトに設定する。
重要: 呼び出し元は align 引数の設定値にデータを揃える必要があり、そうでない場合は機能障害が発生する可能性がある。
getInterfaceAtIndex(int index)     この関数は、mm_master オブジェクトへのインデックスに使用される。これは、アレイを反復処理してアレイの異なるインディケーター上のコンポーネントを呼び出す際に便利である。この機能はテストベンチでのみサポートされている。
int main() {
// …….
for(int index = 0; index < N; index++) {
  dut(src_mm.getInterfaceAtIndex(index));
}
// …….
}
表 27.   HLSコンパイラーでサポートされている AC データバイト
AC データ型 インテル・ヘッダーファイル 内容
ac_int HLS/ac_int.h 任意の幅の整数サポート
ac_fixed HLS/ac_fixed.h 任意精度の固定小数点サポート
表 28.  HLS デバッグツール
デバッグツール 説明
マクロ
#define DEBUG_AC_INT_WARNING
コンパイラー・コマンドライン・オプション
-D DEBUG_AC_INT_WARNING
ac_intデータ型の x86 エミュレーション中にランタイムでのトラッキングを有効にする。

これは、オーバーフローを追跡する際に追加のオーバーヘッドを使用し、オーバーフローが検出されると警告を出す。

マクロ
#define DEBUG_AC_INT_ERROR
コンパイラー・コマンドライン・オプション
-D DEBUG_AC_INT_ERROR
ac_intデータ型のオーバーフローのトラッキングを有効にする。

これは、オーバーフローの追跡で追加のオーバースレッドを使用し、オーバーフローが検出されるとランタイムでエラーを出す。