<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us"><generator uri="https://gohugo.io/" version="0.101.0">Hugo</generator><title type="html">cadence on A Scripter's Notes</title><subtitle type="html">Emacs, scripting and anything text oriented.</subtitle><link href="https://scripter.co/tags/cadence/" rel="alternate" type="text/html" title="HTML"/><link href="https://scripter.co/tags/cadence/index.xml" rel="alternate" type="application/rss+xml" title="RSS"/><link href="https://scripter.co/tags/cadence/atom.xml" rel="self" type="application/atom+xml" title="Atom"/><link href="https://scripter.co/tags/cadence/jf2feed.json" rel="alternate" type="application/jf2feed+json" title="jf2feed"/><updated>2026-04-22T08:24:57-04:00</updated><author><name>Kaushal Modi</name><email>kaushal.modi@gmail.com</email></author><id>https://scripter.co/tags/cadence/</id><entry><title type="html"> "Hello World" for SV/C++ DPI-C integration</title><link href="https://scripter.co/hello-world-for-sv-cpp-dpi-c-integration/?utm_source=atom_feed" rel="alternate" type="text/html"/><id>https://scripter.co/hello-world-for-sv-cpp-dpi-c-integration/</id><author><name>Kaushal Modi</name></author><published>2019-04-26T16:16:00-04:00</published><updated>2019-04-26T16:16:00-04:00</updated><content type="html"><![CDATA[<blockquote>A little example demonstrating calling a C++ written function in
SystemVerilog.</blockquote><div class="ox-hugo-toc toc">
<div class="heading">Table of Contents</div>
<ul>
<li><a href="#c-plus-plus-header">C++ Header</a></li>
<li><a href="#c-plus-plus-source-code">C++ Source Code</a></li>
<li><a href="#creating-shared-object--dot-so">Creating shared object (<code>.so</code>)</a>
<ul>
<li><a href="#verifying-that-the-dot-so-actually-contains-that-exported-function">Verifying that the <code>.so</code> actually contains that exported function</a></li>
</ul>
</li>
<li><a href="#systemverilog-test-bench">SystemVerilog test bench</a></li>
<li><a href="#result">Result</a></li>
</ul>
</div>
<!--endtoc-->
<p>Let&rsquo;s say we want to call a C++ function named <code>hello_from_cpp</code> in
SystemVerilog, and for simplicity, let&rsquo;s say that this is a <em>void</em>
returning function and takes no arguments.</p>

<h2 id="c-plus-plus-header">C++ Header&nbsp;<a class="headline-hash no-text-decoration" href="#c-plus-plus-header">#</a></h2>


<p>So that function signature would look like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">hello_from_cpp</span><span class="p">();</span>
</span></span></code></pre></div><p>We need to <strong>export</strong> that function from the C++ compiled library. So we
need to prefix that signature with the <code>extern</code> keyword and wrap it
with <code>extern &quot;C&quot;</code> as shown below, in <code>libdpi.h</code>:</p>
<p><a id="code-snippet--libdpi-h"></a></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// libdpi.h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#ifdef __cplusplus
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">extern</span> <span class="s">&#34;C&#34;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">  <span class="k">extern</span> <span class="kt">void</span> <span class="nf">hello_from_cpp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">#ifdef __cplusplus
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="cp">#endif
</span></span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--libdpi-h">Code Snippet 1</a>:</span>
  C++ Header file marking the <code>hello_from_cpp</code> function as <b>exportable</b>
</div>

<h2 id="c-plus-plus-source-code">C++ Source Code&nbsp;<a class="headline-hash no-text-decoration" href="#c-plus-plus-source-code">#</a></h2>


<p>And here&rsquo;s the implementation of that <code>hello_from_cpp</code> function in
C++:</p>
<p><a id="code-snippet--libdpi-cpp"></a></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// libdpi.cpp
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;libdpi.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span>
</span></span><span class="line"><span class="cl"><span class="nf">hello_from_cpp</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Hello from C++!</span><span class="se">\n</span><span class="s">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--libdpi-cpp">Code Snippet 2</a>:</span>
  Implementation of the <code>hello_from_cpp</code> function in C++
</div>

<h2 id="creating-shared-object--dot-so">Creating shared object (<code>.so</code>)&nbsp;<a class="headline-hash no-text-decoration" href="#creating-shared-object--dot-so">#</a></h2>


