Vitis HLS での C/RTL 協調シミュレーション

シミュレーション目的でプロジェクトに C テストベンチを追加した場合、それを C/RTL 協調シミュレーションにも使用して、RTL が C ソース コードと同じように機能するかどうかを検証できます。合成の RTL 結果を検証するには、C/RTL Cosimulation ツールバー ボタン () または SolutionRun C/RTL cosimulation をクリックします。

次の図に示す [Co-simulation Dialog] ダイアログ ボックスでは、検証に使用する RTL のタイプ (Verilog または VHDL) およびシミュレーションに使用する HDL シミュレータを選択できます。

1: [C-simulation Dialog] ダイアログ ボックス

このダイアログ ボックスには、次の設定があります。

[Simulator]
Vivado Design Suite でサポートされる HDL シミュレータの 1 つを選択します。デフォルトのシミュレータは、[Vivado XSIM] です。
[Language]
シミュレーションの出力言語を Verilog にするか VHDL にするかを選択します。
[Setup Only]
必要なシミュレーション ファイルを作成するのみで、シミュレーションは実行しません。シミュレーション実行ファイルは、後でコマンド シェルから実行できます。
[Optimizing Compile]
コンパイルに時間がかかっても、可能な場合はランタイム パフォーマンスを改善するために最適化を実行します。
[Input Arguments]
C テストベンチに対するコマンドライン引数を指定します。
[Dump Trace]
シミュレーション実行時に現在のソリューションの sim/Verilog または sim/VHDL ディレクトリに書き込まれるトレース ファイル出力のレベルを指定します。選択肢は、次のとおりです。
[all]
すべてのポートおよび信号波形データが出力され、トレース ファイルに保存されます。
[port]
最上位ポートの波形トレース データのみが出力されます。
[none]
トレース データは出力されません。
[Random Stall]
各データ転送にランダムなストールを適用します。
[Compiled Library Location]
サードパーティ シミュレータで使用するコンパイル済みのシミュレーション ライブラリのディレクトリを指定します。
[Extra Options for DATFLOW]
[Wave Debug]
RTL シミュレーションのすべてのプロセスを波形を表示します。これは、Vivado XSim シミュレータを使用する場合にのみサポートされます。オンにすると、シミュレータの GUI が起動し、シミュレーションで生成された波形でデータフローの動作を確認できます。
[Disable Deadlock Detection]
デッドロック検出をオフにし、協調シミュレーションのデッドロック ビューアー を協調シミュレーションで開きます。
[Channel Profiling (PIPO/FIFO)]
[Dataflow] ビュー に表示するプロファイル データの収集をイネーブルにします。
ヒント: C/RTL 協調シミュレーションの設定は、[Explorer] ビューでソリューションを右クリックし、Solutions Settings をクリックして、開いた [Solution Settings] ダイアログ ボックスから前もって変更できます。

C/RTL 協調シミュレーションが終了すると、コンソールに検証で問題が検出されなかったことを示す次のメッセージが表示されます。

INFO: [Common 17-206] Exiting xsim ...
INFO: [COSIM 212-316] Starting C post checking ...
Test passed !
INFO: [COSIM 212-1000] *** C/RTL co-simulation finished: PASS ***
INFO: [COSIM 212-211] II is measurable only when transaction number is greater than 1 in RTL simulation. 
Otherwise, they will be marked as NA. If user wants to calculate them, please make sure there are at 
least 2 transactions in RTL simulation.
Finished C/RTL cosimulation.

シミュレーション中には、C テストベンチの printf コマンドの結果もコンソールに表示されます。

テストベンチの記述 で説明するように、テストベンチでは最上位関数からの出力が合成のために検証され、出力が正しければ、テストベンチの main() 関数に 0 が返されます。Vitis HLS は C シミュレーションと C/RTL 協調シミュレーションの両方に同じ戻り値を使用して、結果が正しいかどうかを判断します。C テストベンチから 0 以外の値が返された場合、Vitis HLS でシミュレーションでエラーが発生したことがレポートされます。

シミュレーション後は協調シミュレーション レポートが自動的に開き、エラーなし (PASS) またはエラーあり (FAIL) と、レイテンシおよび II の測定の統計が表示されます。

