<?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">methods on A Scripter's Notes</title><subtitle type="html">Emacs, scripting and anything text oriented.</subtitle><link href="https://scripter.co/tags/methods/" rel="alternate" type="text/html" title="HTML"/><link href="https://scripter.co/tags/methods/index.xml" rel="alternate" type="application/rss+xml" title="RSS"/><link href="https://scripter.co/tags/methods/atom.xml" rel="self" type="application/atom+xml" title="Atom"/><link href="https://scripter.co/tags/methods/jf2feed.json" rel="alternate" type="application/jf2feed+json" title="jf2feed"/><updated>2026-04-22T08:24:58-04:00</updated><author><name>Kaushal Modi</name><email>kaushal.modi@gmail.com</email></author><id>https://scripter.co/tags/methods/</id><entry><title type="html">Generics (not exactly) in SystemVerilog</title><link href="https://scripter.co/generics-not-exactly-in-systemverilog/?utm_source=atom_feed" rel="alternate" type="text/html"/><link href="https://scripter.co/sidenotes-using-ox-hugo/?utm_source=atom_feed" rel="related" type="text/html" title="Sidenotes using ox-hugo"/><link href="https://scripter.co/sidenotes-using-only-css/?utm_source=atom_feed" rel="related" type="text/html" title="Sidenotes using only CSS"/><link href="https://scripter.co/nim-deploying-static-binaries/?utm_source=atom_feed" rel="related" type="text/html" title="Nim: Deploying static binaries"/><id>https://scripter.co/generics-not-exactly-in-systemverilog/</id><author><name>Kaushal Modi</name></author><published>2022-02-11T01:48:00-05:00</published><updated>2022-02-11T01:48:00-05:00</updated><content type="html"><![CDATA[<blockquote>Using <em>parameterized classes</em> with <em>static functions</em> to make up for
the lack of generics in SystemVerilog.</blockquote><div class="ox-hugo-toc toc">
<div class="heading">Table of Contents</div>
<ul>
<li><a href="#a-real-generics-example">A real <em>Generics</em> example</a></li>
<li><a href="#poor-man-s-generics-in-systemverilog"><em>Poor man&rsquo;s Generics</em> in SystemVerilog</a>
<ul>
<li><a href="#parameterized-classes">Parameterized Classes</a></li>
<li><a href="#static-methods">Static methods</a></li>
<li><a href="#should-compile-with-all-types-t">Should compile with all types <em>T</em></a></li>
</ul>
</li>
<li><a href="#final-code">Final Code</a></li>
<li><a href="#cluelib">Cluelib</a></li>
</ul>
</div>
<!--endtoc-->
<p>Many modern languages like <a href="https://nim-lang.org">Nim</a> allow defining <em>Generic</em> functions
types, etc that can work for any type. See Nim Manual <a href="#citeproc_bib_item_2">2022</a> <em>Generics</em>.</p>
<p>This post demonstrates how you can make generics <em>kind of</em> (if you
really squint your eyes, you can see it 😄) work with
SystemVerilog.</p>

<h2 id="a-real-generics-example">A real <em>Generics</em> example&nbsp;<a class="headline-hash no-text-decoration" href="#a-real-generics-example">#</a></h2>


