AR# 53118

2012.3 Vivado HLS – 「@W [SCHED-21] Estimated clock period exceeds the target」というメッセージの意味と回避策

説明

このメッセージが出力される状況はいくつか考えられます。次に、行列乗算からの例を 2 つ示します。

例 1 :

デザインで II=1 のパイプラインが使用されている場合

@W [SCHED-21] Estimated clock period (7.67ns) exceeds the target (target clock period: 5ns, clock uncertainty: 0ns, effective delay budget: 5ns).
@W [SCHED-21] The critical path consists of the following:
 'load' operation ('o_z_im_temp_V_load') on local variable 'o_z_im_temp.V' (0 ns)
 'select' operation ('o_z_im_temp.V', matrix_test.cpp:42) (0.71 ns)
 'shl' operation ('lhs.V', matrix_test.cpp:47) (0 ns)
 'add' operation ('r.V', matrix_test.cpp:47) (2.9 ns)
 'icmp' operation ('r', matrix_test.cpp:47) (1.28 ns)
 'or' operation ('brmerge_i_i1', matrix_test.cpp:47) (0.71 ns)
 'and' operation ('qb', matrix_test.cpp:47) (0.71 ns)
 'add' operation ('__Val2__', matrix_test.cpp:47) (1.36 ns)

例 2 :

@W [SCHED-21] Estimated clock period (12.8ns) exceeds the target (target clock period: 10ns, clock uncertainty: 0ns, effective delay budget: 10ns).
@W [SCHED-21] The critical path consists of the following:
        'load' operation ('M_load_2', top.cpp:36) on array 'M' (2.39 ns)
        'partselect' operation ('__Val2__', top.cpp:37) (0 ns)
        'shl' operation ('lhs.V', top.cpp:37) (0 ns)
        'sub' operation ('__Val2__', top.cpp:37) (3.13 ns)
        'icmp' operation ('r', top.cpp:37) (1.41 ns)
        'or' operation ('brmerge_i_i3', top.cpp:37) (0.71 ns)
        'and' operation ('qb', top.cpp:37) (0.71 ns)
        'add' operation ('__Val2__', top.cpp:37) (2.11 ns)
        'bitconcatenate' operation ('M_imag_V_addr_25960_part_set', top.cpp:37) (0 ns)
        'store' operation (top.cpp:37) of variable 'M_imag_V_addr_25960_part_set' on array 'M' (2.39 ns)

the line 37 is M[i][j].imag -= line_M [k].real*line_L [k].imag  + line_M [k].imag*line_L [k].real;

ソリューション

どちらの例でも、警告メッセージによって 1 本のパスがタイミング要件を満たしていないことが示されています。また、クリティカル パスの演算も示されています。

詳しく言えば、Vivado HLS には、演算を整理するための依存関係に関して従うべき規則があります。これはスケジューリングと呼ばれます。

この警告は、1 クロック サイクルにスケジューリングされている演算が多すぎますが、現在指定されているコードおよび制約/指示子では自動的に分割できないことを示しています。

次のチュートリアルの行列乗算に関するセクションを参照してください。
http://japan.xilinx.com/support/documentation/sw_manuals/xilinx2013_1/ug871-vivado-high-level-synthesis-tutorial.pdf

上記の例に関しては、次のように異なる解決方法があります。

例 1:

パイプラインの初期化間隔 (II) を 2 に設定し、VHLS ツールで各クロック サイクルを調整してパイプライン処理できるようにします。ただし、この変更によって全体的なレイテンシとスループットも変更されます。

例 2 :

認識されているクリティカル パスはアキュムレータ ループであり、「M[i][j].imag -= the_value」を k 回ループして、行列値 M[i][j] を読み込み、減算/加算後に結果を戻します。

一時変数を使用することもできますが、ツールが一時変数を使用していない場合は、k 値を強制的に 1 回に設定できるとツールが判断しているためだと考えられます。

一時変数を使用するようにコードを変更すると、スケジューリングが変更され、タイミングが改善してタイミング要件が満たされるようになります。

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