AR# 51269

Vivado HLS 2012 - ブロック RAM の依存関係によって II が増大する

説明

分散 RAM (小型 RAM) では、ツールによってクロック サイクルあたり 1 サンプルの目標を達成できます。

ブロック RAM を使用すると、サンプルあたり 2 クロック サイクルが必要になります。これはなぜですか。

典型的な出力を示します。

@W [SCHED-68] Unable to enforce a carried dependency constraint (II = 1, distance = 1)
   between 'store' operation (video_fir.c:52) of variable 'calc_0_2_load' on array 'buffer_0' and 'load' operation ('inDataNext', video_fir.c:45) on array 'buffer_0'.
Failed to meet target II: 1
The critical dependency path consists of the following.
[Operation latency] 'load' operation ('inDataNext', video_fir.c:45) on array 'buffer_0' takes 1 cycle.
[Precedence] from 'load' operation ('inDataNext', video_fir.c:45) on array 'buffer_0' to 'store' operation (video_fir.c:52) of variable 'calc_0_2_load' on array 'buffer_0' with length = 0.
[Carried Dependence] from 'store' operation (video_fir.c:52) of variable 'calc_0_2_load' on array 'buffer_0' to 'load' operation ('inDataNext', video_fir.c:45) on array 'buffer_0' with (distance, length) = (1, 1).
        Total length of the dependency path is 2,
        which exceeds II * total distance = 1 * 1 = 1
@I [SCHED-61] Pipelining result: Target II: 1, Final II: 2, Depth: 11.

ソリューション

詳細はユーザー ガイドに記載されています。

これは、読み出しや書き込みのインデックスが独立した変数などから供給されるケースです。
HLS エンジンでは、これらの変数が等しくならないことを判断できないため、ブロック RAM に対して読み出し後書き込みアクセスを行う方が安全ですが、これには 1 サイクルの読み出しレイテンシがあります。  
この場合、上記の HLS ログに示されているように、II を 2 に拡張するブロック RAM レイテンシによって、HLS ツールにより buffer[] に誤ったループ キャリー依存関係が認識されます。

このような場合、Vivado HLS では DEPENDENCE 指示子を使用できます。
依存関係はループ反復間にレポートされるため、相互依存関係と見なされます。 
したがって、次の指示子を追加することで、II=1 を達成できます (Tcl または同様のプラグマ)。

set_directive_dependence -variable buffer -type inter -dependent false "video_fir/shift_loop"
#pragma HLS DEPENDENCE variable=buffer inter false

詳細はユーザー ガイドまたはツールのマニュアル ページを参照してください。

C/RTL 協調シミュレーション中に競合の警告が出力されることがあります。

HLS のデフォルト動作を変更するために DEPENDENCE 指示子が必要になることがありますが、これは単なる一時的な変更に過ぎません。
アクセスが独立していることが確実である場合以外は、コードを記述し直すことをお勧めします。
ツールでレポートされた依存関係が誤りであるかどうかは、設計者が確認してください。そうでないと、HLS で生成される RTL が適切に動作しない可能性があります。
また、新しい指示子を追加した後に RTL シミュレーションで動作を確認する必要があります。

AR# 51269
日付 04/30/2013
ステータス アクティブ
種類 一般
ツール