report_frames - 2023.2 English

Vivado Design Suite Tcl Command Reference Guide (UG835)

Document ID
Release Date
2023.2 English

Print, in textual format, stack frames when current_scope is a process waiting inside subprogram


report_frames [‑quiet] [‑verbose]


Returns string


Name Description
[-quiet] Ignore command errors
[-verbose] Suspend message limits during command execution



Returns a list of strings of sub-program names, and the calling HDL process in the sub-program call hierarchy for the current HDL process scope, or current_scope. The list starts with the HDL process till the most recent sub-program in the hierarchy. Each frame has an associated frame-index. The most recent sub-program is shown at the top, and has an index "0". The symbol (->) is used to indicate the current_frame.

By default, the most recently called sub-program frame is the current_frame. Other frames can be selected using current_frame command. In verbose mode, output gives the source line-file information for each and every call.

Important: report_frames strictly follows the current_scope. If the current_scope is not an HDL process scope waiting inside a sub-program, the command returns an empty list.

This command returns the name of the design object of the current_instance, or returns nothing when set to the top of current design.


-verbose - (Optional) Verbose mode. Gives source line-file information for every call. The source file name would include its absolute full path.

-quiet - (Optional) Execute the command quietly, returning no messages from the command. The command also returns TCL_OK regardless of any errors encountered during execution.
Note: Any errors encountered on the command-line, while launching the command, will be returned. Only errors occurring inside the command will be trapped.


Example design:

module top;
       int i;
       function void f(input int in1);
           automatic int a;
           a = in1 + 7;
           $display($time, " in f :: a %d in1 %d ", a, in1);
       task automatic t(input int in2);
           int b;
           b = in2 + 10;
           $display($time, " in t :: in2 %d b %d ", in2, b);
           f(b);    // Case C
           $display($time, " Back in t : after wait and f(%d) ", b);
       initial begin                         // "/top/Initial18_0"
           $display($time, " in initial 1 ");
           i = 200;
           t(i);        // Case B
           $display($time, " Back in initial 1 after t(%d) ", i);
       initial begin                         // "/top/Initial25_1"
           $display($time, " in initial 2 ");
           f(50);       // Case A
           $display($time, " Back in initial 2 after f(50) ");

When simulation is stopped inside function "f" for its call at 'Case C', function "f" is called from task "t" at 'Case C', which itself is called from process "/top/Initial18_0" at 'Case B':

> current_scope
   1. > report_frames
      -> 0 : f
         1 : t
           2: /top/Initial18_0
   2. > report_frames -verbose
      -> 0 : f @top.v:6
           1 : t @top.v:15
          2 : /top/Initial18_0 @top.v:21