ヒント: コンソール ウィンドウに示されるように、RTL シミュレーションのトランザクション数が 1 を超えない限り、協調シミュレーション レポートには II が NA と表示されます。テストベンチの記述 で説明するように、RTL シミュレーションに少なくとも 2 つのトランザクションがないと、II は計算できません。

C/RTL 協調シミュレーションの出力

C/RTL 協調シミュレーションが終了すると、solution フォルダー内に sim フォルダーが作成されます。このフォルダーには、次の要素が含まれます。
  • sim/report フォルダーには、シミュレーションされた RTL のタイプごとのレポートおよびログ ファイルが含まれます。
  • sim/verilog または vhdl という名前の検証フォルダーが検証される RTL 言語ごとに作成されます。
    • シミュレーションに使用された RTL ファイルは、verilog または vhdl フォルダーに保存されます。
    • RTL シミュレーションは、検証フォルダー内で実行されます。
    • トレース ファイルおよび波形ファイルなどの出力は、verilog または vhdl フォルダーに書き込まれます。
  • Vitis HLS では、sim/autowraptvwrap および wrap_pc などの作業フォルダーも使用されます。これらのフォルダーにユーザー ファイルはありません。
ヒント: [C/RTL Co-Simulation] ダイアログ ボックスで Setup Only オプションを選択すると、検証フォルダーに実行ファイルが作成されますが、シミュレーションは実行されません。シミュレーションは、コマンド プロンプトでこのシミュレーション .exe ファイルを実行すると、手動で実行できます。

RTL の自動検証

2: C/RTL 検証フロー


C/RTL 協調シミュレーションでは、C テストベンチを使用し、main() 関数を実行して、ビヘイビアー シミュレーションで実行される RTL デザインを自動的に検証します。C/RTL 検証プロセスには、次の 3 つの段階があります。

  1. C シミュレーションが実行され、最上位関数またはテスト対象デザイン (DUT) への入力が入力ベクターとして保存されます。
  2. 入力ベクターは、Vitis HLS で作成された RTL の Vivado シミュレータまたはサポートされるサードパーティ HDL シミュレータでの RTL シミュレーションに使用されます。RTL からの出力またはシミュレーションの結果は、出力ベクターとして保存されます。
  3. RTL シミュレーションからの出力ベクターは C テストベンチの main() 関数に戻され、結果が正しいかどうかが検証されます。C テストベンチで、場合によっては既知の良い結果と比較することにより、結果が検証されます。

次に、Vitis HLS から検証中に出力されるメッセージを示します。

C シミュレーション中:

INFO: [COSIM 212-14] Instrumenting C test bench ...
   Build using ".../bin/g++"
   Compiling dct_test.cpp_pre.cpp.tb.cpp
   Compiling dct_inline.cpp_pre.cpp.tb.cpp
   Compiling apatb_dct.cpp
   Generating cosim.tv.exe
INFO: [COSIM 212-302] Starting C TB testing ... 
Test passed !

この段階では、C シミュレーションが実行されているので、C テストベンチで生成されるメッセージはすべて、コンソール ビューまたはログ ファイルに出力されます。

RTL シミュレーション中:

INFO: [COSIM 212-333] Generating C post check test bench ...
INFO: [COSIM 212-12] Generating RTL test bench ...
INFO: [COSIM 212-1] *** C/RTL co-simulation file generation completed. ***
INFO: [COSIM 212-323] Starting verilog/vhdl simulation. 
INFO: [COSIM 212-15] Starting XSIM ...

この段階では、RTL シミュレーションからのメッセージはすべてコンソール ビューまたはログ ファイルに出力されます。

C テストベンチで結果をチェック中:

INFO: [COSIM 212-316] Starting C post checking ...
Test passed !
INFO: [COSIM 212-1000] *** C/RTL co-simulation finished: PASS ***

C/RTL 協調シミュレーションの要件は次のとおりです。

インターフェイス合成要件