<p>The focus of this post is not how to write generics in Nim, but here&rsquo;s
a quick summary:</p>
<ul>
<li><a href="#org-coderef--51b0fc-1">Line 1</a> overloads the <code>+</code> operator for any type <code>T</code>.</li>
<li><a href="#org-coderef--51b0fc-2">Line 2</a> is a <strong>compile time</strong> check (using <code>when</code>) to
see if <code>T</code> is a <em>string</em>, and then concatenates <em>a</em> and <em>b</em> inputs
using the <code>&amp;</code> <em>string concat</em> operator.</li>
<li>For <a href="#org-coderef--51b0fc-4">other types</a>, it does the expected &ldquo;a + b&rdquo;.</li>
</ul>
<!--listend-->
<p><a id="code-snippet--code-generics-nim"></a></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="org-coderef--51b0fc-1"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-1">1</a>
</span><span class="lnt" id="org-coderef--51b0fc-2"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-2">2</a>
</span><span class="lnt" id="org-coderef--51b0fc-3"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-3">3</a>
</span><span class="lnt" id="org-coderef--51b0fc-4"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-4">4</a>
</span><span class="lnt" id="org-coderef--51b0fc-5"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-5">5</a>
</span><span class="lnt" id="org-coderef--51b0fc-6"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-6">6</a>
</span><span class="lnt" id="org-coderef--51b0fc-7"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-7">7</a>
</span><span class="lnt" id="org-coderef--51b0fc-8"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-8">8</a>
</span><span class="lnt" id="org-coderef--51b0fc-9"><a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-9">9</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-nim" data-lang="nim"><span class="line"><span class="cl"><span class="k">proc </span><span class="nf">`+`</span><span class="o">[</span><span class="n">T</span><span class="o">]</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">:</span> <span class="n">T</span><span class="p">):</span> <span class="n">T</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">  <span class="k">when</span> <span class="n">T</span> <span class="ow">is</span> <span class="kt">string</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">a</span> <span class="o">&amp;</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl">  <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span>
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="mf">100.1</span> <span class="o">+</span> <span class="mf">100.2</span>
</span></span><span class="line"><span class="cl"><span class="n">echo</span> <span class="s">&#34;x&#34;</span> <span class="o">+</span> <span class="s">&#34;y&#34;</span> <span class="o">+</span> <span class="s">&#34;z&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--code-generics-nim">Code Snippet 1</a>:</span>
  Example of generics in Nim
</div>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">3
</span></span><span class="line"><span class="cl">200.3
</span></span><span class="line"><span class="cl">xyz
</span></span></code></pre></div><p>We will now see how to write something like this in SystemVerilog.</p>

<h2 id="poor-man-s-generics-in-systemverilog"><em>Poor man&rsquo;s Generics</em> in SystemVerilog&nbsp;<a class="headline-hash no-text-decoration" href="#poor-man-s-generics-in-systemverilog">#</a></h2>


<p>SystemVerilog is a strongly typed compiled language. So you need to
define the types for <em>function</em> and <em>task</em> arguments.</p>
<p>So if you need an <em>add</em> function for integers, you would do:</p>
<p><a id="code-snippet--sv-add-int"></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">function</span> <span class="k">int</span> <span class="n">add_int</span><span class="p">(</span><span class="k">input</span> <span class="k">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">endfunction</span>
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--sv-add-int">Code Snippet 2</a>:</span>
  <code>add_int</code> for adding integers
</div>
<p>If you need an <em>add</em> function for real numbers, you would do:</p>
<p><a id="code-snippet--sv-add-real"></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">function</span> <span class="k">real</span> <span class="n">add_real</span><span class="p">(</span><span class="k">input</span> <span class="k">real</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">endfunction</span>
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--sv-add-real">Code Snippet 3</a>:</span>
  <code>add_real</code> for adding reals (doubles)
</div>
<p>I am using the <strong>add</strong> functions here only to demonstrate the
concept. In real world code, you would come across many cases where
you would want to avoid such function redefinitions. Some examples
are: dealing with objects of different classes, or queues with
elements of different types (e.g. queues of <em>ints</em>, queues of
<em>strings</em>), or dynamic arrays of different types, etc.</p>

<h3 id="parameterized-classes">Parameterized Classes&nbsp;<a class="headline-hash no-text-decoration" href="#parameterized-classes">#</a></h3>


