サブプログラムの呼び出しスタックのサポート - 2023.2 日本語

Vivado Design Suite ユーザー ガイド: ロジック シミュレーション (UG900)

Document ID
UG900
Release Date
2023-10-18
Version
2023.2 日本語

この段階で、サブプログラム呼び出しをステップスルーして、get_value/set_value オプションを使用してサブプログラム内の自動変数およびスタティック変数にアクセスできるようになりました。

現在のところ、これらの変数にはサブプログラムが呼び出しスタックの一番上にある場合にのみアクセスできます。

次のオプションを使用すると、呼び出しスタックのどのレベルの変数にもアクセスできます。

Call Stacks ウィンドウ

Call Stacks ウィンドウには、現在のシミュレーション時間でサブプログラム内で待機中の VHDL/Verilog プロセスすべての HDL スコープが表示されます。これは get_stacks Tcl コマンドに類似しています。

デフォルトでは、Call Stacks ウィンドウでシミュレーションが停止する箇所 (サブプログラム内) のプロセスが選択されますが、サブプログラムで待機中のどのプロセスでも選択できます。Call Stack ウィンドウでプロセスを選択するのは、Scope ウィンドウからプロセス スコープを選択したり、current_scope Tcl コマンドを使用したりするのと同じことです。Call Stacks ウィンドウでプロセスを選択すると、アップデートされたプロセスが Scope ウィンドウ、Objects ウィンドウ、Stack Frames ウィンドウ、および Locals タブに表示されます。Call Stacks ウィンドウには、プロセス名と選択したプロセスの絶対パスとそのタイプが表示されます。

図 1. Call Stacks ウィンドウ

Stack Frames ウィンドウ

Stack Frames ウィンドウには、サブプログラム内で待機中の現在の HDL プロセスとその呼び出しスタック内のサブプログラムが表示されます。これは report_frames および current_frame Tcl コマンドに類似しています。[Stack Frames] ウィンドウには、現在の階層の最も最近のサブプログラムが一番上に、次に呼び出し元のサブプログラムが表示されます。呼び出し元の HDL プロセスは一番下に表示されます。その他のフレームを現在のフレームとして選択することもできます。これは、current_frame –set <selected_frame_index> Tcl コマンドでも設定できます。Objects ウィンドウの Locals タブには、サブプログラムのフレーム選択に従い、選択したサブプログラム フレームに対してローカルのスタティックおよび自動変数が表示されます。Stack Frames ウィンドウには、フレーム数、サブプログラム/プロセス名、ソース ファイル、選択した HDL プロセス、の現在の行が表示されます。

図 2. Stack Frames ウィンドウ

Objects ウィンドウの Locals タブ

Objects ウィンドウの Locals タブには、現在実行中 (または選択された) サブプログラムのローカルのスタティックおよび自動変数の名前、値、およびタイプが表示されます。これは get_objects –local Tcl コマンドに類似しています。このウィンドウは、Stack Frames ウィンドウで選択したフレームに従って表示されます。各変数/引数に対して、Locals タブに名前、値、タイプが表示されます。

図 3. Objects ウィンドウの Locals タブ

ダイナミック型を使用したデバッグ

SystemVerilog には、クラス、動的配列、キュー、連想配列などのダイナミック型があり、Vivado シミュレータでサポートされています。Vivado では、ダイナミック型変数をプローブできます。次に例を示します。

module top();
int dynamicArray[];
byte queue[$];
initial
begin
    dynamicArray = new[3];
    dynamicArray = '{10, 20, 30};
    queue.push_back(8'hab);
    queue.push_back(8'hff);
    #10;
    dynamicArray = new[5](dynamicArray);
    $display(queue.pop_front());
end
endmodule

ダイナミック型変数は、次を使用してプローブできます (次の図を参照)。

  • Objects ウィンドウ
  • Tcl Console ウィンドウで get_value および report_value コマンドを使用。
  • Sources ウィンドウのツール ヒント
    図 4. ダイナミック型のプローブ

    注記: ダイナミック型は、波形のトレース (add_wave) または波形データベースの作成 (log_wave) ではサポートされません。