C/RTL 協調シミュレーションを使用して RTL デザインを検証するには、次の条件のうち少なくとも 1 つが満たされている必要があります。

  • 最上位関数が ap_ctrl_chain または ap_ctrl_hs ブロック レベル インターフェイスを使用して合成されている。
  • デザインが純粋に組み合わせである。
  • 最上位関数の開始間隔 (II) が 1 である。
  • すべてのインターフェイスが、axis または ap_hs インターフェイス モードでインプリメントされるストリーミングの配列である。
    注記: hls::stream 変数は自動的に ap_fifo インターフェイスとしてインプリメントされます。ap_hs インターフェイスは Vitis カーネル フローではサポートされません。

これらの条件の少なくとも 1 つでも満たされない場合、次のメッセージが表示されて C/RTL 協調シミュレーションが停止します。

@E [SIM-345] Cosim only supports the following 'ap_ctrl_none' designs: (1) 
combinational designs; (2) pipelined design with task interval of 1; (3) designs with 
array streaming or hls_stream ports.
@E [SIM-4] *** C/RTL co-simulation finished: FAIL ***
重要: デザインがブロック レベルの I/O プロトコル ap_ctrl_none を使用するように指定されていて、デザインにブロッキング以外の動作を使用する hls::stream が含まれる場合は、C/RTL 協調シミュレーションが必ず終了するとは限りません。

最上位関数引数が AXI4-Lite インターフェイスとして指定されている場合、関数の戻り値も AXI4-Lite インターフェイスとして指定する必要があります。

DATAFLOW および DEPENDENCE の検証

C/RTL 協調シミュレーションでは、DATAFLOW および DEPENDENCE 指示子が自動的に検証されます。

DATAFLOW 指示子を使用してタスクをパイプライン処理すると、タスク間のデータフローを円滑にするため、タスク間にチャネルが挿入されます。通常チャネルは FIFO を使用してインプリメントされ、FIFO の深さは STREAM 指示子または config_dataflow コマンドで指定されます。FIFO の深さが小さすぎると、RTL シミュレーションが停止することがあります。たとえば、FIFO の深さ 2 に指定されている場合、コンシューマー タスクでデータ値が読み出される前にプロデューサー タスクが 3 つの値を書き込むと、FIFO がプロデューサーをブロックします。協調シミュレーションのデッドロック ビューアー に説明されているように、状況によってはこれによりデザイン全体が停止することがあります。

この場合、C/RTL 協調シミュレーションにより、DATAFLOW 領域のチャネルにより RTL シミュレーションが停止したことを示すメッセージが表示されます。


//////////////////////////////////////////////////////////////////////////////
// ERROR!!! DEADLOCK DETECTED at 1292000 ns! SIMULATION WILL BE STOPPED! //
//////////////////////////////////////////////////////////////////////////////
/////////////////////////
// Dependence cycle 1:
// (1): Process: hls_fft_1kxburst.fft_rank_rad2_nr_man_9_U0
//      Channel: hls_fft_1kxburst.stage_chan_in1_0_V_s_U, FULL
//      Channel: hls_fft_1kxburst.stage_chan_in1_1_V_s_U, FULL
//      Channel: hls_fft_1kxburst.stage_chan_in1_0_V_1_U, FULL
//      Channel: hls_fft_1kxburst.stage_chan_in1_1_V_1_U, FULL
// (2): Process: hls_fft_1kxburst.fft_rank_rad2_nr_man_6_U0
//      Channel: hls_fft_1kxburst.stage_chan_in1_2_V_s_U, EMPTY
//      Channel: hls_fft_1kxburst.stage_chan_in1_2_V_1_U, EMPTY
/////////////////////////////////
// Total 1 cycles detected!
/////////////////////////////////////////////////////////////

協調シミュレーション後に [Dataflow] ビューで関連するプロセスが赤で表示され、問題が示されます。この場合、タスク間のチャネルのインプリメンテーションを確認し、FIFO が生成されるデータを保持できるのに十分な大きさであることを確認してください。

同様に、RTL テストベンチでも、DEPENDENCE 指示子を使用して指定された偽依存を自動的に確認するよう設定されています。協調シミュレーションの警告メッセージは、偽依存ではなく、機能的に有効なデザインを達成するために対応する指示子を削除する必要があることを示します。

ヒント: cosim_design コマンドの -disable_deadlock_detection オプションは、これらのチェックをディスエーブルにします。

協調シミュレーションでサポートされない最適化

