iverilog/usage/icarus_verilog_extensions.html

455 lines
31 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en" data-accent-color="violet" data-content_root="../">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Icarus Verilog Extensions - Icarus Verilog documentation</title><link rel="shortcut icon" href="../_static/favicon.ico"/><link rel="index" title="Index" href="../genindex.html" /><link rel="search" title="Search" href="../search.html" /><link rel="next" title="Icarus Verilog Quirks" href="icarus_verilog_quirks.html" /><link rel="prev" title="Using VPI" href="vpi.html" /><script>
function setColorMode(t){let e=document.documentElement;e.setAttribute("data-color-mode",t);let a=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,s=t;"auto"===t&&(s=a?"dark":"light"),"light"===s?(e.classList.remove("dark"),e.classList.add("light")):(e.classList.remove("light"),e.classList.add("dark"))}
setColorMode(localStorage._theme||"auto");
</script><link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=ad592e98" />
<link rel="stylesheet" type="text/css" href="../_static/shibuya.css?v=44020203" />
<link media="print" rel="stylesheet" type="text/css" href="../_static/print.css?v=20ff2c19" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root {
--sy-f-text: "Inter", var(--sy-f-sys), var(--sy-f-cjk), sans-serif;
--sy-f-heading: "Inter", var(--sy-f-sys), var(--sy-f-cjk), sans-serif;
}
</style>
<meta property="og:type" content="website"/><meta property="og:title" content="Icarus Verilog Extensions"/>
<meta name="twitter:card" content="summary"/>
</head>
<body><div class="sy-head">
<div class="sy-head-blur"></div>
<div class="sy-head-inner sy-container mx-auto">
<a class="sy-head-brand" href="../index.html">
<strong>Icarus Verilog</strong>
</a>
<div class="sy-head-nav" id="head-nav">
<nav class="sy-head-links"></nav>
<div class="sy-head-extra flex items-center print:hidden"><form class="searchbox flex items-center" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search" />
<kbd>/</kbd>
</form><div class="sy-head-socials">
<a href="https://github.com/steveicarus/iverilog" aria-label="GitHub">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</a></div></div>
</div>
<div class="sy-head-actions flex items-center shrink-0 print:hidden"><button class="js-theme theme-switch flex items-center"
data-aria-auto="Switch to light color mode"
data-aria-light="Switch to dark color mode"
data-aria-dark="Switch to auto color mode">
<i class="i-lucide theme-icon"></i>
</button><button class="md:hidden flex items-center js-menu" aria-label="Menu" type="button" aria-controls="head-nav" aria-expanded="false">
<div class="hamburger">
<span class="hamburger_1"></span>
<span class="hamburger_2"></span>
<span class="hamburger_3"></span>
</div>
</button>
</div>
</div>
</div>
<div class="sy-page sy-container flex mx-auto">
<aside id="lside" class="sy-lside md:w-72 md:shrink-0 print:hidden">
<div class="sy-lside-inner md:sticky">
<div class="sy-scrollbar p-6">
<div class="globaltoc" data-expand-depth="0"><p class="caption" role="heading" aria-level="3"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../releases/index.html">Icarus Verilog Release Notes</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../releases/v13-0-release-note.html">🎉 Release V13.0</a></li>
<li class="toctree-l2"><a class="reference internal" href="../releases/v13-0-release-note.html#major-changes-in-v13">🔄 Major Changes in V13</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Icarus Verilog Usage</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="installation.html">Installation Guide</a></li>
<li class="toctree-l2"><a class="reference internal" href="getting_started.html">Getting Started With Icarus Verilog</a></li>
<li class="toctree-l2"><a class="reference internal" href="simulation.html">Simulation Using Icarus Verilog</a></li>
<li class="toctree-l2"><a class="reference internal" href="command_line_flags.html">iverilog Command Line Flags</a></li>
<li class="toctree-l2"><a class="reference internal" href="command_files.html">Command File Format</a></li>
<li class="toctree-l2"><a class="reference internal" href="verilog_attributes.html">Verilog Attributes</a></li>
<li class="toctree-l2"><a class="reference internal" href="ivlpp_flags.html">IVLPP - IVL Preprocessor</a></li>
<li class="toctree-l2"><a class="reference internal" href="vvp_flags.html">VVP Command Line Flags</a></li>
<li class="toctree-l2"><a class="reference internal" href="vvp_debug.html">VVP Interactive Mode</a></li>
<li class="toctree-l2"><a class="reference internal" href="vvp_library.html">VVP as a library</a></li>
<li class="toctree-l2"><a class="reference internal" href="vhdlpp_flags.html">vhdlpp Command Line Flags</a></li>
<li class="toctree-l2"><a class="reference internal" href="waveform_viewer.html">Viewing Waveforms</a></li>
<li class="toctree-l2"><a class="reference internal" href="vpi.html">Using VPI</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Icarus Verilog Extensions</a></li>
<li class="toctree-l2"><a class="reference internal" href="icarus_verilog_quirks.html">Icarus Verilog Quirks</a></li>
<li class="toctree-l2"><a class="reference internal" href="reporting_issues.html">Reporting Issues</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../targets/index.html">The Icarus Verilog Targets</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-vvp.html">The vvp Code Generator (-tvvp)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-stub.html">The stub Code Generator (-tstub)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-null.html">The null Code Generator (-tnull)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-vhdl.html">The VHDL Code Generator (-tvhdl)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-vlog95.html">The Verilog 95 Code Generator (-tvlog95)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-pcb.html">The PCB Code Generator (-tpcb)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-fpga.html">The FPGA Code Generator (-tfpga)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-pal.html">The PAL Code Generator (-tpal)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-sizer.html">The sizer Code Analyzer (-tsizer)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-verilog.html">The Verilog Code Generator (-tverilog)</a></li>
<li class="toctree-l2"><a class="reference internal" href="../targets/tgt-blif.html">The BLIF Code Generator (-tblif)</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../developer/index.html">Icarus Verilog Developer Support</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../developer/getting_started.html">Getting Started as a Contributor</a></li>
<li class="toctree-l2"><a class="reference internal" href="../developer/regression_tests.html">The Regression Test Suite</a></li>
<li class="toctree-l2"><a class="reference internal" href="../developer/version_stamps.html">Files With Version Information</a></li>
<li class="toctree-l2"><a class="reference internal" href="../developer/guide/index.html">Developer Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../developer/guide/ivl/index.html">IVL - The Core Compiler</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/ivl/netlist.html">Netlist Format</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/ivl/attributes.html">Icarus Verilog Attributes</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/ivl/ivl_target.html">Loadable Target API (ivl_target)</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/ivl/lpm.html">What Is LPM</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/ivl/t-dll.html">Loadable Targets</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../developer/guide/vvp/index.html">VVP - Verilog Virtual Processor</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/vvp/vvp.html">VVP Simulation Engine</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/vvp/opcodes.html">Executable Instruction Opcodes</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/vvp/vpi.html">VPI Within VVP</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/vvp/vthread.html">Thread Details</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/vvp/debug.html">Debug Aids For VVP</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../developer/guide/tgt-vvp/tgt-vvp.html">The VVP Target</a></li>
<li class="toctree-l3"><a class="reference internal" href="../developer/guide/vpi/index.html">VPI in Icarus Verilog</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/vpi/vpi.html">VPI Modules in Icarus Verilog</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/vpi/va_math.html">Verilog-A math library</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../developer/guide/cadpli/cadpli.html">Cadence PLI1 Modules</a></li>
<li class="toctree-l3"><a class="reference internal" href="../developer/guide/misc/index.html">Miscellaneous</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/misc/ieee1364-notes.html">IEEE1364 Notes</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/misc/swift.html">Swift Model Support (Preliminary)</a></li>
<li class="toctree-l4"><a class="reference internal" href="../developer/guide/misc/xilinx-hint.html">Xilinx Hint</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../developer/glossary.html">Glossary</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</aside>
<div class="lside-overlay js-menu" role="button" aria-label="Close left sidebar" aria-controls="lside" aria-expanded="false"></div>
<aside id="rside" class="sy-rside pb-3 w-64 shrink-0 order-last">
<button class="rside-close js-menu xl:hidden" aria-label="Close Table of Contents" type="button" aria-controls="rside" aria-expanded="false">
<i class="i-lucide close"></i>
</button>
<div class="sy-scrollbar sy-rside-inner px-6 xl:top-16 xl:sticky xl:pl-0 pt-6 pb-4"><div class="localtoc"><h3>On this page</h3><ul>
<li><a class="reference internal" href="#system-functions">System Functions</a><ul>
<li><a class="reference internal" href="#is-signed-expr"><code class="docutils literal notranslate"><span class="pre">$is_signed(&lt;expr&gt;)</span></code></a></li>
<li><a class="reference internal" href="#bits-expr-sizeof-expr"><code class="docutils literal notranslate"><span class="pre">$bits(&lt;expr&gt;)</span></code>, <code class="docutils literal notranslate"><span class="pre">$sizeof(&lt;expr&gt;)</span></code></a></li>
<li><a class="reference internal" href="#simtime"><code class="docutils literal notranslate"><span class="pre">$simtime()</span></code></a></li>
<li><a class="reference internal" href="#mti-random-mti-dist-uniform"><code class="docutils literal notranslate"><span class="pre">$mti_random()</span></code>, <code class="docutils literal notranslate"><span class="pre">$mti_dist_uniform</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#system-tasks">System Tasks</a><ul>
<li><a class="reference internal" href="#readmempath"><code class="docutils literal notranslate"><span class="pre">$readmempath</span></code></a></li>
<li><a class="reference internal" href="#finish-and-return-code"><code class="docutils literal notranslate"><span class="pre">$finish_and_return(code)</span></code></a></li>
</ul>
</li>
<li><a class="reference internal" href="#extended-verilog-data-types">Extended Verilog Data Types</a></li>
</ul>
</div><a class="js-repo-stats repo-stats flex items-center" href="https://github.com/steveicarus/iverilog"
data-type="github" data-user="steveicarus" data-repo="iverilog">
<span class="w-8 flex items-center justify-around shrink-0 text-3xl">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</span>
<span class="flex-grow px-2 break-all">
<span>iverilog</span>
<span class="flex text-sm repo-stats-count">
<span class="flex items-center pr-3">
<iconify-icon icon="lucide:star"></iconify-icon>
<strong class="js-repo-stars ml-1">0</strong>
</span>
<span class="flex items-center">
<iconify-icon icon="lucide:git-fork"></iconify-icon>
<strong class="js-repo-forks ml-1">0</strong>
</span>
</span>
</span>
</a><div class="edit-this-page">
<a href="https://github.com/steveicarus/iverilog/blob/master/Documentation/usage/icarus_verilog_extensions.rst">Edit this page</a>
</div><div id="ethical-ad-placement" data-ea-publisher="readthedocs"></div></div>
</aside>
<div class="rside-overlay js-menu" role="button" aria-label="Close Table of Contents" aria-controls="rside" aria-expanded="false"></div>
<main class="sy-main w-full max-sm:max-w-full print:pt-6">
<div class="sy-breadcrumbs" role="navigation">
<div class="sy-breadcrumbs-inner flex items-center">
<div class="md:hidden mr-3">
<button class="js-menu" aria-label="Menu" type="button" aria-controls="lside" aria-expanded="false">
<i class="i-lucide menu"></i>
</button>
</div>
<ol class="flex-1" itemscope itemtype="https://schema.org/BreadcrumbList"><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="../index.html"><span itemprop="name">Icarus Verilog</span></a>
<span>/</span>
<meta itemprop="position" content="1" />
</li><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="index.html"><span itemprop="name">Icarus Verilog Usage</span></a>
<span>/</span>
<meta itemprop="position" content="2" />
</li><li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<strong itemprop="name">Icarus Verilog Extensions</strong>
<meta itemprop="position" content="3" />
</li></ol>
<div class="xl:hidden ml-1">
<button class="js-menu" aria-label="Show table of contents" type="button" aria-controls="rside"
aria-expanded="false">
<i class="i-lucide outdent"></i>
</button>
</div>
</div>
</div><div class="flex flex-col break-words justify-between">
<div class="relative min-w-0 max-w-6xl px-6 pb-6 pt-8 xl:px-12">
<div class="copy-page-wrapper relative pb-4 lg:absolute lg:top-8 lg:right-6 xl:right-12">
<div id="copy-page-trigger">
<button
type="button"
class="js-copy px-3 py-1 inline-flex items-center gap-1"
data-url="https://raw.githubusercontent.com/steveicarus/iverilog/refs/heads/master/Documentation/usage/icarus_verilog_extensions.rst.txt"
>
<i class="i-lucide" data-icon="copy"></i>
<span>Copy page</span>
</button>
<button class="js-menu px-2 py-1" type="button" aria-label="More actions"
aria-haspopup="menu" aria-expanded="false" aria-controls="copy-page-content">
<i class="i-lucide chevron-down"></i>
</button>
</div>
<div id="copy-page-content" role="menu" aria-orientation="vertical" aria-hidden="true">
<div role="presentation">
<div class="flex flex-col" role="group">
<button class="js-copy" type="button" role="menuitem"
data-url="https://raw.githubusercontent.com/steveicarus/iverilog/refs/heads/master/Documentation/usage/icarus_verilog_extensions.rst.txt">
<span class="iconify-icon">
<i class="i-lucide" data-icon="copy"></i>
</span>
<span>Copy page</span>
</button>
<a role="menuitem" href="https://raw.githubusercontent.com/steveicarus/iverilog/refs/heads/master/Documentation/usage/icarus_verilog_extensions.rst.txt" target="_blank" rel="nofollow"><iconify-icon icon="bi:code-slash"></iconify-icon>
<span>View Source</span></a><a role="menuitem" href="https://chatgpt.com/?hints=search&q=Read%20https%3A//raw.githubusercontent.com/steveicarus/iverilog/refs/heads/master/Documentation/usage/icarus_verilog_extensions.rst.txt%20so%20I%20can%20ask%20questions%20about%20it." target="_blank" rel="nofollow">
<iconify-icon icon="bi:openai"></iconify-icon>
<span>Open in ChatGPT</span>
</a><a role="menuitem" href="https://claude.ai/new?q=Read%20https%3A//raw.githubusercontent.com/steveicarus/iverilog/refs/heads/master/Documentation/usage/icarus_verilog_extensions.rst.txt%20so%20I%20can%20ask%20questions%20about%20it." target="_blank" rel="nofollow">
<iconify-icon icon="bi:claude"></iconify-icon>
<span>Open in Claude</span>
</a></div>
</div>
</div>
</div><article class="yue" role="main">
<section id="icarus-verilog-extensions">
<h1>Icarus Verilog Extensions<a class="headerlink" href="#icarus-verilog-extensions" title="Link to this heading"></a></h1>
<p>Icarus Verilog supports certain extensions to the baseline IEEE 1364
standard. Some of these are picked from extended variants of the
language, such as SystemVerilog, and some are expressions of internal
behavior of Icarus Verilog, made available as a tool debugging aid.</p>
<p>Dont use any of these extensions if you want to keep your code portable
across other Verilog compilers.</p>
<section id="system-functions">
<h2>System Functions<a class="headerlink" href="#system-functions" title="Link to this heading"></a></h2>
<section id="is-signed-expr">
<h3><code class="docutils literal notranslate"><span class="pre">$is_signed(&lt;expr&gt;)</span></code><a class="headerlink" href="#is-signed-expr" title="Link to this heading"></a></h3>
<p>This function returns 1 if the expression contained is signed, or 0 otherwise.
This is mostly of use for compiler regression tests.</p>
</section>
<section id="bits-expr-sizeof-expr">
<h3><code class="docutils literal notranslate"><span class="pre">$bits(&lt;expr&gt;)</span></code>, <code class="docutils literal notranslate"><span class="pre">$sizeof(&lt;expr&gt;)</span></code><a class="headerlink" href="#bits-expr-sizeof-expr" title="Link to this heading"></a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">$bits</span></code> system function returns the size in bits of the expression that
is its argument. The result of this function is undefined if the argument
doesnt have a self-determined size.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">$sizeof</span></code> system function is deprecated in favour of <code class="docutils literal notranslate"><span class="pre">$bits</span></code>, which is
the same thing, but included in the SystemVerilog definition.</p>
</section>
<section id="simtime">
<h3><code class="docutils literal notranslate"><span class="pre">$simtime()</span></code><a class="headerlink" href="#simtime" title="Link to this heading"></a></h3>
<p>This returns as a 64bit value the simulation time, unscaled by the time units
of the local scope. This is different from the <code class="docutils literal notranslate"><span class="pre">$time</span></code> and <code class="docutils literal notranslate"><span class="pre">$stime</span></code>
functions which return the scaled times. This function is added for regression
testing of the compiler and run time, but can be used by applications who
really want the simulation time.</p>
<p>Note that the simulation time can be confusing if there are lots of different
<code class="docutils literal notranslate"><span class="pre">`timescales</span></code> within a design. It is not in general possible to predict
what the simulation precision will turn out to be.</p>
</section>
<section id="mti-random-mti-dist-uniform">
<h3><code class="docutils literal notranslate"><span class="pre">$mti_random()</span></code>, <code class="docutils literal notranslate"><span class="pre">$mti_dist_uniform</span></code><a class="headerlink" href="#mti-random-mti-dist-uniform" title="Link to this heading"></a></h3>
<p>These functions are similar to the IEEE 1364 standard <code class="docutils literal notranslate"><span class="pre">$random</span></code> functions,
but they use the Mersenne Twister (MT19937) algorithm. This is considered an
excellent random number generator, but does not generate the same sequence as
the standardized <code class="docutils literal notranslate"><span class="pre">$random</span></code>.</p>
</section>
</section>
<section id="system-tasks">
<h2>System Tasks<a class="headerlink" href="#system-tasks" title="Link to this heading"></a></h2>
<section id="readmempath">
<h3><code class="docutils literal notranslate"><span class="pre">$readmempath</span></code><a class="headerlink" href="#readmempath" title="Link to this heading"></a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">$readmemb</span></code> and <code class="docutils literal notranslate"><span class="pre">$readmemh</span></code> system tasks read text files that contain
data values to populate memories. Normally, those files are found in a current
working directory. The <code class="docutils literal notranslate"><span class="pre">$readmempath()</span></code> system task can be used to create a
search path for those files. For example:</p>
<div class="highlight-verilog notranslate"><div class="highlight"><pre><span></span><span data-line="1"><span class="kt">reg</span><span class="w"> </span><span class="p">[</span><span class="mh">7</span><span class="o">:</span><span class="mh">0</span><span class="p">]</span><span class="w"> </span><span class="n">mem</span><span class="w"> </span><span class="p">[</span><span class="mh">0</span><span class="o">:</span><span class="mh">7</span><span class="p">];</span>
</span><span data-line="2"><span class="k">initial</span><span class="w"> </span><span class="k">begin</span>
</span><span data-line="3"><span class="w"> </span><span class="nb">$readmemh</span><span class="p">(</span><span class="s">&quot;datafile.txt&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">mem</span><span class="p">);</span>
</span><span data-line="4"><span class="k">end</span>
</span></pre></div>
</div>
<p>This assumes that “datafile.txt” is in the current working directory where
the <code class="docutils literal notranslate"><span class="pre">vvp</span></code> command is running. But with the <code class="docutils literal notranslate"><span class="pre">$readmempath</span></code>, one can specify
a search path:</p>
<div class="highlight-verilog notranslate"><div class="highlight"><pre><span></span><span data-line="1"><span class="kt">reg</span><span class="w"> </span><span class="p">[</span><span class="mh">7</span><span class="o">:</span><span class="mh">0</span><span class="p">]</span><span class="w"> </span><span class="n">mem</span><span class="w"> </span><span class="p">[</span><span class="mh">0</span><span class="o">:</span><span class="mh">7</span><span class="p">];</span>
</span><span data-line="2"><span class="k">initial</span><span class="w"> </span><span class="k">begin</span>
</span><span data-line="3"><span class="w"> </span><span class="n">$readmempath</span><span class="p">(</span><span class="s">&quot;.:alternative:/global/defaults&quot;</span><span class="p">);</span>
</span><span data-line="4"><span class="w"> </span><span class="nb">$readmemh</span><span class="p">(</span><span class="s">&quot;datafile.txt&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">mem</span><span class="p">);</span>
</span><span data-line="5"><span class="k">end</span>
</span></pre></div>
</div>
<p>In this example, “datafile.txt” is searched for in each of the directories
in the above list (separated by “:” characters). The first located instance
is the one that is used. So for example, if “./datafile.txt” exists, then it
is read instead of “/global/defaults/datafile.txt” even if the latter exists.</p>
</section>
<section id="finish-and-return-code">
<h3><code class="docutils literal notranslate"><span class="pre">$finish_and_return(code)</span></code><a class="headerlink" href="#finish-and-return-code" title="Link to this heading"></a></h3>
<p>This task operates the same as the <code class="docutils literal notranslate"><span class="pre">$finish</span></code> system task, but adds the
feature of specifying an exit code for the interpreter. This can be useful in
automated test environments to indicate whether the simulation finished with
or without errors.</p>
</section>
</section>
<section id="extended-verilog-data-types">
<h2>Extended Verilog Data Types<a class="headerlink" href="#extended-verilog-data-types" title="Link to this heading"></a></h2>
<p>This feature is turned on by the generation flag “-gxtypes” and turned
off by the generation flag “-gno-xtypes”. It is turned on by default.</p>
<p>Icarus Verilog adds support for extended data types. This extended
type syntax is based on a proposal by Cadence Design Systems,
originally as an update to the IEEE 1364 standard. Icarus Verilog
currently only takes the new primitive types from the proposal.</p>
<p>SystemVerilog provides the same functionality using somewhat different
syntax. This extension is maintained for backwards compatibility.</p>
<ul class="simple">
<li><p>Types</p></li>
</ul>
<p>Extended data types separates the concept of net/variable from the
data type. Both nets and variables can declared with any data
type. The primitive types available are:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span><span data-line="1">logic - The familiar 0, 1, x and z, optionally with strength.
</span><span data-line="2">bool - Limited to only 0 and 1
</span><span data-line="3">real - 64-bit real values
</span></pre></div>
</div>
<p>Nets with logic type may have multiple drivers with strength, and the
value is resolved the usual way. Only logic values may be driven to
logic nets, so bool values driven onto logic nets are implicitly
converted to logic.</p>
<p>Nets with any other type may not have multiple drivers. The compiler
should detect the multiple drivers and report an error.</p>
<ul class="simple">
<li><p>Declarations</p></li>
</ul>
<p>The declaration of a net is extended to include the type of the wire,
with the syntax:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span><span data-line="1">wire &lt;type&gt; &lt;wire-assignment-list&gt;... ;
</span></pre></div>
</div>
<p>The &lt;type&gt;, if omitted, is taken to be logic. The “wire” can be any of
the net keywords. Wires can be logic, bool, real, or vectors of logic
or bool. Some valid examples:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span><span data-line="1">wire real foo = 1.0;
</span><span data-line="2">tri logic bus[31:0];
</span><span data-line="3">wire bool addr[23:0];
</span><span data-line="4">... and so on.
</span></pre></div>
</div>
<p>The declarations of variables is similar. The “reg” keyword is used to
specify that this is a variable. Variables can have the same data
types as nets.</p>
<ul class="simple">
<li><p>Ports</p></li>
</ul>
<p>Module and task ports in standard Verilog are restricted to logic
types. This extension removes that restriction, allowing any of
the above types to pass through the port consistent with the
continuous assignment connectivity that is implied by the type.</p>
<ul class="simple">
<li><p>Expressions</p></li>
</ul>
<p>Expressions in the face of real values is covered by the baseline
Verilog standard.</p>
<p>The bool type supports the same operators as the logic type, with the
obvious differences imposed by the limited domain.</p>
<p>Comparison operators (not case compare) return logic if either of
their operands is logic. If both are bool or real (including mix of
bool and real) then the result is bool. This is because comparison of
bools and reals always return exactly true or false.</p>
<p>Case comparison returns bool. This differs from baseline Verilog,
which strictly speaking returns a logic, but only 0 or 1 values.</p>
<p>Arithmetic operators return real if either of their operands is real,
otherwise they return logic if either of their operands is logic. If
both operands are bool, they return bool.</p>
</section>
</section>
</article><button class="back-to-top" type="button">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</button><div class="navigation flex print:hidden"><div class="navigation-prev">
<a href="vpi.html">
<i class="i-lucide chevron-left"></i>
<div class="page-info">
<span>Previous</span><div class="title">Using VPI</div></div>
</a>
</div><div class="navigation-next">
<a href="icarus_verilog_quirks.html">
<div class="page-info">
<span>Next</span>
<div class="title">Icarus Verilog Quirks</div>
</div>
<i class="i-lucide chevron-right"></i>
</a>
</div></div></div>
</div>
</main>
</div>
<footer class="sy-foot">
<div class="sy-foot-inner sy-container mx-auto">
<div class="sy-foot-reserved md:flex justify-between items-center">
<div class="sy-foot-copyright"><p>2024-2026, Stephen Williams</p>
<p>
Made with
<a href="https://www.sphinx-doc.org/">Sphinx</a> and
<a href="https://shibuya.lepture.com">Shibuya theme</a>.
</p>
</div>
<div class="sy-foot-socials">
<a href="https://github.com/steveicarus/iverilog" aria-label="GitHub">
<iconify-icon icon="simple-icons:github"></iconify-icon>
</a></div>
</div>
</div>
</footer>
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/shibuya.js?v=cac61aee"></script></body>
</html>