<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.verific.com/faq/index.php?action=history&amp;feed=atom&amp;title=How_to_traverse_scope_hierarchy</id>
		<title>How to traverse scope hierarchy - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://www.verific.com/faq/index.php?action=history&amp;feed=atom&amp;title=How_to_traverse_scope_hierarchy"/>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=How_to_traverse_scope_hierarchy&amp;action=history"/>
		<updated>2026-05-02T12:43:46Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.3</generator>

	<entry>
		<id>https://www.verific.com/faq/index.php?title=How_to_traverse_scope_hierarchy&amp;diff=746&amp;oldid=prev</id>
		<title>Hoa at 21:45, 26 October 2021</title>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=How_to_traverse_scope_hierarchy&amp;diff=746&amp;oldid=prev"/>
				<updated>2021-10-26T21:45:38Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 21:45, 26 October 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l69&quot; &gt;Line 69:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 69:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; files.InsertLast(&amp;quot;test.sv&amp;quot;) ;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; files.InsertLast(&amp;quot;test.sv&amp;quot;) ;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; if (!veri_file::AnalyzeMultipleFiles(&amp;amp;files, veri_file::SYSTEM_VERILOG)) return 1 ;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; if (!veri_file::AnalyzeMultipleFiles(&amp;amp;files, veri_file::SYSTEM_VERILOG)) return 1 ;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; // need to run static elaboration if any interface/module is parameterized&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;#160; &amp;#160; if (!veri_file::ElaborateAllStatic()) return 1 ;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; MapIter mi ;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; &amp;#160; MapIter mi ;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hoa</name></author>	</entry>

	<entry>
		<id>https://www.verific.com/faq/index.php?title=How_to_traverse_scope_hierarchy&amp;diff=602&amp;oldid=prev</id>
		<title>Hoa: Created page with &quot;C++ code:   &lt;nowiki&gt; #include &lt;iostream&gt; #include &lt;cstring&gt; // strchr #include &quot;veri_file.h&quot; #include &quot;VeriModule.h&quot; #include &quot;VeriExpression.h&quot; #include &quot;VeriConstVal.h&quot; #inc...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=How_to_traverse_scope_hierarchy&amp;diff=602&amp;oldid=prev"/>
				<updated>2021-02-01T21:02:52Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;C++ code:   &amp;lt;nowiki&amp;gt; #include &amp;lt;iostream&amp;gt; #include &amp;lt;cstring&amp;gt; // strchr #include &amp;quot;veri_file.h&amp;quot; #include &amp;quot;VeriModule.h&amp;quot; #include &amp;quot;VeriExpression.h&amp;quot; #include &amp;quot;VeriConstVal.h&amp;quot; #inc...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;C++ code:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt; // strchr&lt;br /&gt;