Vivado IP モードでは、自動 RTL 検証でインターフェイス上の配列または構造体内の配列に複数の変換を実行する状況はサポートされません。

重要: この機能は Vitis カーネル フローではサポートされません。

自動検証が実行されるようにするには、関数インターフェイスの配列、または関数インターフェイスの構造体内の配列で次の最適化のいずれか 1 つのみを使用する必要があります。

  • 同じサイズの配列の垂直マップ
  • 再形成
  • 分割 (配列の次元 1 に対して)

RTL 自動検証では、最上位関数インターフェイスで使用される次の最適化はサポートされません。

  • 水平マップ。
  • 異なるサイズの配列の垂直マップ。
  • レジスタ スライスをイネーブルにした AXI の条件付きアクセス。
  • 配列のストリームへのマップ。

IP コアのシミュレーション

デザインを浮動小数点コアを使用してインプリメントする場合、RTL シミュレータでその浮動小数点コアのビット精度モデルを使用できるようにしておく必要があります。これは、RTL シミュレーションを Vivado ロジック シミュレータで実行すると自動的に設定されます。ただし、サポートされるサードパーティの HDL シミュレータの場合、ザイリンクス浮動小数点ライブラリをあらかじめコンパイルし、シミュレータのライブラリに追加する必要があります。

たとえば、次は VCS シミュレータで使用できるようにザイリンクス浮動小数点ライブラリ (Verilog) をコンパイルする手順を示しています。

  1. Vivado IDE を開いて、[Tcl Console] ウィンドウに次のコマンドを入力します。
    compile_simlib -simulator vcs_mx -family all -language verilog
  2. このコマンドにより、現在のディレクトリに浮動小数点ライブラリが作成されます。
  3. ディレクトリ名については Vivado のコンソール ウィンドウを参照してください (例: ./rev3_1)。
この後、Vitis HLS の [Co-simulation] ダイアログ ボックスの Compiled Library Location でこのライブラリを参照する必要があります。または、次のコマンドを使用して C/RTL 協調シミュレーションを実行します。
cosim_design -tool vcs -compiled_library_dir <path_to_library>/rev3_1

RTL シミュレーションの解析

C/RTL 協調シミュレーションが終了すると、シミュレーション レポートが開き、計測されたレイテンシと II が表示されます。これらの結果は、HLS 合成後にレポートされたデザイン全体の絶対最短パスおよび最長パスに基づく値とは異なる場合があります。C/RTL 協調シミュレーション後の結果には、指定したシミュレーション データ セットでの実際のレイテンシと II であり、別の入力スティミュラスを使用すると変わる可能性があります。

パイプライン処理されていないデザインでは、C/RTL 協調シミュレーションで ap_start および ap_done 信号間のレイテンシが計測されます。すべての演算が終了した 1 サイクル後にデザインで新しい入力が読み出されるので、II はレイテンシより 1 長くなります。現在のトランザクションが終了してからしか次のトランザクションは開始されません。

パイプライン処理されたデザインでは、最初のトランザクションが終了する前に新しい入力が読み出されるので、トランザクションが終了する前に複数の ap_start および ap_ready 信号がある可能性があります。この場合、C/RTL 協調シミュレーションでレイテンシはデータ入力値とデータ出力値間のサイクル数として計測されます。II は、新しい入力を要求するために使用される ap_ready 信号間のサイクル数です。

注記: パイプライン処理されたデザインでは、C/RTL 協調シミュレーションの II 値は、デザインが複数のトランザクションでシミュレーションされた場合にのみ決定されます。

シミュレーション波形の表示

RTL 波形データを表示するには、[Co-simulation] ダイアログ ボックスで次を実行する必要があります。

  • RTL シミュレータに Vivado XSim を選択します。
  • Dump Traceport または all を選択します。

Vivado XSim が開き、RTL デザインのすべてのプロセスが表示されます。HLS デザイン内でアクティビティ プロセスを可視化すると、プロセス アクティビティおよび最上位モジュールの各アクティビティ内の長さの詳細なプロファイリングが可能になります。これにより、個別プロセスのパフォーマンスだけでなく、それぞれのプロセスの全体的な並行処理実行を解析しやすくなります。実行全体を占めるプロセスの方がパフォーマンスを改善する可能性が高く、プロセス実行時間を削減できます。

