How to get parameters creation-time initial expression/value after Static Elaboration

From Verific Design Automation FAQ
Jump to: navigation, search

To ensure the proper functionality of this example, please enable the `VERILOG_PRESERVE_CREATION_INIT_VALUE_OF_PARAMS` compile flag. This flag is necessary because it adds a field to VeriParamId that stores the design-specified initial value.

We cannot use GetInitialValue for this purpose, as its value is overwritten with the evaluated parameter value during Static Elaboration. However, the creation-time initial value added by the flag will remain unaffected by Static Elaboration.


C++:

#include <iostream>
#include "Map.h"            // Make class Map available
#include "veri_file.h"      // Make verilog reader available
#include "VeriModule.h"     // Definition of a VeriModule and VeriPrimitive
#include "VeriExpression.h" // Definition of a VeriExpression
#include "Array.h"          // Make class Array available
#include "VeriId.h"         // Definitions of all verilog identifier nodes

#ifdef VERIFIC_NAMESPACE
using namespace Verific ;
#endif
class ExModuleVisit : public VeriVisitor
{
public :
    ExModuleVisit() {}
    virtual ~ExModuleVisit() {}

    virtual void VERI_VISIT(VeriModule, node) 
    {
        std::cout << "-- Processing module " << node.GetName() << std::endl ;
        VeriVisitor::VERI_VISIT_NODE(VeriModule, node) ;
    }
    virtual void VERI_VISIT(VeriParamId, node)
    {
        std::cout << "--    Param " << node.GetName() << std::endl ;
        VeriExpression *init_val = node.GetInitialValue() ;
        if (init_val) {
            std::cout << "--        Initial value :" ;
            init_val->PrettyPrint(std::cout, 0) ; std::cout << std::endl ;
        }
        VeriExpression *creation_val = node.GetCreationInitialValue() ;
        if (creation_val) {
            std::cout << "--        Creation initial value :" ;
            creation_val->PrettyPrint(std::cout, 0) ; std::cout << std::endl ;
        }
    }
} ;


int main(int argc, char **argv)
{
#ifndef VERILOG_PRESERVE_CREATION_INIT_VALUE_OF_PARAMS
    std::cout << "Compile flag 'VERILOG_PRESERVE_CREATION_INIT_VALUE_OF_PARAMS' needs to be enabled for this application.\n"; 
    return 1 ;
#endif

    const char *file_name = 0 ;
    if (argc>1) {
        file_name = argv[1] ; // Set the file name as specified by the user
    } else {
        file_name = "test.sv" ; // Set default file name
    }
   
    if (!veri_file::Analyze(file_name, veri_file::SYSTEM_VERILOG)) return 1 ;
    
    // Return in case of failure.
    if (!veri_file::ElaborateStatic("top", "work", 0)) {
        return 4 ;
    }
    ExModuleVisit m_obj ;                
    VeriModule *mod ;
    MapIter mi ;
    FOREACH_VERILOG_MODULE(mi, mod) {
        if (!mod) continue ;
        std::cout << "\n-- Processing module " << mod->GetName() << std::endl ;
        mod->Accept(m_obj) ;
        std::cout << "--> Calling StaticEvaluateCreationInitValuesOfParams on " << mod->GetName() << std::endl ;
        mod->StaticEvaluateCreationInitValuesOfParams() ;
        mod->Accept(m_obj) ; 
        if (mod->ResetStaticEvaluatedCreationInitValuesOfParams()) {
            std::cout << "--> Successfully called ResetStaticEvaluatedCreationInitValuesOfParams on " << mod->GetName() << std::endl ;
            mod->Accept(m_obj) ; 
        }
    }
    return 0 ;
}
 

input test.sv:

module top ;
  parameter p1 = 3 ;
  parameter p2 = p1 + 3 ;
  parameter p3 = p2 + 4 ;

  foo #(p2) I1() ;
  foo #(p3) I2() ;
endmodule

module foo ;
   parameter p1 = 1 ;
   parameter p2 = p1 + 4 ;
endmodule


 

Output log:

-- Analyzing Verilog file 'test.sv' (VERI-1482)
test.sv(2): INFO: compiling module 'top' (VERI-1018)

-- Processing module top
-- Processing module top
--    Param p1
--        Initial value :3
--        Creation initial value :3
--    Param p2
--        Initial value :6
--        Creation initial value :(p1 + 3)
--    Param p3
--        Initial value :10
--        Creation initial value :(p2 + 4)
--> Calling StaticEvaluateCreationInitValuesOfParams on top
-- Processing module top
--    Param p1
--        Initial value :3
--        Creation initial value :3
--    Param p2
--        Initial value :6
--        Creation initial value :6
--    Param p3
--        Initial value :10
--        Creation initial value :10

-- Processing module foo
-- Processing module foo
--    Param p1
--        Initial value :1
--        Creation initial value :1
--    Param p2
--        Initial value :(p1 + 4)
--        Creation initial value :(p1 + 4)
--> Calling StaticEvaluateCreationInitValuesOfParams on foo
-- Processing module foo
--    Param p1
--        Initial value :1
--        Creation initial value :1
--    Param p2
--        Initial value :(p1 + 4)
--        Creation initial value :5
--> Successfully called ResetStaticEvaluatedCreationInitValuesOfParams on foo
-- Processing module foo
--    Param p1
--        Initial value :1
--        Creation initial value :1
--    Param p2
--        Initial value :(p1 + 4)
--        Creation initial value :(p1 + 4)

-- Processing module foo(p1=6)
-- Processing module foo(p1=6)
--    Param p1
--        Initial value :6
--        Creation initial value :1
--    Param p2
--        Initial value :10
--        Creation initial value :(p1 + 4)
--> Calling StaticEvaluateCreationInitValuesOfParams on foo(p1=6)
-- Processing module foo(p1=6)
--    Param p1
--        Initial value :6
--        Creation initial value :1
--    Param p2
--        Initial value :10
--        Creation initial value :5

-- Processing module foo(p1=10)
-- Processing module foo(p1=10)
--    Param p1
--        Initial value :10
--        Creation initial value :1
--    Param p2
--        Initial value :14
--        Creation initial value :(p1 + 4)
--> Calling StaticEvaluateCreationInitValuesOfParams on foo(p1=10)
-- Processing module foo(p1=10)
--    Param p1
--        Initial value :10
--        Creation initial value :1
--    Param p2
--        Initial value :14
--        Creation initial value :5