IP コアの生成ワークフローと Simulink Real-Time FPGA I/O ワークフローでのタイミング エラーの解決
同期回路は、転送元レジスタから転送先レジスタにデータが 1 クロック サイクル以内に伝播することを要求します。合成ツールの場合、Simulink® モデルに追加した Delay ブロックがクロック レートで実行されます。合成ツールでは、データが 1 クロック サイクル以内にブロック間を移動する必要があります。合成ツールがモデル内の 1 つ以上の信号パスのレジスタ間でデータを 1 クロック サイクル以内に伝播できない場合、タイミング エラーが発生します。
合成ツールで、要求された時間と到着時間との差に対応する "スラック" 情報が信号パスごとにレポートされます。要求された時間は、信号が宛先のレジスタに到着しなければならない予想時間です。到着時間は、信号がその地点に到着するまでの経過時間です。正のスラックは信号が要求された時間よりも速く到着したことを示し、パスはタイミング要件にパスします。負のスラックは信号が要求された時間よりも遅いことを示し、パスはタイミング要件に失敗します。設計がタイミング要件を満たすようにするためには、負のスラックをもつすべての信号パスの速度を上げます。
設計がタイミング要件を満たしているかどうか、およびタイミング エラーを解決する方法を確認するには、以下の手順を実行します。
手順 1: タイミング エラーの特定
Vivado® ベースのボードで IP Core Generation
ワークフローまたは Simulink Real-Time FPGA I/O
ワークフローを実行するときに、Simulink モデルがタイミング要件を満たしていない場合、HDL Coder™ ではワークフローの [FPGA ビットストリームのビルド] ステップでエラーが生成されます。次の項目を参照してください。
IP Core Generation
ワークフローの実行方法については、Xilinx Zynq プラットフォームをターゲットにする方法の概要を参照してください。Simulink Real-Time FPGA I/O
ワークフローの実行方法については、Speedgoat Simulink プログラム可能 I/O モジュールでの FPGA プログラミングと構成を参照してください。このワークフローを実行する場合は、Xilinx® Vivado を合成ツールとしてサポートする Speedgoat ボードを使用します。
[FPGA ビットストリームのビルド] タスクを実行するときは、[ビルド プロセスを外部で実行] チェック ボックスを既定のままオンにすると、タイミング エラーの有無に関係なく、HDL Coder では結果に [パス] が表示され、警告メッセージが示されます。外部コンソールにビルド ログを表示して、タイミング エラーが発生する可能性があるかどうかを特定します。
外部コンソールでは、タイミング エラーがある場合は、最悪のスラックが示され、次のメッセージが表示されます。タイミング制約が満たされていません。
[ビルド プロセスを外部で実行] チェック ボックスをオフにしてから、[FPGA ビットストリームのビルド] タスクを実行すると、タイミング エラーが発生した場合、[結果] サブペインに以下のメッセージが表示されます。
どちらの場合も、タイミング エラーが発生すると、コード ジェネレーターでは前のビットストリームが、同じ名前と接尾辞 _timingfailure.bit
または _timingfailure.sof
(プロジェクトを Vivado または Quartus® のどちらを使用して作成したかによる) をもつビットストリームで置き換えられます。たとえば、前に生成したビットストリームが system_top_wrapper.bit
という名前の場合に、タイミング エラーが発生すると、HDL Coder によってこのビットストリームの名前は system_top_wrapper_timingfailure.bit
に変更されます。
[ターゲット デバイスをプログラム] タスクを実行すると、タスクは失敗します。
タイミング エラーを警告として報告
タイミング エラーを解決するカスタム ロジックを既に実装している場合は、タイミング エラーをエラーではなく警告として報告するよう指定できます。その後ワークフローを続行し、FPGA ビットストリームを生成できます。ターゲットの SoC デバイスをプログラミングする前に、タイミング エラーを解決しておくことを推奨します。
タイミング エラーを解決した後、エラーが解決したことを確認するには、HDL Coder ソフトウェアを使用できます。タイミング エラーをエラーとして報告されるよう変更し、IP Core Generation
ワークフローを再実行して、[FPGA ビットストリームのビルド] タスクが成功することを確認します。[FPGA ビットストリームのビルド] タスクが依然として失敗する場合は、前の節の手順を実行してタイミング エラーを特定し解決します。
タイミング エラーを警告として報告するよう指定するには、次のようにします。
[FPGA ビットストリームのビルド] タスクを実行した後、HDL ワークフロー アドバイザーをスクリプトにエクスポートします。そのスクリプトで、タイミング エラーを警告として報告するには、
hdlcoder.WorkflowConfig
クラスのReportTimingFailure
プロパティを使用します。その後スクリプトを実行するか、スクリプトを HDL ワークフロー アドバイザーにインポートしてワークフローを実行します。hWC.ReportTimingFailure = hdlcoder.ReportTiming.Warning;
ボード向けに既に定義済みのカスタム リファレンス設計をターゲットとしている場合は、タイミング エラーを警告として報告するには、
hdlcoder.ReferenceDesign
クラスのReportTimingFailure
プロパティを使用します。hRD.ReportTimingFailure = hdlcoder.ReportTiming.Warning;
クリティカル パスを特定してタイミング エラーを解決する方法については、前の節の手順を実行します。
手順 2: クリティカル パスの検出
クリティカル パスとは、遅延が最大になる入力と出力との間を組み合わせたパスです。このパスは、最大の負のスラックをもつ信号パスを表します。クリティカル パスを特定して最適化することで、タイミング エラーを解決し、設計のタイミングを改善します。設計のクリティカル パスは、次のいずれかの方法を使用して特定できます。
手法 1: タイミング レポートをチェックする
[結果] サブペインで、合成ツールによって生成されたタイミング ツールを開くには、[timing_report] リンクを選択します。このレポートを使用して、設計のクリティカル パスを特定できます。レポートで、Worst Slack
を検索すると、最大のセットアップ スラックを特定できます。次に、Source
ポイントと Destination
ポイントを使用してクリティカル パスを特定します。たとえば、この LED 点滅モデル hdlcoder_led_blinking
のレポートでは、クリティカル パスが HDL Counter ブロック内にあることが示されています。
----------------------------------------------------------------------------------------- From Clock: clk_out1_system_top_clk_wiz_0_0 To Clock: clk_out1_system_top_clk_wiz_0_0 Setup : 1193 Failing Endpoints, Worst Slack -2.478ns, Total Violation -1226.784ns Hold : 0 Failing Endpoints, Worst Slack 0.034ns, Total Violation 0.000ns PW : 2 Failing Endpoints, Worst Slack -0.576ns, Total Violation -0.731ns ----------------------------------------------------------------------------------------- Max Delay Paths ----------------------------------------------------------------------------------------- Slack (VIOLATED) : -2.478ns (required time - arrival time) Source: system_top_i/led_count_ip_0/U0/u_led_count_ip_dut_inst/ u_led_count_ip_src_led_counter/HDL_Counter1_out1_reg[0]/C (rising edge-triggered cell FDRE clocked by clk_out1_system_top_clk_wiz_0_0 {rise@0.000ns fall@1.000ns period=2.000ns}) Destination: system_top_i/led_count_ip_0/U0/u_led_count_ip_dut_inst/ u_led_count_ip_src_led_counter/HDL_Counter1_out1_reg[20]/R (rising edge-triggered cell FDRE clocked by clk_out1_system_top_clk_wiz_0_0 {rise@0.000ns fall@1.000ns period=2.000ns}) Path Group: clk_out1_system_top_clk_wiz_0_0 Path Type: Setup (Max at Slow Process Corner) Requirement: 2.000ns (clk_out1_system_top_clk_wiz_0_0 rise@2.000ns - clk_out1_system_top_clk_wiz_0_0 rise@0.000ns) Data Path Delay: 3.899ns (logic 1.412ns (36.211%) route 2.487ns (63.789%))
手法 2: 合成を実行せずにクリティカル パスを推定する
HDL Coder を使用して、設計を合成せずにモデル内のクリティカル パスを推定して、強調表示します。クリティカル パスの推定では、ターゲット固有のタイミング データベースのタイミング データを使用して静的タイミング解析を実行することにより、クリティカル パスを特定します。合成ツールを使用せずにクリティカル パスを推定すると、タイミング結果が不正確になることがあります。クリティカル パスの推定により、設計内のクリティカル パスの特定および最適化の処理が高速化します。これは、HDL ワークフロー アドバイザーでの [FPGA 合成および分析] の実行への代替方法です。詳細については、合成実行なしのクリティカル パスの推定を参照してください。
クリティカル パスを推定するには、[レポート オプションの設定] タスクで、[上位のタイミングのクリティカル パス レポートを生成] チェック ボックスをオンにします。[RTL コードと IP コアの生成] タスクに対するワークフローを実行します。
HDL Coder は、コード生成レポートのクリティカル パスの推定セクションを生成します。このセクションで、criticalpathestimated
スクリプトへのリンクを選択すると、コード ジェネレーターは生成されたモデル内でクリティカル パスを強調表示します。次の図は、クリティカル パスが強調表示されている hdlcoder_sfir_fixed_stream
モデルのセクションを示しています。
手法 3: バックアノテーションを使用したクリティカル パスへの注釈の設定
より正確なクリティカル パス情報を実現し、設計内のクリティカル パスを強調表示するために、バックアノテーションを使用します。バックアノテーションを使用するには、現在のワークフロー アドバイザー セッションを終了し、合成結果を使用してモデルに注釈を設定するために Generic ASIC/FPGA
ワークフローを実行する必要があります。
バックアノテーションを使用する前に、現在の HDL ワークフロー アドバイザーの設定をスクリプトにエクスポートすることをお勧めします。設定をスクリプトにエクスポートすることで、タイミング要件を満たすまで、クリティカル パスを反復し、さまざまな設定をカスタマイズして設計を最適化することができます。ワークフロー アドバイザー スクリプトを HDL ワークフロー アドバイザーにインポートして、ワークフローを実行できます。スクリプトを使用した HDL ワークフローの実行も参照してください。
バックアノテーションを使用するには、次を行います。
[Set Target Device and Synthesis Tool] タスクで、[ターゲット ワークフロー] として
Generic ASIC/FPGA
を選択します。[合成ツール] では、IP Core Generation
ワークフローの実行に使用したものと同じツールを指定します。これらの設定を指定すると、HDL Coder ではそのタスクとそれに続くすべてのタスクがリセットされます。
[このタスクを実行] を選択します。
[ターゲット周波数を設定] タスクで、
IP Core Generation
ワークフローの実行に使用したものと同じターゲット周波数を指定します。[このタスクを実行] を選択します。[合成結果をもつモデルに注釈を付ける] タスクを右クリックし、[選択したタスクまで実行] を選択します。
[合成結果をもつモデルに注釈を付ける] タスクへのリンクを実行する場合、コード ジェネレーターは生成されたモデル内でクリティカル パスを強調表示します。次の図は、hdlcoder_led_blinking
モデル内のクリティカル パスが HDL Counter ブロック内にあることを示しています。
手順 3: タイミング エラーの解決
タイミング エラーを解決するために、設計がターゲット周波数に一致するまで、これらの推奨事項のいずれかまたは推奨事項の組み合わせを使用できます。
推奨事項 1: 速度の最適化の使用
分散型パイプライン方式およびクロックレート パイプラインなどの速度の最適化を使用して、パイプライン レジスタを追加することで機能的な動作を維持しながらクリティカル パスを分割できます。クリティカル パスを削減することで、クロック周波数を高くし、信号の到着時間が要求された時間に到達し、スラックがゼロになるまで、信号の到着時間を増加させることができます。
分散型パイプライン方式の最適化により、サブシステム階層全体で設計の既存の遅延が移動します。サブシステムで分散型パイプライン方式を有効にするには、[DistributedPipelining] を [on]
に設定します。設計がタイミング要件を満たしていない場合は、[InputPipeline] または [OutputPipeline] ブロック プロパティを使用してパイプラインをさらに追加できます。Subsystem の [HDL ブロック プロパティ] ダイアログ ボックスでこれらのプロパティを指定できます。
分散型パイプライン方式によってレジスタを移動させることができない場合、Delay ブロックをモデルに追加し、[設計上の遅延分散を許可] 設定を無効にします。[グローバル設定をチェック] タスクをリセットし、[FPGA ビットストリームのビルド] タスクに対するワークフローを実行します。設計がタイミング要件を満たしていない場合は、このアプローチを反復し、[オーバーサンプリング係数] の大きな値を使用したクロックレート パイプラインなどのその他の最適化を使用できます。これらの設定を指定するには、HDL ワークフロー アドバイザーの [最適化オプションの設定] タスクの [パイプライン] タブを使用します。詳細については、速度の最適化を参照してください。
推奨事項 2: イネーブルベースのマルチサイクル パス制約の指定
設計に複数のサンプルレートが含まれているか、ある HDL ブロック実装またはコード生成後にパイプライン レジスタをより高速なレートで挿入する速度の最適化を使用する場合、設計にマルチサイクル パスを設定できます。既定では、HDL Coder は最速のサンプル レートの単一の基本クロックを生成する単一クロック モードを使用し、タイミング コントローラー エンティティを作成します。このタイミング コントローラーが、より低速なサンプル時間で動作するブロックのクロック信号をサンプリングするのに必要なレートと位相の情報で一連のクロック イネーブルを生成します。
クリティカル パスが低速な信号レート上にある場合、合成ツールはタイミング要件を満たすことができない可能性があります。タイミング エラーは、ツールがサンプルレートを生成された HDL コードから推測できず、パスを最速のレートで実行する必要があると仮定するために発生します。イネーブルベースのマルチサイクル パス制約を使用して、合成ツールを有効にしてマルチサイクル パスに対するクロック制約を容易にする制約ファイルを生成できます。マルチサイクル パス制約の生成を指定するには、[最適化オプションの設定] タスクで、[イネーブルベースの制約] チェック ボックスをオンにします。[FPGA ビットストリームのビルド] タスクに対するワークフローを実行します。例については、マルチサイクル パス制約を使用した遅いパスのタイミングへの対応を参照してください。
推奨事項 3: ターゲット周波数の削減
[ターゲット周波数 (MHz)] 設定を使用して、HDL Coder が、その周波数をもつクロック信号を生成するリファレンス設計のクロック モジュール設定を変更するために、ターゲット周波数を指定します。ターゲット周波数パラメーターも参照してください。
タイミング エラーを解決するには、合成ツールがタイミングの制約を満たすことができるように、[ターゲット周波数 (MHz)] 設定を削減します。指定できるターゲット周波数を確認するには、合成ツールのタイミング レポートにあるスラックおよびクリティカル パスの情報を使用します。スラックは要求された時間と到着時間の間の差と等しいため、スラックを要求された時間に追加して、この合計を New required time
として使用できます。New required time
は到着時間と等しいため、タイミング要件を満たすために、この New required time
の逆数をターゲット周波数値として使用します。ターゲット周波数を計算するには、MATLAB® コマンド ウィンドウで、このスクリプトを実行します。
% Specify the required time (ns) and slack (ns) using timing report required_time = 2; slack = 2.2; % Slack is difference between required_time and arrival_time % By adding slack to required_time you can resolve New_required_time = required_time + slack; Target_frequency = 1 / (New_required_time); % Since we computed the new time in nanoseconds Target_frequency_MHz = Target_frequency * 10^3;
[ターゲット周波数を設定] タスクで、この値を [ターゲット周波数 (MHz)] に指定し、[FPGA ビットストリームのビルド] タスクに対するワークフローを実行します。タイミング エラーが表示される場合、この方法を使用して、設計がタイミング要件を満たし、スラックがゼロになるまでターゲット周波数値を反復できます。
HDL ワークフロー アドバイザー設定をスクリプトにエクスポートし、TargetFrequency
プロパティの値として Target_frequency_MHz
を指定することで、ターゲット周波数の反復を継続することもできます。次に、スクリプトを実行します。
% Set this frequency as the new target frequency hdlset_param('hdlcoder_led_blinking', 'TargetFrequency', Target_frequency_MHz);
参考
hdlcoder.Board
| hdlcoder.ReferenceDesign