2 つのセクションに分割されます。

  • HLS プロセスのサマリには、すべてのプロセスのアクティビティ レポートの階層表示が含まれます。
    [DUT name]
    <name>
    [Function]
    <function name>
  • データフロー解析には、データフロー領域内のタスクに関する詳細なアクティビティ情報が含まれます。
    [DUT name]
    <name>
    [Function]
    <function name>
    [Dataflow/Pipeline Activity]
    データフロー プロセスとしてインプリメントされる場合に並列実行される関数の数を示します。
    [Active Iterations]
    現在のアクティブなデータフローのイテレーションを示します。行数は現在の実行を表示するため動的に増加します。
    [StallNoContinue]
    データフロー プロセスで出力のストールがあるかどうかを示すストール信号です。関数は完了しますが、隣接するデータフロー プロセスからの続行信号は受信していません。
    [RTL Signals]
    データフロー プロセスのトランザクション ビューを解釈するのに使用される RTL 制御信号です。
3: 波形ビューアー
C/RTL 協調シミュレーションが終了したら、Open Wave Viewer ツールバー ボタンをクリックするか、SolutionOpen Wave Viewer をクリックすると、Vivado IDE で RTL 波形を再び開くことができます。
重要: この方法で Vivado IDE を開く場合は、拡大/縮小、波形基数などの波形解析機能しか使用できません。

協調シミュレーションのデッドロック ビューアー

デッドロックとは、データフロー領域内のプロセスが同じチャネルを共有しており、お互いの書き込みまたは読み出しを妨害するために、両方のプロセスが停止してしまう状態のことです。この状況は、データフロー領域内のチャネルに FIFO または PIPO と FIFO の両方が使用されているよく発生します。

デッドロック ビューアーでは、スタティック データフロー表示でこのデッドロック状況を視覚化でき、問題のあるプロセスおよびチャネルがハイライトされます。問題のあるデータフロー チャネルから関連するソース コードへのクロスプローブが可能です。この情報を使用すると、問題をより短い時間と少ない労力で解決できます。ビューアーは、協調シミュレーションがデッドロック状態を検出し、実行を終了してからのみ開くことができます。

次に例を示します。データフロー領域には、PIPO と FIFO を介して通信する 2 つのプロセスがあります。proc_1 の最初のループは、data_array に書き込む前に、data_channel1 に 10 個のデータを書き込みます。FIFO の深さが十分でないため、data_channel ループが完了せず、残りのプロセスがブロックされます。この後、proc_2 は data_channel2 が空のためにデータを読み出せないのでブロックされ、data_channel1 からデータを削除できません。このためデッドロック状態になるので、data_channel1 のサイズを少なくとも 10 に増加する必要があります。

void example(hls::stream<data_t>& A, hls::stream<data_t>& B){
#pragma HLS dataflow
..
..
hls::stream<int> data_channel;
int data_array[10];
#pragma HLS STREAM variable=data_channel depth=8 dim=1
    proc_1(A, data_channel, data_array);
    proc_2(B, data_channel, data_array);
}

void proc_1(hls::stream<data_t>& A, hls::stream<int>& data_channel, int data_array[10]){
  …
  for(i = 0; i < 10; i++){
    tmp = A.read();
    tmp.data = tmp.data.to_int();
    data_channel.write(tmp.data);
  }
  for(i = 0; i < 10; i++){
      data_array[i] = i + tmp.data.to_int();
  }
}

