パラメーター、シミュレーター、RTL コーディング・スタイルの組み合わせによっては、シミュレーションにおけるこのブロックのレイテンシーは、予想されるレイテンシー (1 クロック) とは異なります。実際のハードウェアでは、予想されるレイテンシーが示されます。
この動作が見られます(例えば、DSP ブロックを駆動するクロックが入力データを生成するクロックの遅延バージョンの場合、入力データよりも入力クロックにシミュレーション遅延が多くなります。
この問題を回避するには、DSP ブロックに入力データを生成するクロックと DSP ブロックの入力クロックの間の遅延が、入力データの遅延によってバランスを取られるようにする必要があります。または、DSP ブロックの入力クロックと比較して、入力データが後の絶対時間または後のシミュレーションデルタ遅延時間で到着することを確認します。
クロックパス上の代入ステートメントが多いほど、データパスとデータパスの間でシミュレーションデルタ遅延の違いが生じることに注意してください。
これを行うには、テストベンチを以下に変更します。
- ネイティブ DSP ブロックへのクロック生成入力が、ネイティブ DSP ブロックへのクロック入力と全く同じ信号であることを確認します。
- #1 が実現不可能な場合は、入力データをクロックに対して 遅延 させます。
たとえば、次の元の RTL コードを考えてみましょう。
元の RTL:
clk_gen: プロセス
開始
clk_orig <= \'0\';
5ns 待ちます。
clk_orig <= \'1\';
5ns 待ちます。
エンドプロセス。
...
if (rising_edge(clk_orig)) してから
ax <= ax 1;
ay <= ay - 1;
end if
mac_test_bad_style: mult_acc
ポートマップ (
...
ax => std_logic_vector(ax)、-- [in]
ay => std_logic_vector(ay)、-- [in]
clk => ("00" & clk_orig)、-- [in]
resulta => resulta2、-- [out]
...
);
が予想より 1 クロック低いレイテンシーで表示されます。なお、マルチプライヤー\の clk ポート割り当てに「00 & clk」を連結すると、入力データを生成する「clk_orig」からのシミュレーションデルタ遅延が追加されます。
考えられる回避策は次のとおりです。
例 1、推奨事項: 全体で 3 ビット・クロックを使用
マルチプライヤー\の 3ビットクロックを直接生成し、アクティブなビットを使用して入力データをクロックできます。
clk_gen: プロセス
開始
clk3bit <= \'000\';
5ns 待ちます。
clk3bit <= \'001\';
5ns 待ちます。
エンドプロセス。
...
if (rising_edge(clk3bit(0)) ) してから
ax <= ax 1;
ay <= ay - 1;
end if
mac_test_bad_style: mult_acc
ポートマップ (
...
ax => std_logic_vector(ax)、-- [in]
ay => std_logic_vector(ay)、-- [in]
clk => (clk_3bit)、-- [in]
resulta => resulta2、-- [out]
...
);
例 2、代替推奨事項: 入力データに対応する遅延を追加する
\'clk => ("00" &clk_orig)\' ステートメントは、\'clk" ポートにデータを駆動している \'clk_orig\' からの追加のシミュレーションデルタ遅延を発生させます。これを克服するために、元のclk_genプロセスを使用し、割り当てステートメントを使用してシミュレーションデルタ遅延をデータに追加するだけです。
clk_gen: プロセス (オリジナルと同じ)
ax_del <= ax;
ay_del<=ay;
mac_test_bad_style: mult_acc
ポートマップ (
...
ax => std_logic_vector(ax_del)、-- [in]
ay => std_logic_vector (ay_del)、-- [in]
clk => ("00" & clk_orig)、-- [in]
resulta => resulta2、-- [out]
...
);