子程序调用栈支持 - 2023.2 简体中文

Vivado Design Suite 用户指南: 逻辑仿真 (UG900)

Document ID
UG900
Release Date
2023-10-18
Version
2023.2 简体中文

现在,您可使用 get_value/set_value 选项来单步执行子程序调用并访问子程序内部的自动变量和静态变量。

当前,如果子程序位于调用栈顶层,那么您只能访问这些变量。

以下选项可用于支持访问位于调用栈的任意级别的变量。

Call Stacks窗口

如果设计中的 VHDL/Verilog 进程包含在某个子程序中,并且正在等待当前仿真时间,那么Call Stacks(调用栈)窗口可显示所有这些进程的 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_framescurrent_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 中存在 Class(类)、Dynamic Array(动态阵列)、Queue(队列)和 Associative Array(关联阵列)等动态类型。这些动态类型在 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(Tcl 控制台)窗口,使用 get_valuereport_value 命令即可。
  • Sources窗口中的工具提示
    图 4. 探测动态类型

    注释: 不支持用于追踪波形 (add_wave) 或用于创建波形数据库 (log_wave) 的动态类型。