void proc_2(hls::stream<data_t>& B, hls::stream<int>& data_channel, int data_array[10]){
  int i;
  ..
  ..
  for(i = 0; i < 10; i++){
      if (i == 0){
        tmp.data = data_channel.read() + data_array[5];
      }
      else {
        tmp.data = data_channel.read();
      }
    B.write(tmp);
  }
協調シミュレーション ログ:
///////////////////////////////////////////////////////////////////////////////////
// Inter-Transaction Progress: Completed Transaction / Total Transaction
// Intra-Transaction Progress: Measured Latency / Latency Estimation * 100%
//
// RTL Simulation : "Inter-Transaction Progress" ["Intra-Transaction Progress"] @ "Simulation Time"
////////////////////////////////////////////////////////////////////////////////////
// RTL Simulation : 0 / 1 [0.00%] @ "105000"
//////////////////////////////////////////////////////////////////////////////
// ERROR!!! DEADLOCK DETECTED at 132000 ns! SIMULATION WILL BE STOPPED! //
//////////////////////////////////////////////////////////////////////////////
/////////////////////////
// Dependence cycle 1:
// (1): Process: example_example.proc_1_U0
//      Channel: example_example.data_channel1_U, FULL
// (2): Process: example_example.proc_2_U0
//      Channel: example_example.data_array_U, EMPTY
////////////////////////////////////////////////////////////////////////
// Totally 1 cycles detected!
////////////////////////////////////////////////////////////////////////
4: デッドロック ビューアー

C/RTL 協調シミュレーションのデバッグ

C/RTL 協調シミュレーションが終了すると、通常 Vitis HLS からシミュレーションが正常に完了し、RTL デザインの機能が最初の C コードと一致していることが示されます。Vitis HLS では、C/RTL 協調シミュレーションでエラーがあると、次のようなメッセージが表示されます。

@E [SIM-4] *** C/RTL co-simulation finished: FAIL ***

C/RTL 協調シミュレーションでエラーが発生する主な原因は、次のとおりです。

  • 環境設定が間違っている
  • 適用された最適化指示子がサポートされていないか、間違っている
  • C テストベンチまたは C ソース コードに問題がある

C/RTL 協調シミュレーションのエラーをデバッグするには、次のセクションで説明するようにチェックを実行します。C/RTL 協調シミュレーションのエラーを解決できない場合は、ザイリンクス サポートからアンサー、資料、ダウンロード、フォーラムなどのサポート資料を参照してください。

環境の設定

次の表に示す環境設定を確認してください。

表 1. 環境設定のデバッグ
質問 必要な操作
サードパーティ シミュレータを使用していますか。

シミュレータ実行ファイルへのパスがシステム検索パスに指定されていることを確認します。

Vivado シミュレータを使用する場合は、検索パスを指定する必要はありません。

IP コアのシミュレーション の手順に従ってシミュレーション ライブラリをコンパイルします。

Linux を実行していますか。 セットアップ ファイル (.cshrc.bashrc など) に cd (change directory) コマンドが含まれていないことを確認します。C/RTL 協調シミュレーションを開始すると、新しいシェル プロセスが生成されます。セットアップ ファイルに cdcd コマンドが含まれていると、シェルが別のディレクトリで実行され、C/RTL 協調シミュレーションでエラーが発生します。

最適化指示子

次の表に示す最適化指示子を確認してください。

表 2. デバッグ最適化指示
質問 必要な操作
DEPENDENCE 指示子を使用していますか。

DEPENDENCE を削除して、C/RTL 協調シミュレーションが正常に完了するかどうかを確認します。

協調シミュレーションが正常に完了する場合は、DATAFLOW および DEPENDENCE の検証 に示すように、DEPENDENCE の TRUE または FALSE 設定が間違っている可能性があります。

最上位インターフェイスに volatile ポインターが使用されていますか。

DEPTH オプションが INTERFACE 指示子に指定されていることを確認します。

インターフェイスに volatile ポインターが使用されている場合、各トランザクションまたは C 関数の各実行ごとにポートで実行される読み出し/書き込みの数を指定する必要があります。

データフロー最適化と共に FIFO を使用していますか。

標準ピンポン バッファーを使用して C/RTL 協調シミュレーションが正常に完了するかどうかを確認します。

FIFO チャネルのサイズを指定せずに C/RTL 協調シミュレーションが正常に完了するかどうかを確認し、デフォルトでチャネルが C コードの配列サイズになるようにします。

C/RTL 協調シミュレーションが停止するまで FIFO チャネルのサイズを削減します。停止する場合は、チャネル サイズが小さすぎることを意味します。デザインを確認して、FIFO に最適なサイズを決定してください。FIFO のサイズを個別に指定するには、STREAM 指示子を使用できます。

サポートされているインターフェイスを使用していますか。 サポートされるインターフェイス モードを使用するようにしてください。詳細は、インターフェイス合成要件を参照してください。
インターフェイスの配列に複数の最適化指示子を適用していますか。 一緒に機能するよう設計された最適化を使用するようにしてください。詳細は、協調シミュレーションでサポートされない最適化を参照してください。
ストリームにマップされるインターフェイスに配列を使用していますか。 インターフェイス レベルのストリーミング (DUT の最上位関数) を使用するには、hls::stream を使用します。

C テストベンチおよび C ソース コード

次の表に示す C テストベンチおよび C ソース コードを確認してください。

表 3. C テストベンチおよび C ソース コードのデバッグ
質問 必要な操作
C テストベンチで結果がチェックされ、結果が正しい場合に値 0 が返されますか。 C/RTL 協調シミュレーションで C テストベンチから 0 が返されるようにしてください。結果が正しい場合でも、C テストベンチから値 0 が返されないと、C/RTL 協調シミュレーションでエラーがレポートされます。
C テストベンチは乱数に基づいて入力データを作成していますか。 乱数生成に固定シードを使用するようにテストベンチを変更します。乱数生成のシードが、タイム ベース シードなど、変数に基づく場合、シミュレーションに使用されるデータがテストベンチを実行するたびに異なり、結果が異なるものになります。
複数回アクセスされる最上位インターフェイスでポインターを使用していますか。 1 つのトランザクション (C 関数 1 回の実行) 内で複数回アクセスされるポインターには volatile ポインターを使用してください。volatile ポインターを使用しないと、C 標準に準拠するため、最初の読み出しと最後の書き込み以外のすべてが最適化で削除されます。
C コードに定義されていない値が含まれていたり、範囲外の配列アクセスが実行されたりしていますか。

全配列がすべてのアクセスと一致する正しいサイズになっていることを確認してください。問題の原因として、ループ範囲が配列のサイズを超えていることがよくあります (例: N-1 のサイズ指定された配列に N アクセス)。

C シミュレーションの結果に問題がないかどうか、出力値が乱数データ値に割り当てられていないかどうかを確認します。

Vitis HLS 外で業界標準の Valgrind アプリケーションを使用してみて、C コードに未定儀や範囲外の問題がないかどうかを確認することも考慮してください。

C 関数は、未定儀または範囲外の変数があっても、実行して完了する可能性があります。C シミュレーションでは未定儀の値に乱数が割り当てられますが、RTL シミュレーションでは不明または X 値が割り当てられます。

デザインに浮動小数点の数学演算を使用していますか。

精密な比較 (exact) を実行する代わりに、C テストベンチ結果が許容範囲のエラーであるかどうかを確認します。浮動小数点の数学演算の中には、RTL インプリメンテーションが C と同じではないものがあります。詳細は、検証および数学関数を参照してください。

サードパーティ シミュレータに、浮動小数点コアの RTL シミュレーション モデルを供給するようにします。詳細は、IP コアのシミュレーションを参照してください。

ザイリンクス IP ブロックとサードパーティ シミュレータを使用していますか。 ザイリンクス IP のシミュレーション モデルへのパスがサードパーティ シミュレータに渡されるようにします。
データ レートを変更する (間引きや補間など) デザインで hls::stream コンストラクトを使用していますか。

デザインを解析し、STREAM 指示子を使用して hls::stream をインプリメントするのに使用する FIFO のサイズを増加します。

デフォルトでは、hls::stream が深さ 2 の FIFO としてインプリメントされます。補間などによってデータ レートが増加する場合は、デフォルトの FIFO サイズ 2 では小さすぎ、C/RTL 協調シミュレーションが停止することがあります。

シミュレーションで大容量のデータ セットを使用していますか。

C/RTL 協調シミュレーションを実行する際は reduce_diskspace オプションを使用してください。このモードでは、Vitis HLS は一度に 1 トランザクションしか実行しません。シミュレーションは多少低速になる可能性がありますが、ストレージおよびシステム容量の問題は制限されます。

C/RTL 協調シミュレーションでは、すべてのトランザクションが一度に検証されます。最上位関数が複数回呼び出されると (ビデオの複数フレームをシミュレーションする場合など)、シミュレーション全体の入力および出力のデータがディスクに保存されます。マシンの設定と OS によっては、これがパフォーマンスや実行の問題の原因となることがあります。