<?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=Evaluate_%27for-generate%27_loop</id>
		<title>Evaluate 'for-generate' loop - 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=Evaluate_%27for-generate%27_loop"/>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Evaluate_%27for-generate%27_loop&amp;action=history"/>
		<updated>2026-05-02T12:45:10Z</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=Evaluate_%27for-generate%27_loop&amp;diff=822&amp;oldid=prev</id>
		<title>Hoa: Created page with &quot;C++ application:   &lt;nowiki&gt; #include &quot;veri_file.h&quot; #include &quot;VeriModule.h&quot; #include &quot;VeriBaseValue_Stat.h&quot; #include &quot;VeriVisitor.h&quot; #include &quot;VeriExpression.h&quot; #include &quot;VeriC...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.verific.com/faq/index.php?title=Evaluate_%27for-generate%27_loop&amp;diff=822&amp;oldid=prev"/>
				<updated>2022-11-17T22:32:33Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;C++ application:   &amp;lt;nowiki&amp;gt; #include &amp;quot;veri_file.h&amp;quot; #include &amp;quot;VeriModule.h&amp;quot; #include &amp;quot;VeriBaseValue_Stat.h&amp;quot; #include &amp;quot;VeriVisitor.h&amp;quot; #include &amp;quot;VeriExpression.h&amp;quot; #include &amp;quot;VeriC...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;C++ application:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&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;VeriBaseValue_Stat.h&amp;quot;&lt;br /&gt;