<p>In <a href="#code-snippet--sv-add-int"><code>add_int</code></a>, we see that the type <code>int</code> has to be specified in the
function signature. That <code>int</code> can be replaced by a <em>parameter</em>
representing a <em>type</em> only if that function is defined inside a
<em>parameterized class</em> (See <span style="color:grey;">§</span> <strong>Parameterized classes</strong> <a href="#citeproc_bib_item_1">2018, sec. 8.25</a>).</p>
<p>So it would look like this:</p>
<p><a id="code-snippet--parameterized-class1-sv"></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">class</span> <span class="n">math</span> <span class="p">#(</span><span class="k">parameter</span> <span class="k">type</span> <span class="n">T</span> <span class="o">=</span> <span class="k">int</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">function</span> <span class="n">T</span> <span class="n">add</span><span class="p">(</span><span class="k">input</span> <span class="n">T</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">endfunction</span>
</span></span><span class="line"><span class="cl"><span class="k">endclass</span>
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--parameterized-class1-sv">Code Snippet 4</a>:</span>
  Parameterized class and method
</div>
<p>This code, though has a problem &mdash; In order to call that function, we
would first need to construct an object of that class for each type
<em>T</em> we plan to use.</p>

<h3 id="static-methods">Static methods&nbsp;<a class="headline-hash no-text-decoration" href="#static-methods">#</a></h3>


<p>The solution to that is to declare the methods/functions in the class
as <strong>static</strong>. That way, that method can be called directly without
constructing the object first. See <span style="color:grey;">§</span> <strong>Static methods</strong> <a href="#citeproc_bib_item_1">2018, sec. 8.10</a>.</p>
<p>And because we don&rsquo;t need to construct an object of that class, and
don&rsquo;t want anyone else to unnecessary construct it, we declare the
class as <em>virtual</em>.</p>
<p><a id="code-snippet--parameterized-class2-sv"></a></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-systemverilog" data-lang="systemverilog"><span class="line hl"><span class="cl"><span class="k">virtual</span> <span class="k">class</span> <span class="n">math</span> <span class="p">#(</span><span class="k">parameter</span> <span class="k">type</span> <span class="n">T</span> <span class="o">=</span> <span class="k">int</span><span class="p">);</span>
</span></span><span class="line hl"><span class="cl">  <span class="k">static</span> <span class="k">function</span> <span class="n">T</span> <span class="n">add</span><span class="p">(</span><span class="k">input</span> <span class="n">T</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">endfunction</span>
</span></span><span class="line"><span class="cl"><span class="k">endclass</span>
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--parameterized-class2-sv">Code Snippet 5</a>:</span>
  Virtual parameterized class and <b>static</b> method
</div>
<p>Now we can call <code class="code-inline language-systemverilog"><span class="n">math</span> <span class="p">#(</span><span class="k">int</span><span class="p">)</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="mh">1</span><span class="p">,</span> <span class="mh">2</span><span class="p">)</span></code> and <code class="code-inline language-systemverilog"><span class="n">math</span> <span class="p">#(</span><span class="k">real</span><span class="p">)</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="mf">100.1</span><span class="p">,</span> <span class="mf">100.2</span><span class="p">)</span></code> and get the expected results.</p>

<h3 id="should-compile-with-all-types-t">Should compile with all types <em>T</em>&nbsp;<a class="headline-hash no-text-decoration" href="#should-compile-with-all-types-t">#</a></h3>


<p>But.. what if the type <em>T</em> is <em>string</em> ..</p>
<p><code>$typename</code> system function (See <span style="color:grey;">§</span> <strong>Type name function</strong> <a href="#citeproc_bib_item_1">2018, sec. 20.6.1</a>) comes to our help here. This function takes in a
variable identifier and returns a string name of that variable&rsquo;s
type. So if a variable <em>x</em> is a <em>string</em>, <code>$typename(x)</code> will return
<code>&quot;string&quot;</code>.</p>
<p>So, we can define the <code>add</code> method like this, right?</p>
<p><a id="code-snippet--parameterized-class3-sv"></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">virtual</span> <span class="k">class</span> <span class="n">math</span> <span class="p">#(</span><span class="k">parameter</span> <span class="k">type</span> <span class="n">T</span> <span class="o">=</span> <span class="k">int</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">static</span> <span class="k">function</span> <span class="n">T</span> <span class="n">add</span><span class="p">(</span><span class="k">input</span> <span class="n">T</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span></span><span class="line hl"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">$typename</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#34;string&#34;</span><span class="p">)</span>
</span></span><span class="line hl"><span class="cl">      <span class="k">return</span> <span class="p">{</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="k">endfunction</span>
</span></span><span class="line"><span class="cl"><span class="k">endclass</span>
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--parameterized-class3-sv">Code Snippet 6</a>:</span>
  <code>add</code> method with a condition for <i>string</i> type &#x2013; Won't compile!
</div>
<p>❌ <strong>Wrong</strong> ❌</p>
<div class="note">
<p>Even if you have the code execute conditionally based on the
<code>$typename</code>, note that the <code class="code-inline language-systemverilog"><span class="k">if</span> <span class="p">(</span><span class="n">$typename</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#34;string&#34;</span><span class="p">)</span></code> check is happening at run time, and so the
<strong>entire code</strong> needs to compile for any type <em>T</em> that&rsquo;s planned to be
used.</p>
</div>
<p>In the above example, because the <code>{a, b}</code> concatenation isn&rsquo;t meant
for types like <em>ints</em> and <em>reals</em>, it will fail compilation.
<span class="sidenote-number"><small class="sidenote">
That&rsquo;s the reason for the &ldquo;(not exactly)&rdquo; in this post&rsquo;s title 😄
</small></span></p>
<p>In order to make <code>add</code> work with strings as well, we need this messy
<em>cast</em> when the type name is <em>&ldquo;string&rdquo;</em> : <code class="code-inline language-systemverilog"><span class="n">$cast</span><span class="p">(</span><span class="n">ret_val</span><span class="p">,</span> <span class="nb">$sformatf</span><span class="p">(</span><span class="s">&#34;%s%s&#34;</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">));</span></code>. It&rsquo;s basically
telling the compiler: &ldquo;Trust me, I know what I am doing.. I will be
executing this code only when the <em>ret_val</em> is a string.&rdquo;</p>

<h2 id="final-code">Final Code&nbsp;<a class="headline-hash no-text-decoration" href="#final-code">#</a></h2>


<p>Finally, here&rsquo;s the entire code with the <em>generic</em> <code>add</code> method and
some test code.</p>
<p><a id="code-snippet--math-sv"></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">virtual</span> <span class="k">class</span> <span class="n">math</span> <span class="p">#(</span><span class="k">parameter</span> <span class="k">type</span> <span class="n">T</span> <span class="o">=</span> <span class="k">int</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">static</span> <span class="k">function</span> <span class="n">T</span> <span class="n">add</span><span class="p">(</span><span class="k">input</span> <span class="n">T</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">$typename</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#34;string&#34;</span><span class="p">)</span> <span class="k">begin</span>
</span></span><span class="line"><span class="cl">      <span class="n">T</span> <span class="n">ret_val</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">$cast</span><span class="p">(</span><span class="n">ret_val</span><span class="p">,</span> <span class="nb">$sformatf</span><span class="p">(</span><span class="s">&#34;%s%s&#34;</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="n">ret_val</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">end</span> <span class="k">else</span> <span class="k">begin</span>
</span></span><span class="line"><span class="cl">      <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</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 class="k">endfunction</span> <span class="o">:</span> <span class="n">add</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">endclass</span> <span class="o">:</span> <span class="n">math</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">module</span> <span class="n">test</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">$display</span><span class="p">(</span><span class="s">&#34;1 + 2 = %p&#34;</span><span class="p">,</span> <span class="n">math</span> <span class="p">#(</span><span class="k">int</span><span class="p">)</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="mh">1</span><span class="p">,</span> <span class="mh">2</span><span class="p">));</span>                <span class="c1">// 3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nb">$display</span><span class="p">(</span><span class="s">&#34;1.1 + 2.2 = %p&#34;</span><span class="p">,</span> <span class="n">math</span> <span class="p">#(</span><span class="k">real</span><span class="p">)</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="mf">1.1</span><span class="p">,</span> <span class="mf">2.2</span><span class="p">));</span>       <span class="c1">// 3.3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nb">$display</span><span class="p">(</span><span class="s">&#34;1 + 1 = %p&#34;</span><span class="p">,</span> <span class="n">math</span> <span class="p">#(</span><span class="k">bit</span><span class="p">)</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="mh">1</span><span class="p">,</span> <span class="mh">1</span><span class="p">));</span>                <span class="c1">// 0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nb">$display</span><span class="p">(</span><span class="s">&#34;abc + def = %p&#34;</span><span class="p">,</span> <span class="n">math</span> <span class="p">#(</span><span class="k">string</span><span class="p">)</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="s">&#34;abc&#34;</span><span class="p">,</span> <span class="s">&#34;def&#34;</span><span class="p">));</span> <span class="c1">// &#34;abcdef&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1"></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 class="k">endmodule</span> <span class="o">:</span> <span class="n">test</span>
</span></span></code></pre></div><div class="src-block-caption">
  <span class="src-block-number"><a href="#code-snippet--math-sv">Code Snippet 7</a>:</span>
  Parameterized class <code>math</code> with <i>static</i> function <code>add</code>
</div>

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


<p>If you liked how these <em>&ldquo;generics&rdquo;</em> work in SystemVerilog and how the
<code class="code-inline language-systemverilog"><span class="n">math</span> <span class="p">#(</span><span class="k">int</span><span class="p">)</span><span class="o">::</span><span class="n">add</span><span class="p">(</span><span class="mh">1</span><span class="p">,</span> <span class="mh">2</span><span class="p">));</span></code> syntax
looks, check out the <a href="https://github.com/cluelogic/cluelib"><strong>cluelib</strong></a> library by <em>cluelogic.com</em>. It is an
amazing SystemVerilog library with a big collection of <em>&ldquo;generic&rdquo;</em>
functions like above for handling strings, queues and dynamic arrays,
and a lot more. You can take a peek at its API <a href="http://cluelogic.com/tools/cluelib/api/framed_html/index.html">here</a>.</p>

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


<div class="csl-bib-body">
  <div class="csl-entry"><a id="citeproc_bib_item_1"></a>IEEE Standard for SystemVerilog–Unified Hardware Design, Specification, and Verification Language. (2018). <i>IEEE Std 1800-2017 (Revision of IEEE Std 1800-2012)</i>, 1–1315. <a href="https://doi.org/10.1109/IEEESTD.2018.8299595">https://doi.org/10.1109/IEEESTD.2018.8299595</a></div>
  <div class="csl-entry"><a id="citeproc_bib_item_2"></a>Nim contributors. (2022). Nim Manual [Website]. In <i>Nim</i>. <a href="https://nim-lang.org/docs/manual.html">https://nim-lang.org/docs/manual.html</a></div>
</div>
]]></content><category scheme="https://scripter.co/categories/systemverilog" term="systemverilog" label="systemverilog"/><category scheme="https://scripter.co/tags/parameterized-classes" term="parameterized-classes" label="parameterized-classes"/><category scheme="https://scripter.co/tags/typename" term="typename" label="typename"/><category scheme="https://scripter.co/tags/static" term="static" label="static"/><category scheme="https://scripter.co/tags/methods" term="methods" label="methods"/><category scheme="https://scripter.co/tags/generics" term="generics" label="generics"/><category scheme="https://scripter.co/tags/100daystooffload" term="100daystooffload" label="100DaysToOffload"/></entry></feed>