• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Functional Verification
  3. C++ code through DPI?

Stats

  • Locked Locked
  • Replies 2
  • Subscribers 64
  • Views 15241
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

C++ code through DPI?

archive
archive over 18 years ago

Hi all,

I have to encapsulte some transaction layer C++ code using DPI, is there any example on how to do it?

Shall I simply replace gcc with g++ to compile my code?

Thanks!

Best regards,
Davy


Originally posted in cdnusers.org by davyzhu
  • Cancel
  • archive
    archive over 18 years ago

    Hi Davy,

    It depends on exactly what you are trying to do. DPI is a C interface, so you can't blindly compile the DPI code using g++ and have that work. At a minimum, you need to make sure that the import and export c functions are defined as extern "C" so that they don't use mangled names. The export functions will always be C functions (that is how the verilog simulator exposes them), so all you need to do is make sure that your header file has extern "C" in front of the import function name. Your import functions are presumably the functions which are wrapping your c++ code. Again, you should be able to just wrap the functions with extern "C".

    For instance, you can have the following:
    //my.cpp
    #include
    using namespace std;
    extern "C" void doit() ;
    void doit() {
    cout << "hi from doit" << endl;
    }
    //test.sv
    module test;
    initial doit();
    import"DPI" function void doit();
    endmodule

    Now, if what you want to do is call a class method from a dpi import function, you will need to be a little more clever. The easiest thing to do is to keep a map on the c++ side which has string (or integral) lookup keys to access specific objects. Then, you need the sv function call to include the key for the object that you want to execute the function on. This means basically wrapping each class method with a c function (there are tricks you can do like using the boost bind library to create a more generic way of doing this, but the basic requirments are still the same).

    john


    Originally posted in cdnusers.org by jlrose
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • archive
    archive over 18 years ago

    Hi John,

    Sorry for the ambiguous problem and I will try to clarify it. The C++ files mainly for reference model in testbench (written by other people).

    Now image I have a c++ file have just one class, and I can use your turn function in class to pure function method.

    But If I have a c++ file have several class (class A contains class B object, class B contains class C object , and so on), how can I modify so many things by hand. And I don't want to break the encapsulation for it will be hard for me to update the C++ code.

    Any suggestions are welcome!

    Best regards,
    Davy


    Originally posted in cdnusers.org by davyzhu
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information