#include &amp;quot;VeriVisitor.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;VeriId.h&amp;quot;&lt;br /&gt;
#include &amp;quot;Map.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;
class MyVisitor : public VeriVisitor&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
    MyVisitor() : VeriVisitor(), _value_table(0) { }&lt;br /&gt;
    virtual ~MyVisitor() { }&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
    MyVisitor(const MyVisitor &amp;amp;) ;&lt;br /&gt;
    MyVisitor&amp;amp; operator=(const MyVisitor &amp;amp;) ;&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    virtual void VERI_VISIT(VeriGenerateFor, node)&lt;br /&gt;
    {&lt;br /&gt;
        Array genvars ;&lt;br /&gt;
        CheckForgenerate(node, genvars) ; // Accumulate genvars from this node&lt;br /&gt;
&lt;br /&gt;
        // Visit my items via base:&lt;br /&gt;
        VeriVisitor::VERI_VISIT_NODE(VeriGenerateFor, node) ; // genvars can be used here&lt;br /&gt;
&lt;br /&gt;
        RemoveGenVars(genvars) ; // Remove accumulated genvars from this node&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
    void CheckForgenerate(VeriGenerateFor &amp;amp;node, Array &amp;amp;genvars) ;&lt;br /&gt;
    void RemoveGenVars(Array &amp;amp;genvars) ;&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
    ValueTable _value_table ;&lt;br /&gt;
} ; // class MyVisitor&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
MyVisitor::CheckForgenerate(VeriGenerateFor &amp;amp;node, Array &amp;amp;genvars)&lt;br /&gt;
{&lt;br /&gt;
    node.Info(&amp;quot;Got a for-generate here&amp;quot;) ;&lt;br /&gt;
&lt;br /&gt;
    VeriModuleItem *initial = node.GetInitial() ;&lt;br /&gt;
    VeriExpression *cond = node.GetCondition() ;&lt;br /&gt;
    VeriModuleItem *rep = node.GetRepetition() ;&lt;br /&gt;
&lt;br /&gt;
    // Elaborate the initial statement:&lt;br /&gt;
    if (initial) (void) initial-&amp;gt;StaticElaborateStmt(&amp;amp;_value_table, 0) ;&lt;br /&gt;
&lt;br /&gt;
    // Find the genvar id:&lt;br /&gt;
    VeriIdDef *gen_id = (initial) ? initial-&amp;gt;GetId() : 0 ;&lt;br /&gt;
    if (!gen_id &amp;amp;&amp;amp; initial &amp;amp;&amp;amp; initial-&amp;gt;IsGenVarDecl()) {&lt;br /&gt;
        // For SV: it can be a genvar declaration as well:&lt;br /&gt;
        Array *ids = initial-&amp;gt;GetIds() ;&lt;br /&gt;
        gen_id = (ids &amp;amp;&amp;amp; ids-&amp;gt;Size()) ? (VeriIdDef*)ids-&amp;gt;GetFirst() : 0 ;&lt;br /&gt;
        genvars.Append(ids) ;&lt;br /&gt;
    } else if (gen_id) {&lt;br /&gt;
        genvars.Insert(gen_id) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (!gen_id) return ; // Must find a genvar here&lt;br /&gt;
&lt;br /&gt;
    // Get the starting value of the genvar elaborated before:&lt;br /&gt;
    VeriBaseValue *gen_var_val = _value_table.FetchValue(gen_id) ;&lt;br /&gt;
    if (!gen_var_val) return ; // This should have a value&lt;br /&gt;
&lt;br /&gt;
    int start_val = gen_var_val-&amp;gt;GetIntegerValue() ;&lt;br /&gt;
    node.Info(&amp;quot;  Starting at %s = %d&amp;quot;, gen_id-&amp;gt;Name(), start_val) ;&lt;br /&gt;
&lt;br /&gt;
    unsigned loop_limit = veri_file::GetLoopLimit() ; // Loop limit&lt;br /&gt;
&lt;br /&gt;
    int b_true = 0 ;&lt;br /&gt;
    unsigned loopcount = 0 ;&lt;br /&gt;
&lt;br /&gt;
    for(;;) {&lt;br /&gt;
        loopcount++ ;&lt;br /&gt;
        b_true = 0 ;&lt;br /&gt;
&lt;br /&gt;
        // Evaluate the condition:&lt;br /&gt;
        VeriBaseValue *final_value = cond-&amp;gt;StaticEvaluate(0, &amp;amp;_value_table) ;&lt;br /&gt;
        b_true = (final_value) ? final_value-&amp;gt;GetIntegerValue() : 0 ;&lt;br /&gt;
        delete final_value ; final_value = 0 ;&lt;br /&gt;
&lt;br /&gt;
        if (b_true) {&lt;br /&gt;
            // Check limit only when progress is made&lt;br /&gt;
            if (loop_limit &amp;amp;&amp;amp; (loopcount &amp;gt; loop_limit)) break ;&lt;br /&gt;
&lt;br /&gt;
            VeriBaseValue *gen_var_val = _value_table.FetchValue(gen_id) ;&lt;br /&gt;
            if (!gen_var_val) break ;&lt;br /&gt;
&lt;br /&gt;
            node.Info(&amp;quot;    Genvar %s = %d&amp;quot;, gen_id-&amp;gt;Name(), gen_var_val-&amp;gt;GetIntegerValue()) ;&lt;br /&gt;
        } else {&lt;br /&gt;
            // Condition is false: we are done:&lt;br /&gt;
            break ;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Elaborate the repeat statement:&lt;br /&gt;
        if (rep) (void) rep-&amp;gt;StaticElaborateStmt(&amp;amp;_value_table, 0) ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int done_val = start_val + ((loopcount) ? (loopcount-1) : 0) ;&lt;br /&gt;
    node.Info(&amp;quot;  Done at %s = %d&amp;quot;, gen_id-&amp;gt;Name(), done_val) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void&lt;br /&gt;
MyVisitor::RemoveGenVars(Array &amp;amp;genvars)&lt;br /&gt;
{&lt;br /&gt;
    unsigned i ;&lt;br /&gt;
    VeriIdDef *id ;&lt;br /&gt;
    FOREACH_ARRAY_ITEM(&amp;amp;genvars, i, id) {&lt;br /&gt;
        (void) _value_table.RemoveValue(id) ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    if (!veri_file::Analyze(&amp;quot;test.v&amp;quot;, veri_file::VERILOG_2K)) return 1 ;&lt;br /&gt;
&lt;br /&gt;
    MyVisitor mv ;&lt;br /&gt;
&lt;br /&gt;
    // Set any parameter to a new value if required: begin:&lt;br /&gt;
    Map old_param_val(POINTER_HASH) ;&lt;br /&gt;
    VeriIdDef *id = 0 ;&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
    // Set any parameter to a new value if required: begin:&lt;br /&gt;
    // If the for-generate loop depends on parameter, it will be evaluated with its default value.&lt;br /&gt;
    // Enable this block to set a specific overridden value for the parameter.&lt;br /&gt;
    VeriModule *test2 = veri_file::GetModule(&amp;quot;test2&amp;quot;) ;&lt;br /&gt;
    if (test2) {&lt;br /&gt;
        id = test2-&amp;gt;FindDeclared(&amp;quot;P&amp;quot;) ;&lt;br /&gt;
        if (id) {&lt;br /&gt;
            old_param_val.Insert(id, id-&amp;gt;TakeInitialValue()) ;&lt;br /&gt;
            VeriIntVal *val = new VeriIntVal(10) ;&lt;br /&gt;
            id-&amp;gt;Info(&amp;quot;Setting %s.%s = %d&amp;quot;, test2-&amp;gt;Name(), id-&amp;gt;Name(), val-&amp;gt;Integer()) ;&lt;br /&gt;
            id-&amp;gt;SetInitialValue(val) ;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Set any parameter to a new value if required: end:&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
    // Visit the for-generates and evaluate loop: begin:&lt;br /&gt;
    MapIter mi ;&lt;br /&gt;
    VeriModule *mod ;&lt;br /&gt;
    FOREACH_VERILOG_MODULE(mi, mod) {&lt;br /&gt;
        if (!mod) continue ;&lt;br /&gt;
        mod-&amp;gt;Info(&amp;quot;Checking module '%s'&amp;quot;, mod-&amp;gt;Name()) ;&lt;br /&gt;
        mod-&amp;gt;Accept(mv) ;&lt;br /&gt;
    }&lt;br /&gt;
    // Visit the for-generates and evaluate loop: end:&lt;br /&gt;
&lt;br /&gt;
    // Restore back to the old initial value: begin:&lt;br /&gt;
    VeriExpression *val ;&lt;br /&gt;
    FOREACH_MAP_ITEM(&amp;amp;old_param_val, mi, &amp;amp;id, &amp;amp;val) {&lt;br /&gt;
        if (!id || !val) continue ;&lt;br /&gt;
        delete id-&amp;gt;TakeInitialValue() ;&lt;br /&gt;
        id-&amp;gt;SetInitialValue(val) ;&lt;br /&gt;
    }&lt;br /&gt;
    // Restore back to the old initial value: end:&lt;br /&gt;
&lt;br /&gt;
    return 0 ;&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verilog testcase:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
     1	module top ;&lt;br /&gt;
     2	    test1 t1 () ;&lt;br /&gt;
     3	    test2 #(4) t2 () ;&lt;br /&gt;
     4	endmodule&lt;br /&gt;
     5&lt;br /&gt;
     6	module test1 ;&lt;br /&gt;
     7	    genvar i, j ;&lt;br /&gt;
     8	    generate&lt;br /&gt;
     9	        for (i=0; i&amp;lt;4; i=i+1) begin: l1&lt;br /&gt;
    10	            for (j=0; j&amp;lt;4; j=j+1) begin: l2&lt;br /&gt;
    11	            end&lt;br /&gt;
    12	        end&lt;br /&gt;
    13	    endgenerate&lt;br /&gt;
    14	endmodule&lt;br /&gt;
    15&lt;br /&gt;
    16	module test2 ;&lt;br /&gt;
    17	    parameter P = 0 ;&lt;br /&gt;
    18	    genvar i, j ;&lt;br /&gt;
    19	    generate&lt;br /&gt;
    20	        for (i=0; i&amp;lt;P; i=i+1) begin: l1&lt;br /&gt;
    21	            for (j=0; j&amp;lt;P; j=j+1) begin: l2&lt;br /&gt;
    22	            end&lt;br /&gt;
    23	        end&lt;br /&gt;
    24	    endgenerate&lt;br /&gt;
    25	endmodule&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&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.v' (VERI-1482)&lt;br /&gt;
test.v(4): INFO: Checking module 'top'&lt;br /&gt;
test.v(14): INFO: Checking module 'test1'&lt;br /&gt;
test.v(12): INFO: Got a for-generate here&lt;br /&gt;
test.v(12): INFO:   Starting at i = 0&lt;br /&gt;
test.v(12): INFO:     Genvar i = 0&lt;br /&gt;
test.v(12): INFO:     Genvar i = 1&lt;br /&gt;
test.v(12): INFO:     Genvar i = 2&lt;br /&gt;
test.v(12): INFO:     Genvar i = 3&lt;br /&gt;
test.v(12): INFO:   Done at i = 4&lt;br /&gt;
test.v(11): INFO: Got a for-generate here&lt;br /&gt;
test.v(11): INFO:   Starting at j = 0&lt;br /&gt;
test.v(11): INFO:     Genvar j = 0&lt;br /&gt;
test.v(11): INFO:     Genvar j = 1&lt;br /&gt;
test.v(11): INFO:     Genvar j = 2&lt;br /&gt;
test.v(11): INFO:     Genvar j = 3&lt;br /&gt;
test.v(11): INFO:   Done at j = 4&lt;br /&gt;
test.v(25): INFO: Checking module 'test2'&lt;br /&gt;
test.v(23): INFO: Got a for-generate here&lt;br /&gt;
test.v(23): INFO:   Starting at i = 0&lt;br /&gt;
test.v(23): INFO:   Done at i = 0&lt;br /&gt;
test.v(22): INFO: Got a for-generate here&lt;br /&gt;
test.v(22): INFO:   Starting at j = 0&lt;br /&gt;
test.v(22): INFO:   Done at j = 0&lt;br /&gt;
$&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hoa</name></author>	</entry>

	</feed>