<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>parameterized-classes on
A Scripter's Notes</title><link>https://scripter.co/tags/parameterized-classes/</link><description>Recent content in parameterized-classes
on A Scripter's Notes</description><language>en-us</language><managingEditor>kaushal.modi@gmail.com (Kaushal Modi)</managingEditor><webMaster>kaushal.modi@gmail.com (Kaushal Modi)</webMaster><lastBuildDate>Wed, 22 Apr 2026 08:24:58 -0400</lastBuildDate><generator>Hugo -- gohugo.io</generator><docs>https://validator.w3.org/feed/docs/rss2.html</docs><atom:link href="https://scripter.co/tags/parameterized-classes/index.xml" rel="self" type="application/rss+xml"/><item><title>Generics (not exactly) in SystemVerilog</title><link>https://scripter.co/generics-not-exactly-in-systemverilog/</link><description>&lt;blockquote>Using &lt;em>parameterized classes&lt;/em> with &lt;em>static functions&lt;/em> to make up for
the lack of generics in SystemVerilog.&lt;/blockquote>&lt;div class="ox-hugo-toc toc">
&lt;div class="heading">Table of Contents&lt;/div>
&lt;ul>
&lt;li>&lt;a href="#a-real-generics-example">A real &lt;em>Generics&lt;/em> example&lt;/a>&lt;/li>
&lt;li>&lt;a href="#poor-man-s-generics-in-systemverilog">&lt;em>Poor man&amp;rsquo;s Generics&lt;/em> in SystemVerilog&lt;/a>
&lt;ul>
&lt;li>&lt;a href="#parameterized-classes">Parameterized Classes&lt;/a>&lt;/li>
&lt;li>&lt;a href="#static-methods">Static methods&lt;/a>&lt;/li>
&lt;li>&lt;a href="#should-compile-with-all-types-t">Should compile with all types &lt;em>T&lt;/em>&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;a href="#final-code">Final Code&lt;/a>&lt;/li>
&lt;li>&lt;a href="#cluelib">Cluelib&lt;/a>&lt;/li>
&lt;/ul>
&lt;/div>
&lt;!--endtoc-->
&lt;p>Many modern languages like &lt;a href="https://nim-lang.org">Nim&lt;/a> allow defining &lt;em>Generic&lt;/em> functions
types, etc that can work for any type. See Nim Manual &lt;a href="#citeproc_bib_item_2">2022&lt;/a> &lt;em>Generics&lt;/em>.&lt;/p>
&lt;p>This post demonstrates how you can make generics &lt;em>kind of&lt;/em> (if you
really squint your eyes, you can see it 😄) work with
SystemVerilog.&lt;/p>
&lt;h2 id="a-real-generics-example">A real &lt;em>Generics&lt;/em> example&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#a-real-generics-example">#&lt;/a>&lt;/h2>
&lt;p>The focus of this post is not how to write generics in Nim, but here&amp;rsquo;s
a quick summary:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="#org-coderef--51b0fc-1">Line 1&lt;/a> overloads the &lt;code>+&lt;/code> operator for any type &lt;code>T&lt;/code>.&lt;/li>
&lt;li>&lt;a href="#org-coderef--51b0fc-2">Line 2&lt;/a> is a &lt;strong>compile time&lt;/strong> check (using &lt;code>when&lt;/code>) to
see if &lt;code>T&lt;/code> is a &lt;em>string&lt;/em>, and then concatenates &lt;em>a&lt;/em> and &lt;em>b&lt;/em> inputs
using the &lt;code>&amp;amp;&lt;/code> &lt;em>string concat&lt;/em> operator.&lt;/li>
&lt;li>For &lt;a href="#org-coderef--51b0fc-4">other types&lt;/a>, it does the expected &amp;ldquo;a + b&amp;rdquo;.&lt;/li>
&lt;/ul>
&lt;!--listend-->
&lt;p>&lt;a id="code-snippet--code-generics-nim">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt" id="org-coderef--51b0fc-1">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-1">1&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--51b0fc-2">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-2">2&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--51b0fc-3">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-3">3&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--51b0fc-4">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-4">4&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--51b0fc-5">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-5">5&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--51b0fc-6">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-6">6&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--51b0fc-7">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-7">7&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--51b0fc-8">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-8">8&lt;/a>
&lt;/span>&lt;span class="lnt" id="org-coderef--51b0fc-9">&lt;a style="outline: none; text-decoration:none; color:inherit" href="#org-coderef--51b0fc-9">9&lt;/a>
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-nim" data-lang="nim">&lt;span class="line">&lt;span class="cl">&lt;span class="k">proc &lt;/span>&lt;span class="nf">`+`&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="o">]&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">T&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="o">=&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">when&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="kt">string&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">echo&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">echo&lt;/span> &lt;span class="mf">100.1&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mf">100.2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">echo&lt;/span> &lt;span class="s">&amp;#34;x&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s">&amp;#34;y&amp;#34;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s">&amp;#34;z&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--code-generics-nim">Code Snippet 1&lt;/a>:&lt;/span>
Example of generics in Nim
&lt;/div>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">200.3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">xyz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We will now see how to write something like this in SystemVerilog.&lt;/p>
&lt;h2 id="poor-man-s-generics-in-systemverilog">&lt;em>Poor man&amp;rsquo;s Generics&lt;/em> in SystemVerilog&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#poor-man-s-generics-in-systemverilog">#&lt;/a>&lt;/h2>
&lt;p>SystemVerilog is a strongly typed compiled language. So you need to
define the types for &lt;em>function&lt;/em> and &lt;em>task&lt;/em> arguments.&lt;/p>
&lt;p>So if you need an &lt;em>add&lt;/em> function for integers, you would do:&lt;/p>
&lt;p>&lt;a id="code-snippet--sv-add-int">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-systemverilog" data-lang="systemverilog">&lt;span class="line">&lt;span class="cl">&lt;span class="k">function&lt;/span> &lt;span class="k">int&lt;/span> &lt;span class="n">add_int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">input&lt;/span> &lt;span class="k">int&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">endfunction&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--sv-add-int">Code Snippet 2&lt;/a>:&lt;/span>
&lt;code>add_int&lt;/code> for adding integers
&lt;/div>
&lt;p>If you need an &lt;em>add&lt;/em> function for real numbers, you would do:&lt;/p>
&lt;p>&lt;a id="code-snippet--sv-add-real">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-systemverilog" data-lang="systemverilog">&lt;span class="line">&lt;span class="cl">&lt;span class="k">function&lt;/span> &lt;span class="k">real&lt;/span> &lt;span class="n">add_real&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">input&lt;/span> &lt;span class="k">real&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">endfunction&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--sv-add-real">Code Snippet 3&lt;/a>:&lt;/span>
&lt;code>add_real&lt;/code> for adding reals (doubles)
&lt;/div>
&lt;p>I am using the &lt;strong>add&lt;/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 &lt;em>ints&lt;/em>, queues of
&lt;em>strings&lt;/em>), or dynamic arrays of different types, etc.&lt;/p>
&lt;h3 id="parameterized-classes">Parameterized Classes&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#parameterized-classes">#&lt;/a>&lt;/h3>
&lt;p>In &lt;a href="#code-snippet--sv-add-int">&lt;code>add_int&lt;/code>&lt;/a>, we see that the type &lt;code>int&lt;/code> has to be specified in the
function signature. That &lt;code>int&lt;/code> can be replaced by a &lt;em>parameter&lt;/em>
representing a &lt;em>type&lt;/em> only if that function is defined inside a
&lt;em>parameterized class&lt;/em> (See &lt;span style="color:grey;">§&lt;/span> &lt;strong>Parameterized classes&lt;/strong> &lt;a href="#citeproc_bib_item_1">2018, sec. 8.25&lt;/a>).&lt;/p>
&lt;p>So it would look like this:&lt;/p>
&lt;p>&lt;a id="code-snippet--parameterized-class1-sv">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-systemverilog" data-lang="systemverilog">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">parameter&lt;/span> &lt;span class="k">type&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">int&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">function&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">input&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">endfunction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">endclass&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--parameterized-class1-sv">Code Snippet 4&lt;/a>:&lt;/span>
Parameterized class and method
&lt;/div>
&lt;p>This code, though has a problem &amp;mdash; In order to call that function, we
would first need to construct an object of that class for each type
&lt;em>T&lt;/em> we plan to use.&lt;/p>
&lt;h3 id="static-methods">Static methods&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#static-methods">#&lt;/a>&lt;/h3>
&lt;p>The solution to that is to declare the methods/functions in the class
as &lt;strong>static&lt;/strong>. That way, that method can be called directly without
constructing the object first. See &lt;span style="color:grey;">§&lt;/span> &lt;strong>Static methods&lt;/strong> &lt;a href="#citeproc_bib_item_1">2018, sec. 8.10&lt;/a>.&lt;/p>
&lt;p>And because we don&amp;rsquo;t need to construct an object of that class, and
don&amp;rsquo;t want anyone else to unnecessary construct it, we declare the
class as &lt;em>virtual&lt;/em>.&lt;/p>
&lt;p>&lt;a id="code-snippet--parameterized-class2-sv">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-systemverilog" data-lang="systemverilog">&lt;span class="line hl">&lt;span class="cl">&lt;span class="k">virtual&lt;/span> &lt;span class="k">class&lt;/span> &lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">parameter&lt;/span> &lt;span class="k">type&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">int&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="k">function&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">input&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">endfunction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">endclass&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--parameterized-class2-sv">Code Snippet 5&lt;/a>:&lt;/span>
Virtual parameterized class and &lt;b>static&lt;/b> method
&lt;/div>
&lt;p>Now we can call &lt;code class="code-inline language-systemverilog">&lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">int&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mh">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">2&lt;/span>&lt;span class="p">)&lt;/span>&lt;/code> and &lt;code class="code-inline language-systemverilog">&lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">real&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">100.1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">100.2&lt;/span>&lt;span class="p">)&lt;/span>&lt;/code> and get the expected results.&lt;/p>
&lt;h3 id="should-compile-with-all-types-t">Should compile with all types &lt;em>T&lt;/em>&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#should-compile-with-all-types-t">#&lt;/a>&lt;/h3>
&lt;p>But.. what if the type &lt;em>T&lt;/em> is &lt;em>string&lt;/em> ..&lt;/p>
&lt;p>&lt;code>$typename&lt;/code> system function (See &lt;span style="color:grey;">§&lt;/span> &lt;strong>Type name function&lt;/strong> &lt;a href="#citeproc_bib_item_1">2018, sec. 20.6.1&lt;/a>) comes to our help here. This function takes in a
variable identifier and returns a string name of that variable&amp;rsquo;s
type. So if a variable &lt;em>x&lt;/em> is a &lt;em>string&lt;/em>, &lt;code>$typename(x)&lt;/code> will return
&lt;code>&amp;quot;string&amp;quot;&lt;/code>.&lt;/p>
&lt;p>So, we can define the &lt;code>add&lt;/code> method like this, right?&lt;/p>
&lt;p>&lt;a id="code-snippet--parameterized-class3-sv">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-systemverilog" data-lang="systemverilog">&lt;span class="line">&lt;span class="cl">&lt;span class="k">virtual&lt;/span> &lt;span class="k">class&lt;/span> &lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">parameter&lt;/span> &lt;span class="k">type&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">int&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="k">function&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">input&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">$typename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line hl">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">endfunction&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">endclass&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--parameterized-class3-sv">Code Snippet 6&lt;/a>:&lt;/span>
&lt;code>add&lt;/code> method with a condition for &lt;i>string&lt;/i> type &amp;#x2013; Won't compile!
&lt;/div>
&lt;p>❌ &lt;strong>Wrong&lt;/strong> ❌&lt;/p>
&lt;div class="note">
&lt;p>Even if you have the code execute conditionally based on the
&lt;code>$typename&lt;/code>, note that the &lt;code class="code-inline language-systemverilog">&lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">$typename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/code> check is happening at run time, and so the
&lt;strong>entire code&lt;/strong> needs to compile for any type &lt;em>T&lt;/em> that&amp;rsquo;s planned to be
used.&lt;/p>
&lt;/div>
&lt;p>In the above example, because the &lt;code>{a, b}&lt;/code> concatenation isn&amp;rsquo;t meant
for types like &lt;em>ints&lt;/em> and &lt;em>reals&lt;/em>, it will fail compilation.
&lt;span class="sidenote-number">&lt;small class="sidenote">
That&amp;rsquo;s the reason for the &amp;ldquo;(not exactly)&amp;rdquo; in this post&amp;rsquo;s title 😄
&lt;/small>&lt;/span>&lt;/p>
&lt;p>In order to make &lt;code>add&lt;/code> work with strings as well, we need this messy
&lt;em>cast&lt;/em> when the type name is &lt;em>&amp;ldquo;string&amp;rdquo;&lt;/em> : &lt;code class="code-inline language-systemverilog">&lt;span class="n">$cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ret_val&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">$sformatf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%s%s&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">));&lt;/span>&lt;/code>. It&amp;rsquo;s basically
telling the compiler: &amp;ldquo;Trust me, I know what I am doing.. I will be
executing this code only when the &lt;em>ret_val&lt;/em> is a string.&amp;rdquo;&lt;/p>
&lt;h2 id="final-code">Final Code&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#final-code">#&lt;/a>&lt;/h2>
&lt;p>Finally, here&amp;rsquo;s the entire code with the &lt;em>generic&lt;/em> &lt;code>add&lt;/code> method and
some test code.&lt;/p>
&lt;p>&lt;a id="code-snippet--math-sv">&lt;/a>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-systemverilog" data-lang="systemverilog">&lt;span class="line">&lt;span class="cl">&lt;span class="k">virtual&lt;/span> &lt;span class="k">class&lt;/span> &lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">parameter&lt;/span> &lt;span class="k">type&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">int&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">static&lt;/span> &lt;span class="k">function&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">input&lt;/span> &lt;span class="n">T&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">$typename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">begin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">T&lt;/span> &lt;span class="n">ret_val&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">$cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ret_val&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">$sformatf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;%s%s&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">ret_val&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">end&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="k">begin&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">b&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">end&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">endfunction&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">add&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">endclass&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">math&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">module&lt;/span> &lt;span class="n">test&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">$display&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;1 + 2 = %p&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">int&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mh">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">2&lt;/span>&lt;span class="p">));&lt;/span> &lt;span class="c1">// 3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nb">$display&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;1.1 + 2.2 = %p&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">real&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mf">1.1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">2.2&lt;/span>&lt;span class="p">));&lt;/span> &lt;span class="c1">// 3.3
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nb">$display&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;1 + 1 = %p&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">bit&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mh">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">1&lt;/span>&lt;span class="p">));&lt;/span> &lt;span class="c1">// 0
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nb">$display&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;abc + def = %p&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">string&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;abc&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;def&amp;#34;&lt;/span>&lt;span class="p">));&lt;/span> &lt;span class="c1">// &amp;#34;abcdef&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">$finish&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">end&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">endmodule&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="n">test&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="src-block-caption">
&lt;span class="src-block-number">&lt;a href="#code-snippet--math-sv">Code Snippet 7&lt;/a>:&lt;/span>
Parameterized class &lt;code>math&lt;/code> with &lt;i>static&lt;/i> function &lt;code>add&lt;/code>
&lt;/div>
&lt;h2 id="cluelib">Cluelib&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#cluelib">#&lt;/a>&lt;/h2>
&lt;p>If you liked how these &lt;em>&amp;ldquo;generics&amp;rdquo;&lt;/em> work in SystemVerilog and how the
&lt;code class="code-inline language-systemverilog">&lt;span class="n">math&lt;/span> &lt;span class="p">#(&lt;/span>&lt;span class="k">int&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="n">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mh">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mh">2&lt;/span>&lt;span class="p">));&lt;/span>&lt;/code> syntax
looks, check out the &lt;a href="https://github.com/cluelogic/cluelib">&lt;strong>cluelib&lt;/strong>&lt;/a> library by &lt;em>cluelogic.com&lt;/em>. It is an
amazing SystemVerilog library with a big collection of &lt;em>&amp;ldquo;generic&amp;rdquo;&lt;/em>
functions like above for handling strings, queues and dynamic arrays,
and a lot more. You can take a peek at its API &lt;a href="http://cluelogic.com/tools/cluelib/api/framed_html/index.html">here&lt;/a>.&lt;/p>
&lt;h2 id="references">References&amp;nbsp;&lt;a class="headline-hash no-text-decoration" href="#references">#&lt;/a>&lt;/h2>
&lt;div class="csl-bib-body">
&lt;div class="csl-entry">&lt;a id="citeproc_bib_item_1">&lt;/a>IEEE Standard for SystemVerilog–Unified Hardware Design, Specification, and Verification Language. (2018). &lt;i>IEEE Std 1800-2017 (Revision of IEEE Std 1800-2012)&lt;/i>, 1–1315. &lt;a href="https://doi.org/10.1109/IEEESTD.2018.8299595">https://doi.org/10.1109/IEEESTD.2018.8299595&lt;/a>&lt;/div>
&lt;div class="csl-entry">&lt;a id="citeproc_bib_item_2">&lt;/a>Nim contributors. (2022). Nim Manual [Website]. In &lt;i>Nim&lt;/i>. &lt;a href="https://nim-lang.org/docs/manual.html">https://nim-lang.org/docs/manual.html&lt;/a>&lt;/div>
&lt;/div></description><author>Kaushal.Modi@fakeEmailToMakeValidatorHappy.com (Kaushal Modi)</author><category domain="https://scripter.co/categories/systemverilog">systemverilog</category><category domain="https://scripter.co/tags/parameterized-classes">parameterized-classes</category><category domain="https://scripter.co/tags/typename">typename</category><category domain="https://scripter.co/tags/static">static</category><category domain="https://scripter.co/tags/methods">methods</category><category domain="https://scripter.co/tags/generics">generics</category><category domain="https://scripter.co/tags/100daystooffload">100DaysToOffload</category><guid>https://scripter.co/generics-not-exactly-in-systemverilog/</guid><pubDate>Fri, 11 Feb 2022 01:48:00 -0500</pubDate></item></channel></rss>