#include &amp;quot;veri_file.h&amp;quot;&lt;br /&gt;
#include &amp;quot;VeriModule.h&amp;quot;&lt;br /&gt;
#include &amp;quot;VeriExpression.h&amp;quot;&lt;br /&gt;
#include &amp;quot;VeriConstVal.h&amp;quot;&lt;br /&gt;
#include &amp;quot;VeriScope.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Array.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Map.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Set.h&amp;quot;&lt;br /&gt;
#include &amp;quot;VeriId.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#ifdef VERIFIC_NAMESPACE&lt;br /&gt;
using namespace Verific ;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
void PrintScopeHierarchy(VeriScope *scope, unsigned depth)&lt;br /&gt;
{&lt;br /&gt;
    if (!scope) return ;&lt;br /&gt;
    char *prefix = 0 ;&lt;br /&gt;
    if (depth) {&lt;br /&gt;
        prefix = Strings::allocate(depth*4 +3) ;&lt;br /&gt;
        unsigned i ;&lt;br /&gt;
        for (i = 0; i &amp;lt; (depth *4); i++) prefix[i] = ' ' ;&lt;br /&gt;
        prefix[i] = 0 ;&lt;br /&gt;
    }&lt;br /&gt;
    VeriIdDef *owner = scope-&amp;gt;GetOwner() ;&lt;br /&gt;
    VeriScope *upper = scope-&amp;gt;Upper() ;&lt;br /&gt;
    Map *declared_ids = scope-&amp;gt;DeclArea() ;&lt;br /&gt;
    MapIter mi ;&lt;br /&gt;
    char *name ;&lt;br /&gt;
    char *ids = 0 ;&lt;br /&gt;
    FOREACH_MAP_ITEM(declared_ids, mi, &amp;amp;name, 0) {&lt;br /&gt;
        const char *first_space = std::strchr(name, ' ') ;&lt;br /&gt;
        if (first_space &amp;amp;&amp;amp; Strings::compare(first_space, name)) continue ;&lt;br /&gt;
&lt;br /&gt;
        if (!ids) {&lt;br /&gt;
            ids = Strings::save(name) ;&lt;br /&gt;
        } else {&lt;br /&gt;
            char *tmp = ids ;&lt;br /&gt;
            ids = Strings::save(ids, &amp;quot;, &amp;quot;, name) ;&lt;br /&gt;
            Strings::free(tmp) ;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (upper) {&lt;br /&gt;
        (void) Message::Msg(VERIFIC_INFO, 0, 0, &amp;quot;%s |---Owner : %s : (defines : %s )&amp;quot;,prefix ? prefix : &amp;quot;&amp;quot;,&lt;br /&gt;
                            owner ? owner-&amp;gt;Name(): (scope-&amp;gt;IsEmptyScope() ? &amp;quot;empty&amp;quot;: &amp;quot;none&amp;quot;), ids) ;&lt;br /&gt;
    } else {&lt;br /&gt;
        (void) Message::Msg(VERIFIC_INFO, 0, 0, &amp;quot;Owner : %s : (defines : %s )&amp;quot;,&lt;br /&gt;
                            owner ? owner-&amp;gt;Name(): (scope-&amp;gt;IsEmptyScope() ? &amp;quot;empty&amp;quot;: &amp;quot;none&amp;quot;), ids) ;&lt;br /&gt;
    }&lt;br /&gt;
    Strings::free(ids) ;&lt;br /&gt;
    Strings::free(prefix) ;&lt;br /&gt;
&lt;br /&gt;
    Set *children = scope-&amp;gt;GetChildrenScopes() ;&lt;br /&gt;
    SetIter si ;&lt;br /&gt;
    VeriScope *child ;&lt;br /&gt;
    FOREACH_SET_ITEM(children, si, &amp;amp;child) {&lt;br /&gt;
        PrintScopeHierarchy(child, depth+1) ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
    Array files ;&lt;br /&gt;
    files.InsertLast(&amp;quot;test.sv&amp;quot;) ;&lt;br /&gt;
    if (!veri_file::AnalyzeMultipleFiles(&amp;amp;files, veri_file::SYSTEM_VERILOG)) return 1 ;&lt;br /&gt;
&lt;br /&gt;
    MapIter mi ;&lt;br /&gt;
    VeriModule *module ;&lt;br /&gt;
    FOREACH_VERILOG_MODULE(mi, module) {&lt;br /&gt;
        if (!module) continue ;&lt;br /&gt;
        if (module-&amp;gt;IsInterface()) continue ;&lt;br /&gt;
&lt;br /&gt;
        PrintScopeHierarchy(module-&amp;gt;GetScope(), 0) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0 ;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Verilog testcase:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
module array8(data_in, data_out);&lt;br /&gt;
&lt;br /&gt;
input [0:127] data_in;&lt;br /&gt;
output [0:3] data_out;&lt;br /&gt;
&lt;br /&gt;
wire [7:0] arr[3:0][3:0]; // 2d array with word size 8&lt;br /&gt;
wire [4:0] out_arr[3:0];&lt;br /&gt;
genvar i, j;&lt;br /&gt;
&lt;br /&gt;
    generate&lt;br /&gt;
    for (i = 0; i &amp;lt; 4; i = i + 1) begin : l1&lt;br /&gt;
        for (j = 0; j &amp;lt; 4; j = j + 1) begin : l2&lt;br /&gt;
        assign arr[i][j] = data_in[(4*i*8 + 8*j) +: 8];&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    endgenerate&lt;br /&gt;
&lt;br /&gt;
    generate&lt;br /&gt;
    for (i = 0; i &amp;lt; 4; i = i + 1) begin : l3&lt;br /&gt;
        adder_4_4 I (arr[i][0][7 -: 4], arr[i][1][6:3],&lt;br /&gt;
                      arr[i][2][3:0], arr[i][3][4 -: 4],&lt;br /&gt;
              out_arr[i]);&lt;br /&gt;
        assign data_out[i] = out_arr[i][4];&lt;br /&gt;
    end&lt;br /&gt;
    endgenerate&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
module adder_4_4(in1, in2, in3, in4, out1);&lt;br /&gt;
input [3:0] in1;&lt;br /&gt;
input [3:0] in2;&lt;br /&gt;
input [3:0] in3;&lt;br /&gt;
input [3:0] in4;&lt;br /&gt;
output [4:0] out1;&lt;br /&gt;
reg [4:0] out1;&lt;br /&gt;
&lt;br /&gt;
    always@(in1, in2, in3, in4)&lt;br /&gt;
    begin&lt;br /&gt;
        out1 = in1 + in2 + in3 + in4;&lt;br /&gt;
    end&lt;br /&gt;
endmodule&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Run:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
$ test-linux&lt;br /&gt;
-- Analyzing Verilog file 'test.sv' (VERI-1482)&lt;br /&gt;
INFO: Owner : array8 : (defines : data_in, data_out, arr, out_arr, i, j, l1, l3 )&lt;br /&gt;
INFO:      |---Owner : empty : (defines : (null) )&lt;br /&gt;
INFO:          |---Owner : l1 : (defines : i, l2 )&lt;br /&gt;
INFO:              |---Owner : empty : (defines : (null) )&lt;br /&gt;
INFO:                  |---Owner : l2 : (defines : j )&lt;br /&gt;
INFO:      |---Owner : empty : (defines : (null) )&lt;br /&gt;
INFO:          |---Owner : l3 : (defines : i, I )&lt;br /&gt;
INFO: Owner : adder_4_4 : (defines : in1, in2, in3, in4, out1 )&lt;br /&gt;
INFO:      |---Owner : empty : (defines : (null) )&lt;br /&gt;
$&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hoa</name></author>	</entry>

	</feed>