<p>Cadence Xcelium uses a <code>libdpi.so</code> by default as an &ldquo;SV/DPI Lib&rdquo;
(<code>-sv_lib</code> switch) if it is present in the compilation directory. So
we will simply compile the above to a <code>libdpi.so</code>.</p>
<p><a id="code-snippet--libdpi-cpp-build-steps"></a></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">g++ -c -fPIC libdpi.cpp -o libdpi.o
</span></span><span class="line"><span class="cl">g++ -shared -Wl,-soname,libdpi.so -o libdpi.so libdpi.o
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--libdpi-cpp-build-steps">Code Snippet 3</a>:</span>
  <code>g++</code> commands to compile <code>libdpi.cpp</code> into the shared object <code>libdpi.so</code>
</div>

<h3 id="verifying-that-the-dot-so-actually-contains-that-exported-function">Verifying that the <code>.so</code> actually contains that exported function&nbsp;<a class="headline-hash no-text-decoration" href="#verifying-that-the-dot-so-actually-contains-that-exported-function">#</a></h3>


<p>This is a <a href="https://stackoverflow.com/a/67985/1219634">wonderful SO answer</a> that taught me the existence of a CLI
GNU development tool called <code>nm</code>. From its <em>man</em> page, this utility nm
list symbols from object files.</p>
<p>Here, I need to know which symbols from the text/code section got
exported to the <code>libdpi.so</code>. When I did <code>nm libdpi.so</code>, it listed
about two dozen symbols, most of which were gibberish to me. But the
symbol that I cared about: <code>hello_from_cpp</code> has a <strong>T</strong> before it.</p>
<p><a href="http://man7.org/linux/man-pages/man1/nm.1.html"><code>man nm</code></a> says this about that <strong>T</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&#34;T&#34;
</span></span><span class="line"><span class="cl">&#34;t&#34; The symbol is in the text (code) section.
</span></span></code></pre></div><p>So after kind of understanding that, I do:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">nm libdpi.so <span class="p">|</span> rg <span class="s1">&#39;\bT\b&#39;</span>
</span></span></code></pre></div><p>and I get:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">0000000000000888 T _fini
</span></span><span class="line"><span class="cl">0000000000000698 T _init
</span></span><span class="line hl"><span class="cl">00000000000007cc T hello_from_cpp
</span></span></code></pre></div>
<h2 id="systemverilog-test-bench">SystemVerilog test bench&nbsp;<a class="headline-hash no-text-decoration" href="#systemverilog-test-bench">#</a></h2>


<p>With the <code>libdpi.so</code> object containing the exported <code>hello_from_cpp</code>
ready, we just need to <em>DPI-C import</em> it into the SystemVerilog test
bench.</p>
<p><a id="code-snippet--libdpi-cpp-sv-tn"></a></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-systemverilog" data-lang="systemverilog"><span class="line"><span class="cl"><span class="k">program</span> <span class="n">top</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="kn">import</span> <span class="s">&#34;DPI-C&#34;</span> <span class="k">function</span> <span class="k">void</span> <span class="n">hello_from_cpp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">initial</span> <span class="k">begin</span>
</span></span><span class="line"><span class="cl">    <span class="n">hello_from_cpp</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="nb">$finish</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">endprogram</span> <span class="o">:</span> <span class="n">top</span>
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--libdpi-cpp-sv-tn">Code Snippet 4</a>:</span>
  SystemVerilog test bench importing function from C++
</div>

<h2 id="result">Result&nbsp;<a class="headline-hash no-text-decoration" href="#result">#</a></h2>


<p>And running:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">xrun -64bit tb.sv
</span></span></code></pre></div><p>gives:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">xcelium&gt; run
</span></span><span class="line"><span class="cl">Hello from C++!
</span></span></code></pre></div>]]></content><category scheme="https://scripter.co/categories/systemverilog" term="systemverilog" label="systemverilog"/><category scheme="https://scripter.co/tags/dpi-c" term="dpi-c" label="dpi-c"/><category scheme="https://scripter.co/tags/cpp" term="cpp" label="cpp"/><category scheme="https://scripter.co/tags/cadence" term="cadence" label="cadence"/><category scheme="https://scripter.co/tags/xcelium" term="xcelium" label="xcelium"/></entry></feed>