<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/assets/rss-20b3285f.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>标签: ddpp - ouuan's blog</title>
        <link>https://ouuan.moe/tag/ddpp</link>
        <description>标签为 ddpp 的文章 - ouuan 的博客</description>
        <lastBuildDate>Sat, 29 Apr 2023 16:24:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright © 2022 - 2026 ouuan
Licensed under CC BY-SA 4.0</copyright>
        <atom:link href="https://ouuan.moe/tag/ddpp/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[DDPP 第五章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/04/ddpp-5</link>
            <guid>https://ouuan.moe/post/2023/04/ddpp-5</guid>
            <pubDate>Sat, 29 Apr 2023 16:24:36 GMT</pubDate>
            <description><![CDATA[<p><a href="https://wakerly.org/DDPP/">DDPP5</a> 第五章 <span class="mojikumi">“</span>Verilog Hardware Description Language<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
<p>也就是初学 (System)Verilog 的笔记<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[<p><a href="https://wakerly.org/DDPP/">DDPP5</a> 第五章 <span class="mojikumi">“</span>Verilog Hardware Description Language<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
<p>也就是初学 (System)Verilog 的笔记<span class="mojikumi-line-end">。</span></p>

<p>本来想寒假学<span class="mojikumi-line-end">，</span>结果还是拖到了数字逻辑实验开始用 FPGA<span class="mojikumi-line-end">，</span>只不过手上有模块了再来学也挺好的<span class="mojikumi-line-end">。</span></p>
<p>虽然从创建到发布拖了很久<span class="mojikumi-line-end">，</span>但其实大部分内容都是新建文件后一周内写的<span class="mojikumi-line-end">，</span>只是后来感觉学的东西已经差不多能应付上课了<span class="mojikumi-line-end">，</span>就一直咕着没把最后一点学完 &#x26; 写完<span class="mojikumi-line-start">（</span></p>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h2 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-info-circle-outline text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Info: </span><span data-v-a2ab257f>SystemVerilog</span></h2><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>DDPP5 中讲的是 Verilog 而不是 SystemVerilog<span class="mojikumi-line-end">，</span>我根据在其他地方找到的一些资料补充了少量 SystemVerilog 的内容<span class="mojikumi-line-end">。</span></p></div></div></aside>
<h2 id="neovim-配置" class="heading"><a href="#neovim-配置" class="heading-anchor" aria-label="章节： neovim 配置" tabindex="-1"></a><span>neovim 配置</span></h2>
<p>用的是老师推荐的 Vivado 2019.2 WebPack<span class="mojikumi-line-end">，</span>而它自带的文本编辑器多少有点拉胯<span class="mojikumi-line-end">，</span>所以研究了一下配 neovim<span class="mojikumi-line-end">。</span></p>
<p>最后选择的是 <a href="https://github.com/vivekmalneedi/veridian">veridian</a> + 通过 <a href="https://github.com/jose-elias-alvarez/null-ls.nvim">null-ls</a> 使用 Vivado 的 <code>xvlog</code><span class="mojikumi-line-end">。</span>一开始我还看 veridian 没在维护而且 star 少<span class="mojikumi-line-start">（</span><s>但它好歹最后更新是在 2021<span class="mojikumi-line-end">，</span>Vivado 还在用 2019</s><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>先试了另外几个<span class="mojikumi-line-end">，</span>后来发现<span class="mojikumi-line-end">，</span>不说别的<span class="mojikumi-line-end">，</span>只有 veridian 支持 hover<span class="mojikumi-line-end">。</span>同时使用 <code>xvlog</code> 是觉得还是 Vivado 自带的 lint 比较靠谱<span class="mojikumi-line-end">。</span></p>
<p>veridian 就是用 <a href="https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#veridian">lspconfig</a><span class="mojikumi-line-end">，</span>记得同时装 <a href="https://github.com/chipsalliance/verible">verible</a> 才能使用某些 feature<span class="mojikumi-line-start">（</span>在 lspconfig 里只需启用 veridian<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>可以把 <code>root_dir</code> 设为 <code>util<wbr>.<wbr>root_pattern<wbr>('*.<wbr>xpr<wbr>', '.<wbr>git<wbr>')</code> 来检测 Vivado 项目的根目录<span class="mojikumi-line-end">。</span></p>
<p>null-ls 的配置如下<span class="mojikumi-line-end">，</span>因为 <code>xvlog</code> 实际上是一个不能禁用文件输出的 simulator<span class="mojikumi-line-end">，</span>采取了一些措施来防止它到处倒垃圾<span class="mojikumi-line-end">。</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h3 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="Lua 代码块" data-v-c675dba6>Lua</h3><ile-root id="ile-1"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-1--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">local</span><span style="color: #403F53"> </span><span style="color: #4876D6">null_ls</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">require</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">null-ls</span><span style="color: #111111">&quot;</span></span>
<span><span style="color: #994CC3">local</span><span style="color: #403F53"> </span><span style="color: #4876D6">utils</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">require</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">null-ls.utils</span><span style="color: #111111">&quot;</span></span>
<span><span style="color: #994CC3">local</span><span style="color: #403F53"> </span><span style="color: #4876D6">helpers</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">require</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">null-ls.helpers</span><span style="color: #111111">&quot;</span></span>
<span></span>
<span><span style="color: #994CC3">local</span><span style="color: #403F53"> </span><span style="color: #4876D6">xvlog_sv</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">name</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">xvlog</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">method</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">null_ls</span><span style="color: #403F53">.methods.DIAGNOSTICS,</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">filetypes</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> { </span><span style="color: #111111">&quot;</span><span style="color: #C96765">systemverilog</span><span style="color: #111111">&quot; </span><span style="color: #403F53">},</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">generator</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">null_ls</span><span style="color: #403F53">.</span><span style="color: #4876D6">generator</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">command</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">bwrap</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #989FB1">-- only permit writing in /tmp</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">args</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">      </span><span style="color: #111111">&quot;</span><span style="color: #C96765">--ro-bind</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">/</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">/</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">      </span><span style="color: #111111">&quot;</span><span style="color: #C96765">--bind</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">/tmp/xvlog</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">/tmp/xvlog</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">      </span><span style="color: #111111">&quot;</span><span style="color: #C96765">--dev</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">/dev</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">      </span><span style="color: #111111">&quot;</span><span style="color: #C96765">/home/ouuan/Xilinx/Vivado/2019.2/bin/xvlog</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">      </span><span style="color: #111111">&quot;</span><span style="color: #C96765">--sv</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">$FILENAME</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">    },</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">cwd</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #994CC3">function</span><span style="color: #111111">(</span><span style="color: #0C969B">params</span><span style="color: #111111">)</span></span>
<span><span style="color: #403F53">      </span><span style="color: #989FB1">-- output in /tmp</span></span>
<span><span style="color: #403F53">      </span><span style="color: #994CC3">local</span><span style="color: #403F53"> </span><span style="color: #4876D6">dir</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #111111">&#39;</span><span style="color: #C96765">/tmp/xvlog/</span><span style="color: #111111">&#39; </span><span style="color: #0C969B">..</span><span style="color: #403F53"> </span><span style="color: #4876D6">params</span><span style="color: #403F53">.bufnr</span></span>
<span><span style="color: #403F53">      </span><span style="color: #4876D6">vim</span><span style="color: #403F53">.fn.</span><span style="color: #4876D6">mkdir</span><span style="color: #403F53">(</span><span style="color: #4876D6">dir</span><span style="color: #403F53">, </span><span style="color: #111111">&#39;</span><span style="color: #C96765">p</span><span style="color: #111111">&#39;</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">      </span><span style="color: #994CC3">return</span><span style="color: #403F53"> </span><span style="color: #4876D6">dir</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">end</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">to_temp_file</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">true</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">format</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">line</span><span style="color: #111111">&quot;</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">check_exit_code</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> { </span><span style="color: #AA0982">0</span><span style="color: #403F53">, </span><span style="color: #AA0982">1</span><span style="color: #403F53"> },</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">on_output</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">helpers</span><span style="color: #403F53">.diagnostics.</span><span style="color: #4876D6">from_patterns</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">      {</span></span>
<span><span style="color: #403F53">        </span><span style="color: #4876D6">pattern</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #111111">&#39;</span><span style="color: #C96765">(.+): %[.+%] (.+) %[.+:(%d+)%]</span><span style="color: #111111">&#39;</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">        </span><span style="color: #4876D6">groups</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> { </span><span style="color: #111111">&quot;</span><span style="color: #C96765">severity</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">message</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">row</span><span style="color: #111111">&quot; </span><span style="color: #403F53">},</span></span>
<span><span style="color: #403F53">        </span><span style="color: #4876D6">overrides</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">          </span><span style="color: #4876D6">severities</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">            [</span><span style="color: #111111">&quot;</span><span style="color: #C96765">ERROR</span><span style="color: #111111">&quot;</span><span style="color: #403F53">] </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">            [</span><span style="color: #111111">&quot;</span><span style="color: #C96765">WARNING</span><span style="color: #111111">&quot;</span><span style="color: #403F53">] </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">2</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">            [</span><span style="color: #111111">&quot;</span><span style="color: #C96765">INFO</span><span style="color: #111111">&quot;</span><span style="color: #403F53">] </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">3</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">          },</span></span>
<span><span style="color: #403F53">        },</span></span>
<span><span style="color: #403F53">      },</span></span>
<span><span style="color: #403F53">    },</span></span>
<span><span style="color: #403F53">  },</span></span>
<span><span style="color: #403F53">}</span></span>
<span></span>
<span><span style="color: #4876D6">null_ls</span><span style="color: #403F53">.</span><span style="color: #4876D6">setup</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">sources</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> {</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">xvlog_sv</span><span style="color: #403F53">,</span></span>
<span><span style="color: #403F53">  },</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">root_dir</span><span style="color: #403F53"> </span><span style="color: #0C969B">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">utils</span><span style="color: #403F53">.</span><span style="color: #4876D6">root_pattern</span><span style="color: #403F53">(</span><span style="color: #111111">&quot;</span><span style="color: #C96765">*.xpr</span><span style="color: #111111">&quot;</span><span style="color: #403F53">, </span><span style="color: #111111">&quot;</span><span style="color: #C96765">.git</span><span style="color: #111111">&quot;</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">}</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">local</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">null_ls</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">require</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">null-ls</span><span style="color: #D9F5DD">&quot;</span></span>
<span><span style="color: #C792EA">local</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">utils</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">require</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">null-ls.utils</span><span style="color: #D9F5DD">&quot;</span></span>
<span><span style="color: #C792EA">local</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">helpers</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">require</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">null-ls.helpers</span><span style="color: #D9F5DD">&quot;</span></span>
<span></span>
<span><span style="color: #C792EA">local</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">xvlog_sv</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">name</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">xvlog</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">method</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">null_ls</span><span style="color: #D6DEEB">.methods.DIAGNOSTICS,</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">filetypes</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> { </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">systemverilog</span><span style="color: #D9F5DD">&quot; </span><span style="color: #D6DEEB">},</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">generator</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">null_ls</span><span style="color: #D6DEEB">.</span><span style="color: #C5E478">generator</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">command</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">bwrap</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #637777">-- only permit writing in /tmp</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">args</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">--ro-bind</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">/</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">/</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">--bind</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">/tmp/xvlog</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">/tmp/xvlog</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">--dev</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">/dev</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">/home/ouuan/Xilinx/Vivado/2019.2/bin/xvlog</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">--sv</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">$FILENAME</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">    },</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">cwd</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">function</span><span style="color: #D9F5DD">(</span><span style="color: #7FDBCA">params</span><span style="color: #D9F5DD">)</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #637777">-- output in /tmp</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #C792EA">local</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">dir</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&#39;</span><span style="color: #ECC48D">/tmp/xvlog/</span><span style="color: #D9F5DD">&#39; </span><span style="color: #7FDBCA">..</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">params</span><span style="color: #D6DEEB">.bufnr</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #C5E478">vim</span><span style="color: #D6DEEB">.fn.</span><span style="color: #C5E478">mkdir</span><span style="color: #D6DEEB">(</span><span style="color: #C5E478">dir</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&#39;</span><span style="color: #ECC48D">p</span><span style="color: #D9F5DD">&#39;</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #C792EA">return</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">dir</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">end</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">to_temp_file</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">true</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">format</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">line</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">check_exit_code</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> { </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB"> },</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">on_output</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">helpers</span><span style="color: #D6DEEB">.diagnostics.</span><span style="color: #C5E478">from_patterns</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">      {</span></span>
<span><span style="color: #D6DEEB">        </span><span style="color: #C5E478">pattern</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&#39;</span><span style="color: #ECC48D">(.+): %[.+%] (.+) %[.+:(%d+)%]</span><span style="color: #D9F5DD">&#39;</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">        </span><span style="color: #C5E478">groups</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> { </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">severity</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">message</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">row</span><span style="color: #D9F5DD">&quot; </span><span style="color: #D6DEEB">},</span></span>
<span><span style="color: #D6DEEB">        </span><span style="color: #C5E478">overrides</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">          </span><span style="color: #C5E478">severities</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">            [</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">ERROR</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">] </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">            [</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">WARNING</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">] </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">2</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">            [</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">INFO</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">] </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">3</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">          },</span></span>
<span><span style="color: #D6DEEB">        },</span></span>
<span><span style="color: #D6DEEB">      },</span></span>
<span><span style="color: #D6DEEB">    },</span></span>
<span><span style="color: #D6DEEB">  },</span></span>
<span><span style="color: #D6DEEB">}</span></span>
<span></span>
<span><span style="color: #C5E478">null_ls</span><span style="color: #D6DEEB">.</span><span style="color: #C5E478">setup</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">sources</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> {</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">xvlog_sv</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #D6DEEB">  },</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">root_dir</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">utils</span><span style="color: #D6DEEB">.</span><span style="color: #C5E478">root_pattern</span><span style="color: #D6DEEB">(</span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">*.xpr</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">, </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">.git</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">}</span></span></code></pre></div></section>
<p>另外可以用 <a href="https://github.com/amal-khailtash/vim-xdc-syntax">vim-xdc-syntax</a> 添加管脚约束文件的高亮<span class="mojikumi-line-end">。</span></p>
<p>Vivado 的 custom text editor 使用下面的脚本<span class="mojikumi-line-end">。</span>是针对 <a href="https://i3wm.org/">i3</a> 配的<span class="mojikumi-line-end">，</span>给 konsole 设了 name 参数<span class="mojikumi-line-end">，</span>i3 设成 <code>assign<wbr> [<wbr>instance<wbr>="<wbr>konsole<wbr>"]</code><span class="mojikumi-line-start">（</span><code>instance</code> 而非 <code>class</code><span class="mojikumi-line-end">）</span>就可以不把这个 konsole 挪到其他 konsole 所在的 workspace<span class="mojikumi-line-end">，</span>并且可以在打开新文件时 focus 过去<span class="mojikumi-line-end">。</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h3 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="Shell 代码块" data-v-c675dba6>Shell</h3><ile-root id="ile-2"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-2--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #989FB1">#!/bin/bash</span></span>
<span></span>
<span><span style="color: #989FB1"># vivado-nvim.sh &quot;[file name]&quot; [line number]</span></span>
<span></span>
<span><span style="color: #4876D6">set</span><span style="color: #403F53"> </span><span style="color: #4876D6">-euo</span><span style="color: #403F53"> </span><span style="color: #4876D6">pipefail</span></span>
<span></span>
<span><span style="color: #4876D6">unset</span><span style="color: #403F53"> </span><span style="color: #4876D6">LD_LIBRARY_PATH</span></span>
<span></span>
<span><span style="color: #4876D6">NVIM_LISTEN_ADDRESS</span><span style="color: #994CC3">=</span><span style="color: #4876D6">/tmp/vivado-nvim.pipe</span></span>
<span></span>
<span><span style="color: #994CC3">if</span><span style="color: #403F53"> [[ </span><span style="color: #994CC3">!</span><span style="color: #403F53"> </span><span style="color: #994CC3">-e</span><span style="color: #403F53"> </span><span style="color: #4876D6">$NVIM_LISTEN_ADDRESS</span><span style="color: #403F53"> ]]; </span><span style="color: #994CC3">then</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">exec</span><span style="color: #403F53"> </span><span style="color: #4876D6">konsole</span><span style="color: #403F53"> </span><span style="color: #4876D6">--name</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">vivado-nvim</span><span style="color: #111111">&quot;</span><span style="color: #403F53"> </span><span style="color: #4876D6">-e</span><span style="color: #403F53"> </span><span style="color: #4876D6">nvim</span><span style="color: #403F53"> </span><span style="color: #4876D6">--listen</span><span style="color: #403F53"> </span><span style="color: #4876D6">$NVIM_LISTEN_ADDRESS</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #403F53">$1</span><span style="color: #111111">&quot;</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">+</span><span style="color: #403F53">$2</span><span style="color: #111111">&quot;</span></span>
<span><span style="color: #994CC3">else</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">nvim</span><span style="color: #403F53"> </span><span style="color: #4876D6">--server</span><span style="color: #403F53"> </span><span style="color: #4876D6">$NVIM_LISTEN_ADDRESS</span><span style="color: #403F53"> </span><span style="color: #4876D6">--remote</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #403F53">$1</span><span style="color: #111111">&quot;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">nvim</span><span style="color: #403F53"> </span><span style="color: #4876D6">--server</span><span style="color: #403F53"> </span><span style="color: #4876D6">$NVIM_LISTEN_ADDRESS</span><span style="color: #403F53"> </span><span style="color: #4876D6">--remote-send</span><span style="color: #403F53"> </span><span style="color: #111111">&quot;</span><span style="color: #C96765">:</span><span style="color: #403F53">$2</span><span style="color: #C96765">&lt;CR&gt;</span><span style="color: #111111">&quot;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">i3-msg</span><span style="color: #403F53"> </span><span style="color: #111111">&#39;</span><span style="color: #C96765">[instance=&quot;vivado-nvim&quot;] focus</span><span style="color: #111111">&#39;</span></span>
<span><span style="color: #994CC3">fi</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #637777">#!/bin/bash</span></span>
<span></span>
<span><span style="color: #637777"># vivado-nvim.sh &quot;[file name]&quot; [line number]</span></span>
<span></span>
<span><span style="color: #C5E478">set</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">-euo</span><span style="color: #D6DEEB"> </span><span style="color: #ECC48D">pipefail</span></span>
<span></span>
<span><span style="color: #C5E478">unset</span><span style="color: #D6DEEB"> </span><span style="color: #ECC48D">LD_LIBRARY_PATH</span></span>
<span></span>
<span><span style="color: #C5E478">NVIM_LISTEN_ADDRESS</span><span style="color: #C792EA">=</span><span style="color: #ECC48D">/tmp/vivado-nvim.pipe</span></span>
<span></span>
<span><span style="color: #C792EA">if</span><span style="color: #D6DEEB"> [[ </span><span style="color: #C792EA">!</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">-e</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">$NVIM_LISTEN_ADDRESS</span><span style="color: #D6DEEB"> ]]; </span><span style="color: #C792EA">then</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">exec</span><span style="color: #D6DEEB"> </span><span style="color: #ECC48D">konsole</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">--name</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">vivado-nvim</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">-e</span><span style="color: #D6DEEB"> </span><span style="color: #ECC48D">nvim</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">--listen</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">$NVIM_LISTEN_ADDRESS</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #D7DBE0">$1</span><span style="color: #D9F5DD">&quot;</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">+</span><span style="color: #D7DBE0">$2</span><span style="color: #D9F5DD">&quot;</span></span>
<span><span style="color: #C792EA">else</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">nvim</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">--server</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">$NVIM_LISTEN_ADDRESS</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">--remote</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #D7DBE0">$1</span><span style="color: #D9F5DD">&quot;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">nvim</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">--server</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">$NVIM_LISTEN_ADDRESS</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">--remote-send</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&quot;</span><span style="color: #ECC48D">:</span><span style="color: #D7DBE0">$2</span><span style="color: #ECC48D">&lt;CR&gt;</span><span style="color: #D9F5DD">&quot;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">i3-msg</span><span style="color: #D6DEEB"> </span><span style="color: #D9F5DD">&#39;</span><span style="color: #ECC48D">[instance=&quot;vivado-nvim&quot;] focus</span><span style="color: #D9F5DD">&#39;</span></span>
<span><span style="color: #C792EA">fi</span></span></code></pre></div></section>
<h2 id="基础语法" class="heading"><a href="#基础语法" class="heading-anchor" aria-label="章节： 基础语法" tabindex="-1"></a><span>基础语法</span></h2>
<h3 id="module" class="heading"><a href="#module" class="heading-anchor" aria-label="章节： module" tabindex="-1"></a><span>module</span></h3>
<p>Verilog 以 module 为基本单位<span class="mojikumi-line-start">（</span>和前端的 component 有点类似<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>例子<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h4><ile-root id="ile-3"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-3--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> inhibit (</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #403F53">  in,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #403F53">  invin,</span></span>
<span><span style="color: #4876D6">    output</span><span style="color: #403F53"> out</span></span>
<span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">assign</span><span style="color: #403F53"> out </span><span style="color: #994CC3">=</span><span style="color: #403F53"> in </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> </span><span style="color: #994CC3">~</span><span style="color: #403F53">invin;</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> inhibit (</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">  in,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">  invin,</span></span>
<span><span style="color: #C5E478">    output</span><span style="color: #D6DEEB"> out</span></span>
<span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">assign</span><span style="color: #D6DEEB"> out </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> in </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">~</span><span style="color: #D6DEEB">invin;</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<p>convention 是每个文件只写一个 module<span class="mojikumi-line-end">。</span></p>
<h3 id="signal-net-variable" class="heading"><a href="#signal-net-variable" class="heading-anchor" aria-label="章节： signal (net &#x26; variable)" tabindex="-1"></a><span>signal (net &#x26; variable)</span></h3>
<p>一个 1-bit 的 signal 有四种取值<span class="mojikumi-line-end">：</span>0<span class="mojikumi-line-end">、</span>1<span class="mojikumi-line-end">、</span>x<span class="mojikumi-line-start">（</span>未知<span class="mojikumi">）</span><span class="mojikumi-line-end">、</span>z<span class="mojikumi-line-start">（</span>高阻抗<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>位运算<span class="mojikumi-line-end">：</span><code>&#x26;</code><span class="mojikumi-line-end">、</span><code>|</code><span class="mojikumi-line-end">、</span><code>~</code><span class="mojikumi-line-end">、</span><code>^</code><span class="mojikumi-line-end">、</span><code>~^</code>/<code>^~</code><span class="mojikumi-line-end">。</span></p>
<p>signal 有两大类<span class="mojikumi-line-end">：</span><i>net</i> 和 <i>variable</i><span class="mojikumi-line-end">：</span></p>
<ul>
<li>net 表示线路<span class="mojikumi-line-end">，</span>一般是 <code>wire</code><span class="mojikumi-line-end">，</span>还可以是 <code>supply0</code><span class="mojikumi-line-end">、</span><code>supply1</code> 等<span class="mojikumi-line-start">（</span>我用 <code>supply1</code> 的时候出现了神秘的问题<span class="mojikumi-line-end">，</span>没细究<span class="mojikumi-line-end">，</span>反正用恒为 1 的 <code>logic</code> 也差不多<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li>variable 用于 procedural statement 中<span class="mojikumi-line-end">，</span>不一定对应到物理上的线路<span class="mojikumi-line-end">，</span>可以是 <code>reg</code> 或者 <code>integer</code><span class="mojikumi-line-end">。</span>其中 <code>reg</code> 就是变量的意思<span class="mojikumi-line-start">（</span>名字取得不太好<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>表示单个 bit 或者 vector<span class="mojikumi-line-end">，</span>与基于 flip-flop 的寄存器无关<span class="mojikumi-line-end">。</span><code>integer</code> 是有符号整型<span class="mojikumi-line-end">，</span>一般不用来存储数据或信号<span class="mojikumi-line-end">，</span>而是用于 for 循环之类的地方<span class="mojikumi-line-end">。</span></li>
</ul>
<p>input 只能是 net<span class="mojikumi-line-end">，</span>而 output 可以是 net 或 <code>reg</code><span class="mojikumi-line-end">。</span>不写 <code>wire</code> / <code>reg</code> 时默认是 <code>wire</code><span class="mojikumi-line-end">。</span></p>
<p>在 SystemVerilog 中推荐用 <code>logic</code> 来代替 <code>reg</code><span class="mojikumi-line-end">。</span></p>
<h3 id="数字字面量-parameter" class="heading"><a href="#数字字面量-parameter" class="heading-anchor" aria-label="章节： 数字字面量 &#x26; parameter" tabindex="-1"></a><span>数字字面量 &#x26; parameter</span></h3>
<p>直接写十进制数会得到一个 signed number<span class="mojikumi-line-end">。</span></p>
<p>可以指定位数和进制<span class="mojikumi-line-end">：</span><code>1'b0</code> 是 1 bit 的 0<span class="mojikumi-line-end">，</span><code>4'ha</code> 是 4 bit 的 10<span class="mojikumi-line-start">（</span>十六进制的 A<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span><code>8<wbr>'<wbr>b01x0z1x1</code> 的一些 bit 是未知 / 高阻抗<span class="mojikumi-line-end">。</span>如果后面写的值的位数超过前面指定的位数<span class="mojikumi-line-end">，</span>高位会被扔掉<span class="mojikumi-line-end">，</span>如果少了则会高位补零<span class="mojikumi-line-start">（</span>或者补 <code>x</code> 或 <code>z</code><span class="mojikumi-line-end">，</span>如果最高位是 <code>x</code> 或 <code>z</code><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>这样得到的会是一个 unsigned vector<span class="mojikumi-line-end">，</span>可以加上 <code>s</code> 得到 signed vector<span class="mojikumi-line-end">：</span><code>4'sb1101</code><span class="mojikumi-line-end">。</span></p>
<p><code>parameter</code> 用来设置带默认值的参数<span class="mojikumi-line-end">：</span><code>parameter SIZE = 32, MSB = SIZE - 1, LSB = 0</code><span class="mojikumi-line-end">，</span><code>parameter ESC = 7'h1b</code><span class="mojikumi">。</span> <code>parameter</code> 一般用作常量<span class="mojikumi-line-end">，</span>而在 <a href="#structural-model">instance statement</a> 中可以被修改<span class="mojikumi-line-end">。</span></p>
<h3 id="vector-算术运算" class="heading"><a href="#vector-算术运算" class="heading-anchor" aria-label="章节： vector &#x26; 算术运算" tabindex="-1"></a><span>vector &#x26; 算术运算</span></h3>
<p>多个 bit 可以组成一个 vector<span class="mojikumi-line-end">，</span>net<span class="mojikumi-line-end">、</span><code>reg</code><span class="mojikumi-line-end">、</span><code>parameter</code> 都可以是 vector<span class="mojikumi-line-end">。</span></p>
<p>vector 的下标可以是左边<span class="mojikumi-line-start">（</span>MSB<span class="mojikumi-line-end">）</span>大<span class="mojikumi-line-start">（</span><code>reg [7:0] byte1, byte2</code><span class="mojikumi-line-end">）</span>也可以是右边<span class="mojikumi-line-start">（</span>LSB<span class="mojikumi-line-end">）</span>大<span class="mojikumi-line-start">（</span><code>reg [1:16] bus</code><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>起止的下标都可以指定<span class="mojikumi-line-end">。</span>左边的下标对应字面量中左边的 bit<span class="mojikumi-line-end">。</span><code>byte1[7]</code> 是 <code>byte1</code> 最左边的 bit<span class="mojikumi-line-end">，</span><code>bus[16]</code> 是 <code>bus</code> 最右边的 bit<span class="mojikumi-line-end">。</span><code>bus[1:8]</code> 和 <code>bus[9:16]</code> 是 <code>bus</code> 的左右两边<span class="mojikumi-line-end">。</span>读取越界会读到 <code>x</code><span class="mojikumi-line-end">，</span>写入会忽略越界的部分<span class="mojikumi-line-end">。</span></p>
<p><code>{}</code> 用来连接 vector<span class="mojikumi-line-end">，</span>例如 <code>{2'b10, 2'b01}</code> 等于 <code>4'b1001</code><span class="mojikumi-line-end">，</span><code>{2{byte1}, 2{byte2}}</code> 等于 <code>{byte1, byte1, byte2, byte2}</code><span class="mojikumi-line-end">。</span></p>
<p>vector 可以按位进行位运算<span class="mojikumi-line-end">，</span>在二元运算中短的会高位补零后进行运算<span class="mojikumi-line-end">。</span></p>
<p>二元位运算符也有一元的版本<span class="mojikumi-line-end">，</span>表示将 vector 内所有 bit 运算在一起得到 1-bit 的结果<span class="mojikumi-line-end">，</span>例如 <code>&#x26;byte1</code> 是 <code>1'b1</code> 表示 <code>byte1</code> 的所有 bit 都是 1<span class="mojikumi-line-end">。</span></p>
<p>vector 之间进行赋值时会截低位或高位补零<span class="mojikumi-line-end">。</span></p>
<p>vector 之间可以进行算术<span class="mojikumi-line-end">：</span><code>+</code><span class="mojikumi-line-end">、</span><code>-</code><span class="mojikumi-line-end">、</span><code>*</code><span class="mojikumi-line-end">、</span><code>/</code><span class="mojikumi-line-end">、</span><code>%</code><span class="mojikumi-line-end">、</span><code>**</code><span class="mojikumi-line-end">、</span><code>&#x3C;&#x3C;</code><span class="mojikumi-line-end">、</span><code>>></code><span class="mojikumi-line-end">、</span><code>&#x3C;&#x3C;&#x3C;</code><span class="mojikumi-line-start">（</span>算术左移<span class="mojikumi">）</span><span class="mojikumi-line-end">、</span><code>>>></code><span class="mojikumi-line-start">（</span>算术右移<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>算术的高位和低位基于左右而与下标大小无关<span class="mojikumi-line-end">。</span></p>
<p>除法和取模在某些情况下可能不 synthesizable<span class="mojikumi-line-end">，</span>除非除数是 2 的次幂<span class="mojikumi-line-end">。</span>synthesizable 时也可能会生成除法器的电路而非常昂贵<span class="mojikumi-line-end">。</span></p>
<p>逻辑移位得到 unsigned<span class="mojikumi-line-end">，</span>算术移位保持原来的 signed/unsigned<span class="mojikumi-line-end">，</span>算术右移高位补符号位<span class="mojikumi-line-end">。</span>二元算术中只要有一个是 unsigned 就会将另一个转成 unsigned 再计算<span class="mojikumi-line-end">。</span>signal 可以声明为 signed<span class="mojikumi-line-end">：</span><code>reg signed [15:0] a</code><span class="mojikumi-line-end">。</span></p>
<h3 id="array" class="heading"><a href="#array" class="heading-anchor" aria-label="章节： array" tabindex="-1"></a><span>array</span></h3>
<p>array 是相同类型的一列东西<span class="mojikumi-line-start">（</span>一列 <code>reg</code><span class="mojikumi-line-end">、</span><code>integer</code><span class="mojikumi-line-end">、</span><code>wire</code> 等<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>array 也可以指定下标范围<span class="mojikumi-line-end">，</span>而与 vector 相反<span class="mojikumi-line-end">，</span>声明 array 时框放在右边<span class="mojikumi-line-end">，</span>例如 <code>reg<wbr> [<wbr>7<wbr>:<wbr>0<wbr>] <wbr>byte1<wbr>, <wbr>mem1<wbr>[<wbr>0<wbr>:<wbr>255<wbr>]</code> 表示一个 8-bit <code>reg</code> 和一个由 256 个 8-bit <code>reg</code> 组成的 array<span class="mojikumi-line-end">。</span></p>
<p>array 可以嵌套为高维数组<span class="mojikumi-line-end">，</span>而访问只能访问单个下标<span class="mojikumi-line-end">，</span>不能像 vector 一样一下访问一个区间<span class="mojikumi-line-end">。</span>总之除了能指定下标范围都和 C 的数组差不多<span class="mojikumi-line-end">。</span></p>
<h3 id="逻辑运算" class="heading"><a href="#逻辑运算" class="heading-anchor" aria-label="章节： 逻辑运算" tabindex="-1"></a><span>逻辑运算</span></h3>
<p>含 <code>x</code> / <code>z</code> 或者全 0 的 vector<span class="mojikumi-line-start">（</span>或者 <code>1'b0</code><span class="mojikumi-line-end">）</span>是 false<span class="mojikumi-line-end">，</span>不含 <code>x</code> / <code>z</code> 且含 1 的 vector<span class="mojikumi-line-start">（</span>或者 <code>1'b1</code><span class="mojikumi-line-end">）</span>是 true<span class="mojikumi-line-end">。</span>false 的值是 <code>1'b0</code><span class="mojikumi-line-end">，</span>true 的值是 <code>1'b1</code><span class="mojikumi-line-end">。</span></p>
<p>逻辑运算符和比较运算符和 C 是一样的<span class="mojikumi-line-end">。</span>比较时如果一侧是 unsigned 则会按 unsigned 比较<span class="mojikumi-line-end">。</span>比较运算在电路中可能需要比较器<span class="mojikumi-line-start">（</span>尤其是两侧都不是常量时<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>所以可能是昂贵的<span class="mojikumi-line-end">。</span></p>
<p>三目运算符 <code>?:</code> 和 C 是一样的<span class="mojikumi-line-end">。</span></p>
<p>在 test bench 中<span class="mojikumi-line-end">，</span>带 <code>x</code> / <code>z</code> 的值在比较时结果为 <code>x</code><span class="mojikumi-line-start">（</span>用在条件判断时即为 false<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>可以使用 <code>===</code> / <code>!==</code> 来逐位比较<span class="mojikumi-line-start">（</span><code>x === x</code>, <code>z === z</code><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>但它们不能用在 synthesizable module 中<span class="mojikumi-line-end">。</span></p>
<h3 id="compiler-directives" class="heading"><a href="#compiler-directives" class="heading-anchor" aria-label="章节： compiler directives" tabindex="-1"></a><span>compiler directives</span></h3>
<p><code>`include</code> 和 <code>`define</code><span class="mojikumi-line-end">，</span>和 C 是一样的<span class="mojikumi-line-end">。</span></p>
<h2 id="model" class="heading"><a href="#model" class="heading-anchor" aria-label="章节： model" tabindex="-1"></a><span>model</span></h2>
<h3 id="structural-model" class="heading"><a href="#structural-model" class="heading-anchor" aria-label="章节： structural model" tabindex="-1"></a><span>structural model</span></h3>
<p>可以使用 <i>instance statement</i> 来写 structural model<span class="mojikumi-line-end">，</span>说白了就是将其他 module 实例化并连线<span class="mojikumi-line-end">。</span></p>
<p>built-in gate 有<span class="mojikumi-line-end">：</span></p>
<ul>
<li><code>and</code><span class="mojikumi-line-end">、</span><code>nand</code><span class="mojikumi-line-end">、</span><code>or</code><span class="mojikumi-line-end">、</span><code>nor</code><span class="mojikumi-line-end">、</span><code>xor</code><span class="mojikumi-line-end">、</span><code>xnor</code><span class="mojikumi-line-end">，</span>接受任意个输入</li>
<li><code>buf</code><span class="mojikumi-line-end">、</span><code>not</code><span class="mojikumi-line-end">，</span>接受单个输入</li>
<li><code>bufif0</code><span class="mojikumi-line-end">、</span><code>bufif1</code><span class="mojikumi-line-end">、</span><code>notif0</code><span class="mojikumi-line-end">、</span><code>notif1</code><span class="mojikumi-line-end">，</span>三态门<span class="mojikumi-line-end">，</span>接受一个 data input 和一个 enable input<span class="mojikumi-line-start">（</span>data input 在前<span class="mojikumi-line-end">，</span>enable input 在后<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>if 表示 enable 的 active level</li>
</ul>
<p>使用 built-in gate 的例子<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span>built-in gate 的 port 没有名字<span class="mojikumi-line-end">，</span>只能通过顺序指定<span class="mojikumi-line-end">，</span>output 在前<span class="mojikumi-line-end">）</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h4><ile-root id="ile-4"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-4--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> inhibit (</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #403F53">  in,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #403F53">  invin,</span></span>
<span><span style="color: #4876D6">    output</span><span style="color: #403F53"> out</span></span>
<span><span style="color: #403F53">);</span></span>
<span><span style="color: #994CC3">  wire</span><span style="color: #403F53"> notinvin;</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">not</span><span style="color: #403F53"> </span><span style="color: #4876D6">U1</span><span style="color: #403F53"> (notinvin, invin);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">and</span><span style="color: #403F53"> </span><span style="color: #4876D6">U2</span><span style="color: #403F53"> (out, in, notinvin);</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> inhibit (</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">  in,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">  invin,</span></span>
<span><span style="color: #C5E478">    output</span><span style="color: #D6DEEB"> out</span></span>
<span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #C792EA">  wire</span><span style="color: #D6DEEB"> notinvin;</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">not</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">U1</span><span style="color: #D6DEEB"> (notinvin, invin);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">and</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">U2</span><span style="color: #D6DEEB"> (out, in, notinvin);</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<p>使用其他 module 的例子<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span>可以指定每个 port 的名字从而不依赖于顺序<span class="mojikumi-line-end">）</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h4><ile-root id="ile-5"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-5--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> silly_xor (</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #403F53">  in1,</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> in2,</span></span>
<span><span style="color: #4876D6">    output</span><span style="color: #403F53"> out</span></span>
<span><span style="color: #403F53">);</span></span>
<span><span style="color: #994CC3">  wire</span><span style="color: #403F53"> inh1, inh2, notinh2, notout;</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">inhibit</span><span style="color: #403F53"> U1 (</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">out</span><span style="color: #403F53">(inh1),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">in</span><span style="color: #403F53">(in1),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">invin</span><span style="color: #403F53">(in2)</span></span>
<span><span style="color: #403F53">  );</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">inhibit</span><span style="color: #403F53"> U2 (</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">out</span><span style="color: #403F53">(inh2),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">in</span><span style="color: #403F53">(in2),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">invin</span><span style="color: #403F53">(in1)</span></span>
<span><span style="color: #403F53">  );</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">not</span><span style="color: #403F53"> </span><span style="color: #4876D6">U3</span><span style="color: #403F53"> (notinh2, inh2);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">inhibit</span><span style="color: #403F53"> U4 (</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">out</span><span style="color: #403F53">(notout),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">in</span><span style="color: #403F53">(notinh2),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">invin</span><span style="color: #403F53">(inh1)</span></span>
<span><span style="color: #403F53">  );</span></span>
<span><span style="color: #403F53">  </span><span style="color: #4876D6">not</span><span style="color: #403F53"> </span><span style="color: #4876D6">U5</span><span style="color: #403F53"> (out, notout);</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> silly_xor (</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">  in1,</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> in2,</span></span>
<span><span style="color: #C5E478">    output</span><span style="color: #D6DEEB"> out</span></span>
<span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #C792EA">  wire</span><span style="color: #D6DEEB"> inh1, inh2, notinh2, notout;</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">inhibit</span><span style="color: #D6DEEB"> U1 (</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">out</span><span style="color: #D6DEEB">(inh1),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">in</span><span style="color: #D6DEEB">(in1),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">invin</span><span style="color: #D6DEEB">(in2)</span></span>
<span><span style="color: #D6DEEB">  );</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">inhibit</span><span style="color: #D6DEEB"> U2 (</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">out</span><span style="color: #D6DEEB">(inh2),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">in</span><span style="color: #D6DEEB">(in2),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">invin</span><span style="color: #D6DEEB">(in1)</span></span>
<span><span style="color: #D6DEEB">  );</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">not</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">U3</span><span style="color: #D6DEEB"> (notinh2, inh2);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">inhibit</span><span style="color: #D6DEEB"> U4 (</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">out</span><span style="color: #D6DEEB">(notout),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">in</span><span style="color: #D6DEEB">(notinh2),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">invin</span><span style="color: #D6DEEB">(inh1)</span></span>
<span><span style="color: #D6DEEB">  );</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C5E478">not</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">U5</span><span style="color: #D6DEEB"> (out, notout);</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<p>修改 <code>parameter</code> 的例子<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h4><ile-root id="ile-6"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-6--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> maj </span><span style="color: #0C969B">#</span><span style="color: #403F53">(</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">WID</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span></span>
<span><span style="color: #403F53">) (</span></span>
<span><span style="color: #4876D6">    output</span><span style="color: #403F53"> [</span><span style="color: #4876D6">WID</span><span style="color: #994CC3">-</span><span style="color: #AA0982">1</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">] out,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #403F53">  [</span><span style="color: #4876D6">WID</span><span style="color: #994CC3">-</span><span style="color: #AA0982">1</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">] i0,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #403F53">  [</span><span style="color: #4876D6">WID</span><span style="color: #994CC3">-</span><span style="color: #AA0982">1</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">] i1,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #403F53">  [</span><span style="color: #4876D6">WID</span><span style="color: #994CC3">-</span><span style="color: #AA0982">1</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">] i2</span></span>
<span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">assign</span><span style="color: #403F53"> out </span><span style="color: #994CC3">=</span><span style="color: #403F53"> i0 </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> i1 </span><span style="color: #994CC3">|</span><span style="color: #403F53"> i0 </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> i2 </span><span style="color: #994CC3">|</span><span style="color: #403F53"> i1 </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> i2;</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> maj </span><span style="color: #7FDBCA">#</span><span style="color: #D6DEEB">(</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">WID</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span></span>
<span><span style="color: #D6DEEB">) (</span></span>
<span><span style="color: #C5E478">    output</span><span style="color: #D6DEEB"> [</span><span style="color: #82AAFF">WID</span><span style="color: #C792EA">-</span><span style="color: #F78C6C">1</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] out,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">  [</span><span style="color: #82AAFF">WID</span><span style="color: #C792EA">-</span><span style="color: #F78C6C">1</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] i0,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">  [</span><span style="color: #82AAFF">WID</span><span style="color: #C792EA">-</span><span style="color: #F78C6C">1</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] i1,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">  [</span><span style="color: #82AAFF">WID</span><span style="color: #C792EA">-</span><span style="color: #F78C6C">1</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] i2</span></span>
<span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">assign</span><span style="color: #D6DEEB"> out </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> i0 </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> i1 </span><span style="color: #C792EA">|</span><span style="color: #D6DEEB"> i0 </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> i2 </span><span style="color: #C792EA">|</span><span style="color: #D6DEEB"> i1 </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> i2;</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<p>然后就可以 <code>maj #(8) U1 (.out(W), .i0(X), .i1(Y), .i2(Z))</code> 或者 <code>maj #(.WID(8)) U1 (.out(W), .i0(X), .i1(Y), .i2(Z))</code> 了<span class="mojikumi-line-end">。</span></p>
<p>不指定 <code>parameter</code> 时会使用其默认值<span class="mojikumi-line-end">，</span><code>parameter</code> 只能在 instance statement 也就是 structural model 中被修改<span class="mojikumi-line-end">，</span>在其他类型的 model 中只能使用默认值<span class="mojikumi-line-end">。</span></p>
<p>可以使用 <code>generate</code> block<span class="mojikumi-line-end">，</span>作用类似于 <code>v-for</code><span class="mojikumi-line-end">、</span><code>v-if</code><span class="mojikumi-line-end">，</span>里面可以用 <code>for</code><span class="mojikumi-line-start">（</span>循环变量需要是 <code>genvar</code><span class="mojikumi">）</span><span class="mojikumi-line-end">、</span><code>if</code><span class="mojikumi-line-end">、</span><code>case</code><span class="mojikumi-line-start">（</span>被判断的要是 parameter<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>例如<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h4><ile-root id="ile-7"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-7--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">genvar</span><span style="color: #403F53"> i;</span></span>
<span><span style="color: #994CC3">generate</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">for</span><span style="color: #403F53"> (i </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">; i </span><span style="color: #994CC3">&lt;</span><span style="color: #403F53"> </span><span style="color: #4876D6">N</span><span style="color: #403F53">; i </span><span style="color: #994CC3">=</span><span style="color: #403F53"> i </span><span style="color: #994CC3">+</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">) </span><span style="color: #994CC3">begin</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">half_adder</span><span style="color: #403F53"> u0 (a[i], b[i], sum[i], cout[i]);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">end</span></span>
<span><span style="color: #994CC3">endgenerate</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">genvar</span><span style="color: #D6DEEB"> i;</span></span>
<span><span style="color: #C792EA">generate</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">for</span><span style="color: #D6DEEB"> (i </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">; i </span><span style="color: #C792EA">&lt;</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">; i </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> i </span><span style="color: #C792EA">+</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">) </span><span style="color: #C792EA">begin</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">half_adder</span><span style="color: #D6DEEB"> u0 (a[i], b[i], sum[i], cout[i]);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">end</span></span>
<span><span style="color: #C792EA">endgenerate</span></span></code></pre></div></section>
<h3 id="dataflow-model" class="heading"><a href="#dataflow-model" class="heading-anchor" aria-label="章节： dataflow model" tabindex="-1"></a><span>dataflow model</span></h3>
<p>可以使用 <i>continuous-assignment statement</i> 来写 dataflow model<span class="mojikumi-line-end">，</span>也就是 <code>assign</code><span class="mojikumi-line-end">，</span>例如<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h4><ile-root id="ile-8"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-8--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> is_prime (</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> [</span><span style="color: #AA0982">3</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">] </span><span style="color: #4876D6">N</span><span style="color: #403F53">,</span></span>
<span><span style="color: #4876D6">    output</span><span style="color: #403F53"> </span><span style="color: #4876D6">F</span></span>
<span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">assign</span><span style="color: #403F53"> </span><span style="color: #4876D6">F</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">N</span><span style="color: #403F53">[</span><span style="color: #AA0982">3</span><span style="color: #403F53">] </span><span style="color: #994CC3">?</span><span style="color: #403F53"> (</span><span style="color: #4876D6">N</span><span style="color: #403F53">[</span><span style="color: #AA0982">0</span><span style="color: #403F53">] </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> (</span><span style="color: #4876D6">N</span><span style="color: #403F53">[</span><span style="color: #AA0982">1</span><span style="color: #403F53">] </span><span style="color: #994CC3">^</span><span style="color: #403F53"> </span><span style="color: #4876D6">N</span><span style="color: #403F53">[</span><span style="color: #AA0982">2</span><span style="color: #403F53">])) </span><span style="color: #994CC3">:</span><span style="color: #403F53"> (</span><span style="color: #4876D6">N</span><span style="color: #403F53">[</span><span style="color: #AA0982">0</span><span style="color: #403F53">] </span><span style="color: #994CC3">|</span><span style="color: #403F53"> (</span><span style="color: #994CC3">~</span><span style="color: #4876D6">N</span><span style="color: #403F53">[</span><span style="color: #AA0982">2</span><span style="color: #403F53">] </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> </span><span style="color: #4876D6">N</span><span style="color: #403F53">[</span><span style="color: #AA0982">1</span><span style="color: #403F53">]));</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> is_prime (</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> [</span><span style="color: #F78C6C">3</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] </span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">,</span></span>
<span><span style="color: #C5E478">    output</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">F</span></span>
<span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">assign</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">F</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">[</span><span style="color: #F78C6C">3</span><span style="color: #D6DEEB">] </span><span style="color: #C792EA">?</span><span style="color: #D6DEEB"> (</span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">[</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> (</span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">[</span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">] </span><span style="color: #C792EA">^</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">[</span><span style="color: #F78C6C">2</span><span style="color: #D6DEEB">])) </span><span style="color: #C792EA">:</span><span style="color: #D6DEEB"> (</span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">[</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] </span><span style="color: #C792EA">|</span><span style="color: #D6DEEB"> (</span><span style="color: #C792EA">~</span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">[</span><span style="color: #F78C6C">2</span><span style="color: #D6DEEB">] </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">N</span><span style="color: #D6DEEB">[</span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">]));</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<h3 id="behavioral-model" class="heading"><a href="#behavioral-model" class="heading-anchor" aria-label="章节： behavioral model" tabindex="-1"></a><span>behavioral model</span></h3>
<h4 id="always-begin-end-block" class="heading"><a href="#always-begin-end-block" class="heading-anchor" aria-label="章节： always &#x26; begin-end block" tabindex="-1"></a><span><code>always</code> &#x26; <code>begin</code>-<code>end</code> block</span></h4>
<p><code>always</code> statement 用来执行一句 procedural statement<span class="mojikumi-line-end">，</span>begin-end block 用来将若干 procedural statement 合成一句<span class="mojikumi-line-end">。</span>begin-end block 里的语句是顺序执行的<span class="mojikumi-line-end">，</span>而 <code>always</code> 是和 module 中的其他语句一起并行执行的<span class="mojikumi-line-end">。</span></p>
<p>在 SystemVerilog 中<span class="mojikumi-line-end">，</span>推荐使用 <code>always_comb</code><span class="mojikumi-line-end">、</span><code>always_ff</code><span class="mojikumi-line-end">、</span><code>always_latch</code> 来代替 <code>always</code><span class="mojikumi-line-end">，</span>分别用于组合逻辑<span class="mojikumi-line-end">、</span>ff 和 latch<span class="mojikumi-line-start">（</span>但一般不会特意去写 latch<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span><code>always_comb</code> 会检查条件判断语句没有漏情况<span class="mojikumi-line-end">，</span>避免意外生成 latch<span class="mojikumi-line-end">。</span><code>always_ff</code> 需要加形如 <code>always_ff @(posedge clk)</code> 的 sensitivity list<span class="mojikumi-line-end">。</span></p>
<p>如果 begin-end 里有 local <code>logic</code> 则需要给 block 起名字<span class="mojikumi-line-start">（</span>在 <code>begin</code> 的后面写上 <code>: name</code><span class="mojikumi-line-end">）</span>才能在 simulation 之类的地方看到可读的变量名<span class="mojikumi-line-end">。</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h5 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h5><ile-root id="ile-9"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-9--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> alarm_circuit (</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> panic,</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> enable,</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> exiting,</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> window,</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> door,</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> garage,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">output</span><span style="color: #403F53"> </span><span style="color: #994CC3">logic</span><span style="color: #403F53"> alarm</span></span>
<span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">always_comb</span><span style="color: #403F53"> </span><span style="color: #994CC3">begin</span><span style="color: #403F53"> </span><span style="color: #0C969B">:</span><span style="color: #403F53"> blk</span></span>
<span><span style="color: #994CC3">    logic</span><span style="color: #403F53"> secure;</span></span>
<span><span style="color: #403F53">    secure </span><span style="color: #994CC3">=</span><span style="color: #403F53"> window </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> door </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> garage;</span></span>
<span><span style="color: #403F53">    alarm  </span><span style="color: #994CC3">=</span><span style="color: #403F53"> panic </span><span style="color: #994CC3">|</span><span style="color: #403F53"> (enable </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> </span><span style="color: #994CC3">~</span><span style="color: #403F53">exiting </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> </span><span style="color: #994CC3">~</span><span style="color: #403F53">secure);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">end</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> alarm_circuit (</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> panic,</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> enable,</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> exiting,</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> window,</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> door,</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> garage,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">output</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">logic</span><span style="color: #D6DEEB"> alarm</span></span>
<span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">always_comb</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">begin</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">:</span><span style="color: #D6DEEB"> blk</span></span>
<span><span style="color: #C792EA">    logic</span><span style="color: #D6DEEB"> secure;</span></span>
<span><span style="color: #D6DEEB">    secure </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> window </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> door </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> garage;</span></span>
<span><span style="color: #D6DEEB">    alarm  </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> panic </span><span style="color: #C792EA">|</span><span style="color: #D6DEEB"> (enable </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">~</span><span style="color: #D6DEEB">exiting </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">~</span><span style="color: #D6DEEB">secure);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">end</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<h4 id="赋值" class="heading"><a href="#赋值" class="heading-anchor" aria-label="章节： 赋值" tabindex="-1"></a><span>赋值</span></h4>
<p>procedural statement 中有两种赋值<span class="mojikumi-line-end">，</span>blocking 的 <code>=</code> 和 non-blocking 的 <code>&#x3C;=</code><span class="mojikumi-line-end">。</span><code>=</code> 表示立即赋值<span class="mojikumi-line-end">，</span>而 <code>&#x3C;=</code> 会将赋值推迟至整个 <code>always</code> 的结尾<span class="mojikumi-line-start">（</span>右侧表达式的计算是立刻进行的<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>从而在 <code>always</code> 剩下的部分中左侧变量的值依然是赋值前的<span class="mojikumi-line-end">。</span></p>
<p>赋值最好遵循下面的规则<span class="mojikumi-line-end">：</span></p>
<ul>
<li>在组合逻辑中<span class="mojikumi-line-end">，</span>只使用 <code>=</code></li>
<li>在时序逻辑中<span class="mojikumi-line-end">，</span>只使用 <code>&#x3C;=</code></li>
<li>不要在同一个 block 中混合使用两种赋值</li>
<li>不要在不同的 <code>always</code> 中对同一个变量赋值</li>
</ul>
<h4 id="if-else-语句" class="heading"><a href="#if-else-语句" class="heading-anchor" aria-label="章节： if-else 语句" tabindex="-1"></a><span><code>if</code>-<code>else</code> 语句</span></h4>
<p>和 C 的语法是一样的<span class="mojikumi-line-end">，</span>唯一的不同就是大括号变成 <code>begin</code> - <code>end</code><span class="mojikumi-line-end">。</span></p>
<h4 id="case-语句" class="heading"><a href="#case-语句" class="heading-anchor" aria-label="章节： case 语句" tabindex="-1"></a><span><code>case</code> 语句</span></h4>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h5 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h5><ile-root id="ile-10"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-10--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> prime (</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> [</span><span style="color: #AA0982">3</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">] n,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">output</span><span style="color: #403F53"> </span><span style="color: #994CC3">logic</span><span style="color: #403F53"> f</span></span>
<span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">always_comb</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">case</span><span style="color: #403F53"> (n)</span></span>
<span><span style="color: #403F53">      </span><span style="color: #AA0982">4&#39;d2</span><span style="color: #403F53">, </span><span style="color: #AA0982">4&#39;d3</span><span style="color: #403F53">, </span><span style="color: #AA0982">4&#39;d5</span><span style="color: #403F53">, </span><span style="color: #AA0982">4&#39;d7</span><span style="color: #403F53">, </span><span style="color: #AA0982">4&#39;d11</span><span style="color: #403F53">, </span><span style="color: #AA0982">4&#39;d13</span><span style="color: #994CC3">:</span><span style="color: #403F53"> f </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">      </span><span style="color: #994CC3">default:</span><span style="color: #403F53"> f </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">endcase</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> prime (</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> [</span><span style="color: #F78C6C">3</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] n,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">output</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">logic</span><span style="color: #D6DEEB"> f</span></span>
<span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">always_comb</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">case</span><span style="color: #D6DEEB"> (n)</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #F78C6C">4&#39;d2</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">4&#39;d3</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">4&#39;d5</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">4&#39;d7</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">4&#39;d11</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">4&#39;d13</span><span style="color: #C792EA">:</span><span style="color: #D6DEEB"> f </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">      </span><span style="color: #C792EA">default:</span><span style="color: #D6DEEB"> f </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">endcase</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<p>虽然并非必须<span class="mojikumi-line-end">，</span>但一般来说<span class="mojikumi-line-end">，</span>选项应当是不重复且指定了宽度的字面量<span class="mojikumi-line-end">。</span></p>
<p>即使选项覆盖了所有可能<span class="mojikumi-line-end">，</span>加上一个 <code>default</code> 可以在 simulation 中正确处理带 <code>x</code> 的值<span class="mojikumi-line-end">。</span></p>
<p><code>casez</code> 是允许使用通配符 <code>?</code> 的匹配<span class="mojikumi-line-end">，</span>例如选项可以是 <code>4'b10??</code><span class="mojikumi-line-end">。</span></p>
<h4 id="循环语句" class="heading"><a href="#循环语句" class="heading-anchor" aria-label="章节： 循环语句" tabindex="-1"></a><span>循环语句</span></h4>
<p>有很多种循环语句<span class="mojikumi-line-end">，</span>但推荐使用的只有一种<span class="mojikumi-line-end">，</span>就是 <code>for (integer i = 0; i &#x3C;= 7; i = i + 1)</code><span class="mojikumi-line-end">。</span></p>
<h4 id="function-和-task" class="heading"><a href="#function-和-task" class="heading-anchor" aria-label="章节： function 和 task" tabindex="-1"></a><span>function 和 task</span></h4>
<p>function 和 task 是一段可复用的 procedural statement<span class="mojikumi-line-end">，</span>写起来和 module 差不多<span class="mojikumi-line-end">，</span>需要定义在 module 内部<span class="mojikumi-line-start">（</span>可以通过 <code>`include</code> 来在不同 module 中复用<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>function 有单个返回值<span class="mojikumi-line-start">（</span>可以在函数名的前面给返回值设置类型<span class="mojikumi-line-end">，</span>也可以省略<span class="mojikumi-line-end">，</span>默认类型是 1-bit<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>但不能有 <code>output</code> / <code>inout</code> port<span class="mojikumi-line-end">，</span>而是以 function 自身的名字作为返回值的名字<span class="mojikumi-line-end">，</span>代码中需要对这个函数名进行赋值<span class="mojikumi-line-end">。</span>function 中不能设置延时<span class="mojikumi-line-end">。</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h5 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h5><ile-root id="ile-11"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-11--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> sillier_xor (</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> in1,</span></span>
<span><span style="color: #4876D6">    input</span><span style="color: #403F53"> in2,</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">output</span><span style="color: #403F53"> </span><span style="color: #994CC3">logic</span><span style="color: #403F53"> out</span></span>
<span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">function</span><span style="color: #403F53"> </span><span style="color: #4876D6">inhibit</span><span style="color: #403F53">(</span><span style="color: #4876D6">input</span><span style="color: #403F53"> in,</span><span style="color: #4876D6"> input</span><span style="color: #403F53"> inv_in);</span></span>
<span><span style="color: #403F53">    inhibit </span><span style="color: #994CC3">=</span><span style="color: #403F53"> in </span><span style="color: #994CC3">&amp;</span><span style="color: #403F53"> </span><span style="color: #994CC3">~</span><span style="color: #403F53">inv_in;</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">endfunction</span></span>
<span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">always_comb</span><span style="color: #403F53"> </span><span style="color: #994CC3">begin</span></span>
<span><span style="color: #994CC3">    logic</span><span style="color: #403F53"> inh1, inh2;</span></span>
<span><span style="color: #403F53">    inh1 </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">inhibit</span><span style="color: #403F53">(in1, in2);</span></span>
<span><span style="color: #403F53">    inh2 </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">inhibit</span><span style="color: #403F53">(in2, in1);</span></span>
<span><span style="color: #403F53">    out  </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #994CC3">~</span><span style="color: #4876D6">inhibit</span><span style="color: #403F53">(</span><span style="color: #994CC3">~</span><span style="color: #403F53">inh2, inh1);</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">end</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> sillier_xor (</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> in1,</span></span>
<span><span style="color: #C5E478">    input</span><span style="color: #D6DEEB"> in2,</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">output</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">logic</span><span style="color: #D6DEEB"> out</span></span>
<span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">function</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">inhibit</span><span style="color: #D6DEEB">(</span><span style="color: #C5E478">input</span><span style="color: #D6DEEB"> in,</span><span style="color: #C5E478"> input</span><span style="color: #D6DEEB"> inv_in);</span></span>
<span><span style="color: #D6DEEB">    inhibit </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> in </span><span style="color: #C792EA">&amp;</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">~</span><span style="color: #D6DEEB">inv_in;</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">endfunction</span></span>
<span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">always_comb</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">begin</span></span>
<span><span style="color: #C792EA">    logic</span><span style="color: #D6DEEB"> inh1, inh2;</span></span>
<span><span style="color: #D6DEEB">    inh1 </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">inhibit</span><span style="color: #D6DEEB">(in1, in2);</span></span>
<span><span style="color: #D6DEEB">    inh2 </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">inhibit</span><span style="color: #D6DEEB">(in2, in1);</span></span>
<span><span style="color: #D6DEEB">    out  </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">~</span><span style="color: #C5E478">inhibit</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">~</span><span style="color: #D6DEEB">inh2, inh1);</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">end</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<p>task 没有返回值<span class="mojikumi-line-end">，</span>但可以有 <code>output</code> / <code>inout</code> port<span class="mojikumi">，</span><wbr><span class="mojikumi-line-start">（</span>用于 simulation 时<span class="mojikumi-line-end">）</span>可以设置延时<span class="mojikumi-line-end">。</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h5 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h5><ile-root id="ile-12"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-12--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">module</span><span style="color: #403F53"> lock_sim;</span></span>
<span></span>
<span><span style="color: #403F53">  ...</span></span>
<span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">task</span><span style="color: #403F53"> </span><span style="color: #4876D6">clock</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #0C969B">#</span><span style="color: #AA0982">500</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    clk </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #0C969B">#</span><span style="color: #AA0982">500</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    clk </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">endtask</span></span>
<span></span>
<span><span style="color: #403F53">  ...</span></span>
<span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> lock_sim;</span></span>
<span></span>
<span><span style="color: #D6DEEB">  ...</span></span>
<span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">task</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">clock</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #7FDBCA">#</span><span style="color: #F78C6C">500</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    clk </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #7FDBCA">#</span><span style="color: #F78C6C">500</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    clk </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">endtask</span></span>
<span></span>
<span><span style="color: #D6DEEB">  ...</span></span>
<span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<p>有一些内置的 task 和 function<span class="mojikumi-line-end">，</span>用于 simulation<span class="mojikumi-line-end">：</span></p>
<ul>
<li><code>$write</code><span class="mojikumi-line-end">：</span>和 <code>printf</code> 差不多<span class="mojikumi-line-end">。</span></li>
<li><code>$display</code><span class="mojikumi-line-end">：</span>在 <code>$write</code> 的基础上多个换行<span class="mojikumi-line-end">。</span></li>
<li><code>$monitor</code><span class="mojikumi-line-end">：</span>每次信号发生改变时都输出<span class="mojikumi-line-end">，</span>后指定的 monitor 会覆盖之前的<span class="mojikumi-line-end">。</span></li>
<li><code>$<wbr>monitoroff</code> / <code>$monitoron</code></li>
<li><code>$fflush</code><span class="mojikumi-line-end">：</span>flush 输出<span class="mojikumi-line-end">。</span></li>
<li><code>$time</code><span class="mojikumi-line-end">：</span>输出当前的 simulated time<span class="mojikumi-line-end">。</span></li>
<li><code>$random</code><span class="mojikumi-line-end">：</span>返回一个随机数<span class="mojikumi-line-end">，</span>接受种子作为参数<span class="mojikumi-line-end">，</span>不指定种子的话初次运行的种子是固定的<span class="mojikumi-line-end">。</span></li>
<li><code>$stop</code><span class="mojikumi-line-end">：</span>停止模拟<span class="mojikumi-line-end">，</span>如果传参 <code>(1)</code> 则会显示当前的 simulated time 和代码位置<span class="mojikumi-line-end">。</span></li>
</ul>
<h2 id="timescale-指定延迟" class="heading"><a href="#timescale-指定延迟" class="heading-anchor" aria-label="章节： timescale &#x26; 指定延迟" tabindex="-1"></a><span>timescale &#x26; 指定延迟</span></h2>
<p><code>`timescale 1ns / 10ps</code> 指定以 1ns 作为延时的单位<span class="mojikumi-line-end">，</span>以 10ps 作为模拟的精度<span class="mojikumi-line-end">。</span></p>
<p><code>assign</code> 时可以指定延迟<span class="mojikumi-line-end">：</span><code>assign #5 a = b &#x26; c;</code></p>
<p>procedural model 中可以用 delay statement (<code>#500;</code>) 来暂停<span class="mojikumi-line-end">。</span></p>
<h2 id="simulation-test-bench" class="heading"><a href="#simulation-test-bench" class="heading-anchor" aria-label="章节： simulation (test bench)" tabindex="-1"></a><span>simulation (test bench)</span></h2>
<p>语法上和 synthesizable module 没有区别<span class="mojikumi-line-start">（</span>只不过有个 <code>initial</code><span class="mojikumi-line-end">，</span>就是只执行一遍的 <code>always</code><span class="mojikumi-line-end">，</span>一般不用于 synthesizable module<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>写起来一般是一个没有输入输出<span class="mojikumi-line-end">、</span>有一个被测试 module 的实例<span class="mojikumi-line-end">、</span>有一个 <code>initial</code> block 的 module<span class="mojikumi-line-end">，</span>看看例子就行<span class="mojikumi-line-end">。</span></p>
<p>懒得改 DDPP 上的代码了<span class="mojikumi-line-end">，</span>直接复制一份数字逻辑实验的代码<span class="mojikumi-line-start">（</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h3 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h3><ile-root id="ile-13"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-13--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #4876D6">`timescale</span><span style="color: #403F53"> </span><span style="color: #AA0982">1ns</span><span style="color: #403F53"> </span><span style="color: #994CC3">/</span><span style="color: #403F53"> </span><span style="color: #AA0982">1ps</span></span>
<span></span>
<span><span style="color: #994CC3">module</span><span style="color: #403F53"> lock_sim;</span></span>
<span><span style="color: #994CC3">  logic</span><span style="color: #403F53"> clk </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #994CC3">  logic</span><span style="color: #403F53"> rst </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #994CC3">  logic</span><span style="color: #403F53"> mode </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">;</span></span>
<span><span style="color: #994CC3">  logic</span><span style="color: #403F53"> [</span><span style="color: #AA0982">3</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">] digit_input </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #994CC3">  wire</span><span style="color: #403F53"> unlocked, incorrect, alert;</span></span>
<span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">lock</span><span style="color: #403F53"> </span><span style="color: #0C969B">#</span><span style="color: #403F53">(</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">ADMIN_PASSWORD</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;ha73f</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">  ) lock_inst (</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">clk</span><span style="color: #403F53">(clk),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">rst</span><span style="color: #403F53">(rst),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">mode</span><span style="color: #403F53">(mode),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">digit_input</span><span style="color: #403F53">(digit_input),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">unlocked</span><span style="color: #403F53">(unlocked),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">incorrect</span><span style="color: #403F53">(incorrect),</span></span>
<span><span style="color: #403F53">      .</span><span style="color: #4876D6">alert</span><span style="color: #403F53">(alert)</span></span>
<span><span style="color: #403F53">  );</span></span>
<span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">task</span><span style="color: #403F53"> </span><span style="color: #4876D6">clock</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #0C969B">#</span><span style="color: #AA0982">500</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    clk </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #0C969B">#</span><span style="color: #AA0982">500</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    clk </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">endtask</span></span>
<span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">task</span><span style="color: #403F53"> </span><span style="color: #4876D6">reset</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    rst </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #0C969B">#</span><span style="color: #AA0982">500</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    rst </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #0C969B">#</span><span style="color: #AA0982">500</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">endtask</span></span>
<span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">task</span><span style="color: #403F53"> </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #4876D6">input</span><span style="color: #403F53"> [</span><span style="color: #AA0982">15</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">] password);</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">reset</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    digit_input </span><span style="color: #994CC3">=</span><span style="color: #403F53"> password[</span><span style="color: #AA0982">15</span><span style="color: #994CC3">:</span><span style="color: #AA0982">12</span><span style="color: #403F53">];</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">clock</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    digit_input </span><span style="color: #994CC3">=</span><span style="color: #403F53"> password[</span><span style="color: #AA0982">11</span><span style="color: #994CC3">:</span><span style="color: #AA0982">8</span><span style="color: #403F53">];</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">clock</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    digit_input </span><span style="color: #994CC3">=</span><span style="color: #403F53"> password[</span><span style="color: #AA0982">7</span><span style="color: #994CC3">:</span><span style="color: #AA0982">4</span><span style="color: #403F53">];</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">clock</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    digit_input </span><span style="color: #994CC3">=</span><span style="color: #403F53"> password[</span><span style="color: #AA0982">3</span><span style="color: #994CC3">:</span><span style="color: #AA0982">0</span><span style="color: #403F53">];</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">clock</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">endtask</span></span>
<span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">initial</span><span style="color: #403F53"> </span><span style="color: #994CC3">begin</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;ha73f</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// admin password</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h1234</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// incorrect</span></span>
<span></span>
<span><span style="color: #403F53">    mode </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h1234</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// set password</span></span>
<span></span>
<span><span style="color: #403F53">    mode </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h4321</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// incorrect</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h1234</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// correct</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;ha73f</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// admin password</span></span>
<span></span>
<span><span style="color: #403F53">    </span><span style="color: #939DBB">// incorrect three times</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h4321</span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h4321</span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h4321</span><span style="color: #403F53">);</span></span>
<span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h1234</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// locked</span></span>
<span></span>
<span><span style="color: #403F53">    mode </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h4321</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// cannot set password</span></span>
<span></span>
<span><span style="color: #403F53">    mode </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h1234</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// locked</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h4321</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// incorrect</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;ha73f</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// admin password</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h1234</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// correct</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input_password</span><span style="color: #403F53">(</span><span style="color: #AA0982">16&#39;h4321</span><span style="color: #403F53">);  </span><span style="color: #939DBB">// incorrect</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">end</span></span>
<span><span style="color: #994CC3">endmodule</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #82AAFF">`timescale</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1ns</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">/</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1ps</span></span>
<span></span>
<span><span style="color: #C792EA">module</span><span style="color: #D6DEEB"> lock_sim;</span></span>
<span><span style="color: #C792EA">  logic</span><span style="color: #D6DEEB"> clk </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #C792EA">  logic</span><span style="color: #D6DEEB"> rst </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #C792EA">  logic</span><span style="color: #D6DEEB"> mode </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #C792EA">  logic</span><span style="color: #D6DEEB"> [</span><span style="color: #F78C6C">3</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] digit_input </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #C792EA">  wire</span><span style="color: #D6DEEB"> unlocked, incorrect, alert;</span></span>
<span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">lock</span><span style="color: #D6DEEB"> </span><span style="color: #7FDBCA">#</span><span style="color: #D6DEEB">(</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">ADMIN_PASSWORD</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;ha73f</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">  ) lock_inst (</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">clk</span><span style="color: #D6DEEB">(clk),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">rst</span><span style="color: #D6DEEB">(rst),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">mode</span><span style="color: #D6DEEB">(mode),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">digit_input</span><span style="color: #D6DEEB">(digit_input),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">unlocked</span><span style="color: #D6DEEB">(unlocked),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">incorrect</span><span style="color: #D6DEEB">(incorrect),</span></span>
<span><span style="color: #D6DEEB">      .</span><span style="color: #C5E478">alert</span><span style="color: #D6DEEB">(alert)</span></span>
<span><span style="color: #D6DEEB">  );</span></span>
<span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">task</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">clock</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #7FDBCA">#</span><span style="color: #F78C6C">500</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    clk </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #7FDBCA">#</span><span style="color: #F78C6C">500</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    clk </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">endtask</span></span>
<span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">task</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">reset</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    rst </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #7FDBCA">#</span><span style="color: #F78C6C">500</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    rst </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #7FDBCA">#</span><span style="color: #F78C6C">500</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">endtask</span></span>
<span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">task</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #C5E478">input</span><span style="color: #D6DEEB"> [</span><span style="color: #F78C6C">15</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">] password);</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">reset</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    digit_input </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> password[</span><span style="color: #F78C6C">15</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">12</span><span style="color: #D6DEEB">];</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">clock</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    digit_input </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> password[</span><span style="color: #F78C6C">11</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">8</span><span style="color: #D6DEEB">];</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">clock</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    digit_input </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> password[</span><span style="color: #F78C6C">7</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">4</span><span style="color: #D6DEEB">];</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">clock</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    digit_input </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> password[</span><span style="color: #F78C6C">3</span><span style="color: #C792EA">:</span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">];</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">clock</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">endtask</span></span>
<span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">initial</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">begin</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;ha73f</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// admin password</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h1234</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// incorrect</span></span>
<span></span>
<span><span style="color: #D6DEEB">    mode </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h1234</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// set password</span></span>
<span></span>
<span><span style="color: #D6DEEB">    mode </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h4321</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// incorrect</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h1234</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// correct</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;ha73f</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// admin password</span></span>
<span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #637777">// incorrect three times</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h4321</span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h4321</span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h4321</span><span style="color: #D6DEEB">);</span></span>
<span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h1234</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// locked</span></span>
<span></span>
<span><span style="color: #D6DEEB">    mode </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h4321</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// cannot set password</span></span>
<span></span>
<span><span style="color: #D6DEEB">    mode </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h1234</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// locked</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h4321</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// incorrect</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;ha73f</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// admin password</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h1234</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// correct</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input_password</span><span style="color: #D6DEEB">(</span><span style="color: #F78C6C">16&#39;h4321</span><span style="color: #D6DEEB">);  </span><span style="color: #637777">// incorrect</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">end</span></span>
<span><span style="color: #C792EA">endmodule</span></span></code></pre></div></section>
<p>通过使用 <code>$display</code><span class="mojikumi-line-end">，</span>可以更直观地输出结果<span class="mojikumi-line-end">，</span>从而不需要对着波形图看<span class="mojikumi-line-end">；</span>或者自动检查结果是否正确<span class="mojikumi-line-end">，</span>在出错时输出<span class="mojikumi-line-end">。</span></p>
<p>有时可以通过文件读写来更方便地编写测试数据<span class="mojikumi-line-end">、</span>检查输出结果<span class="mojikumi-line-end">。</span></p>
<h2 id="有关-synthesize-的一些注意事项" class="heading"><a href="#有关-synthesize-的一些注意事项" class="heading-anchor" aria-label="章节： 有关 synthesize 的一些注意事项" tabindex="-1"></a><span>有关 synthesize 的一些注意事项</span></h2>
<ul>
<li>长串的 <code>if</code><span class="mojikumi-line-end">、</span><code>else if</code><span class="mojikumi-line-end">、</span><code>else if</code>……可能导致电路也有一长串<span class="mojikumi-line-end">，</span>使用 <code>case</code> 可能会更优<span class="mojikumi-line-end">。</span></li>
<li>组合逻辑中的循环可能会创建同一套电路的多个副本<span class="mojikumi-line-end">，</span>如果要用同一个电路<span class="mojikumi-line-end">，</span>可能需要改写成时序逻辑<span class="mojikumi-line-end">。</span></li>
<li>根据具体使用的 tool<span class="mojikumi-line-end">，</span>有些 language feature 是不能被 synthesize 的<span class="mojikumi-line-end">。</span></li>
<li>为了更好的 synthesize 结果而需要把代码写成什么样<span class="mojikumi-line-end">，</span>需要依具体使用的 tool 而定<span class="mojikumi-line-end">。</span></li>
</ul>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/ddpp">ddpp</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
        <item>
            <title><![CDATA[DDPP 第四章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/01/ddpp-4</link>
            <guid>https://ouuan.moe/post/2023/01/ddpp-4</guid>
            <pubDate>Tue, 07 Feb 2023 07:58:32 GMT</pubDate>
            <description><![CDATA[







<p><a href="https://wakerly.org/DDPP/">DDPP5</a> 第四章 <span class="mojikumi">“</span>Digital Design Practices<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
<p>本章的主要内容为数字设计的文档规范<span class="mojikumi-line-end">、</span>初步认识 circuit timing<span class="mojikumi-line-end">、</span>基于 HDL 的数字设计所使用的工具与设计流程<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[







<p><a href="https://wakerly.org/DDPP/">DDPP5</a> 第四章 <span class="mojikumi">“</span>Digital Design Practices<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
<p>本章的主要内容为数字设计的文档规范<span class="mojikumi-line-end">、</span>初步认识 circuit timing<span class="mojikumi-line-end">、</span>基于 HDL 的数字设计所使用的工具与设计流程<span class="mojikumi-line-end">。</span></p>

<h2 id="documentation-standards" class="heading"><a href="#documentation-standards" class="heading-anchor" aria-label="章节： Documentation Standards" tabindex="-1"></a><span>Documentation Standards</span></h2>
<p>一个 <dfn>document package</dfn> 通常至少包含以下内容<span class="mojikumi-line-end">：</span></p>
<dl>
<dt>specification (<i>spec</i>)</dt>
<dd>准确地描述系统的所有输入和输出以及功能<span class="mojikumi-line-end">。</span>
</dd>
<dt>block diagram</dt>
<dd>大致描述系统的主要模块之间的连接<span class="mojikumi-line-end">。</span>
</dd>
<dt>logic-device description</dt>
<dd>分别描述每个 <span class="mojikumi">“</span>custom<span class="mojikumi">”</span> logic device 的功能<span class="mojikumi-line-end">，</span>这里 <span class="mojikumi">“</span>custom<span class="mojikumi">”</span> 是与现成的<span class="mojikumi-line-end">、</span>由其他制造商生产的相对<span class="mojikumi-line-end">，</span>例如 ASIC<span class="mojikumi-line-end">、</span>FPGA<span class="mojikumi-line-end">、</span>CPLD 等都是 custom 的<span class="mojikumi-line-end">。</span>
</dd>
<dt>schematic diagram</dt>
<dd>对每个模块的细节描述<span class="mojikumi-line-end">，</span>比 <i>logic diagram</i> 更加细致<span class="mojikumi-line-end">，</span>在 board-level design 中是包括 IC type<span class="mojikumi-line-end">、</span>reference designator<span class="mojikumi-line-end">、</span>signal name<span class="mojikumi-line-end">、</span>pin number 等细节信息的电路图<span class="mojikumi-line-end">，</span>在 FPGA<span class="mojikumi-line-end">、</span>CPLD 中则由 HDL model 来充当这一角色<span class="mojikumi-line-end">。</span>
</dd>
<dt>timing diagram</dt>
<dd>展示各个信号随时间的变化情况<span class="mojikumi-line-end">。</span>
</dd>
<dt>circuit description</dt>
<dd>解释电路的工作原理以及注意事项<span class="mojikumi-line-end">。</span>
</dd>
<dt>test plan</dt>
<dd>如何对系统进行测试<span class="mojikumi-line-end">。</span>
</dd>
</dl>
<p>感觉大致上来说<span class="mojikumi-line-end">，</span>与软件进行类比的话<span class="mojikumi-line-end">，</span>logic-device description 像是组件的 API 文档<span class="mojikumi-line-end">，</span>circuit description 像是代码内的注释<span class="mojikumi-line-end">，</span>block diagram 像是整个程序的结构图<span class="mojikumi-line-end">，</span>schematic 则是<span class="mojikumi-line-start">“</span>代码<span class="mojikumi">”</span><span class="mojikumi-line-end">。</span>总之<span class="mojikumi-line-end">，</span>这个 document package 和软件的文档不一样<span class="mojikumi-line-end">，</span>还包含 schematic 这种具体实现<span class="mojikumi-line-end">。</span></p>
<h3 id="block-diagrams" class="heading"><a href="#block-diagrams" class="heading-anchor" aria-label="章节： Block Diagrams" tabindex="-1"></a><span>Block Diagrams</span></h3>
<p>大概就是 DDPP5 Fig.4-1 这种感觉<span class="mojikumi-line-end">：</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-4-1.2330b557.webp" loading="lazy" src="/assets/ddpp-fig-4-1.2330b557.webp" width="914" height="856" alt="block diagram for a shift-and-add multiplier"></picture></p>
<p>整个系统被划分为若干 component<span class="mojikumi-line-end">，</span>block diagram 展示它们之间最主要的一些连线而略去细节<span class="mojikumi-line-end">。</span></p>
<p>在 block diagram 中<span class="mojikumi-line-end">，</span>信号的流动可以是任意方向的<span class="mojikumi-line-end">，</span>不需要都沿一个方向<span class="mojikumi-line-end">。</span></p>
<h3 id="gate-symbols" class="heading"><a href="#gate-symbols" class="heading-anchor" aria-label="章节： Gate Symbols" tabindex="-1"></a><span>Gate Symbols</span></h3>
<p>根据 generalized DeMorgan<span class="mojikumi-narrow-left">’</span>s theorem<span class="mojikumi-line-end">，</span>AND<span class="mojikumi-line-end">、</span>OR<span class="mojikumi-line-end">、</span>NAND<span class="mojikumi-line-end">、</span>NOR<span class="mojikumi-line-end">、</span>NOT (inverter)<span class="mojikumi-line-end">、</span>BUFFER (non-inverting buffer) 各自都有两种不同的画法<span class="mojikumi-line-end">，</span>如 DDPP5 Fig.4-4 所示<span class="mojikumi-line-end">：</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-4-4.93ea8d42.webp" loading="lazy" src="/assets/ddpp-fig-4-4.93ea8d42.webp" width="1324" height="517" alt="在 generalized DeMorgan&#39;s theorem 下等价的 gate symbols"></picture></p>
<h3 id="signal-names-and-active-levels" class="heading"><a href="#signal-names-and-active-levels" class="heading-anchor" aria-label="章节： Signal Names and Active Levels" tabindex="-1"></a><span>Signal Names and Active Levels</span></h3>
<p>为了兼容更多的 HDL 和 EDA<span class="mojikumi-line-end">，</span>signal name 最好不要有特殊字符<span class="mojikumi-line-end">，</span>而是只使用字母<span class="mojikumi-line-end">、</span>数字<span class="mojikumi-line-end">、</span>下划线<span class="mojikumi-line-end">，</span>以字母开头<span class="mojikumi-line-end">。</span></p>
<p>signal name 往往代表某种状态或某种操作<span class="mojikumi-line-end">，</span>但并不总是在位于 HIGH 时表示相应的意思<span class="mojikumi-line-end">。</span>每个 signal name 会有一个 <dfn>active level</dfn><span class="mojikumi-line-end">，</span><dfn>active-high</dfn> 意味着这个 signal 位于 HIGH 时<span class="mojikumi-line-start">（</span>在 positive-logic 中即为 1 时<span class="mojikumi-line-end">）</span>表示这某种状态或某种操作<span class="mojikumi-line-end">，</span><dfn>active-low</dfn> 则与之相反<span class="mojikumi-line-end">。</span>一个 signal 位于其 active level 时<span class="mojikumi-line-end">，</span>我们说它 is <dfn>asserted</dfn><span class="mojikumi-line-end">，</span>反之则说它 is <dfn>negated</dfn> (<i>deasserted</i>)<span class="mojikumi-line-end">。</span></p>
<p>signal name 会以某种 naming convention 来表示其 active level<span class="mojikumi-line-end">，</span>DDPP5 采用的 convention 是 active-high 保持不变<span class="mojikumi-line-end">，</span>而 active-low 加上 <code>_L</code> 后缀<span class="mojikumi-line-end">。</span>例如<span class="mojikumi-line-end">，</span><code>READY</code> 为 1 / <code>READY_L</code> 为 0 表示 ready<span class="mojikumi-line-end">，</span><code>READY</code> 为 0 / <code>READY_L</code> 为 1 表示没有 ready<span class="mojikumi-line-end">。</span></p>
<p>一般来说 active-high 理解起来相对容易<span class="mojikumi-line-end">，</span>但由于性能<span class="mojikumi-line-end">、</span>兼容性等原因也经常会需要 active-low<span class="mojikumi-line-end">。</span></p>
<h3 id="active-levels-for-pins" class="heading"><a href="#active-levels-for-pins" class="heading-anchor" aria-label="章节： Active Levels for Pins" tabindex="-1"></a><span>Active Levels for Pins</span></h3>
<p>gate 或其他 logic element 的 pin 上有 inversion bubble 时<span class="mojikumi-line-end">，</span>除了理解成不同的逻辑函数<span class="mojikumi-line-end">，</span>也可以理解成 active-low 的输入/输出<span class="mojikumi-line-end">。</span></p>
<p>例如<span class="mojikumi-line-end">，</span>AND<span class="mojikumi-line-end">、</span>NAND<span class="mojikumi-line-end">、</span>NOR<span class="mojikumi-line-end">、</span>OR 可以表示四种不同 active level 的 AND<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span>DDPP5 Fig.4-6<span class="mojikumi-line-end">）</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-4-6.751e7c1c.webp" loading="lazy" src="/assets/ddpp-fig-4-6.751e7c1c.webp" width="1317" height="134" alt="四种不同 active level 的 AND: AND, NAND, NOR, OR"></picture></p>
<p>因为 inverting gate 往往性能更好<span class="mojikumi-line-end">，</span>可以将 noninverting gate 替换为 inverting gate<span class="mojikumi-line-end">，</span>而理解成输入输出的 active level 相反的 noninverting gate<span class="mojikumi-line-end">。</span></p>
<h3 id="bubble-to-bubble-logic-design" class="heading"><a href="#bubble-to-bubble-logic-design" class="heading-anchor" aria-label="章节： Bubble-to-Bubble Logic Design" tabindex="-1"></a><span>Bubble-to-Bubble Logic Design</span></h3>
<p>在画电路图时<span class="mojikumi-line-end">，</span>尽量将 active-low 的信号连接到 inversion bubble 上<span class="mojikumi-line-end">，</span>在理解电路时就可以少一些 logical negation<span class="mojikumi-line-start">（</span>本质上是因为 active-low 信号的两侧都有 inversion bubble<span class="mojikumi-line-end">，</span>从而能够消去<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>使电路更好理解<span class="mojikumi-line-end">。</span></p>
<h3 id="constant-logic-signals" class="heading"><a href="#constant-logic-signals" class="heading-anchor" aria-label="章节： Constant Logic Signals" tabindex="-1"></a><span>Constant Logic Signals</span></h3>
<p>电路设计中偶尔会用到 constant 0 <span class="mojikumi">（</span><i>ground</i><span class="mojikumi">）</span> 和 constant 1 <span class="mojikumi">（</span><i>power-supply voltage</i><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>在电路图中它们的记号如下图所示<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span>DDPP5 Fig.4-9 (b))</p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-4-9-b.998459d0.webp" loading="lazy" src="/assets/ddpp-fig-4-9-b.998459d0.webp" width="502" height="273" alt="constant 0 and 1 inputs with individual gates"></picture></p>
<h3 id="drawing-layout" class="heading"><a href="#drawing-layout" class="heading-anchor" aria-label="章节： Drawing Layout" tabindex="-1"></a><span>Drawing Layout</span></h3>
<p>logic diagram 和 schematic 一般要从左到右画<span class="mojikumi-line-end">，</span>所有输入都在最左侧<span class="mojikumi-line-end">，</span>所有输出都在最右侧<span class="mojikumi-line-end">。</span></p>
<p>在线路发生交叉时<span class="mojikumi-line-end">，</span>有两种区分重叠和连接的方法<span class="mojikumi-line-end">：</span></p>
<ul>
<li>连接处打点<span class="mojikumi-line-end">，</span>重叠不打点</li>
<li>连接都形如 ⟂ / ⊤<span class="mojikumi-line-end">，</span>重叠则形如 +</li>
</ul>
<p>由于 schematic 需要很多细节<span class="mojikumi-line-end">，</span>一张图可能画不下<span class="mojikumi-line-end">，</span>有两种处理方式<span class="mojikumi-line-end">：</span></p>
<ul>
<li>分为多张并列的图<span class="mojikumi-line-end">，</span>标注出跨越两张图的连线<span class="mojikumi-line-end">。</span></li>
<li>将图组织为树状<span class="mojikumi-line-start">（</span>与 Web 前端的 component 类似<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>树根与 block diagram 类似<span class="mojikumi-line-end">。</span>图中的 component 可以是另一张 schematic<span class="mojikumi-line-end">，</span>也可以是 standard logic device 或者 HDL model<span class="mojikumi-line-end">。</span></li>
</ul>
<h3 id="buses" class="heading"><a href="#buses" class="heading-anchor" aria-label="章节： Buses" tabindex="-1"></a><span>Buses</span></h3>
<p>为了方便画图<span class="mojikumi-line-end">，</span>多个并列的信号可以画成一个 <dfn>bus</dfn><span class="mojikumi-line-end">。</span></p>
<p>bus 的名字一般形如 <code>ADDR[15:0]</code><span class="mojikumi-line-end">，</span>表示 <code>ADDR15</code><span class="mojikumi-line-end">、</span><code>ADDR14</code><span class="mojikumi-line-end">、</span>……<span class="mojikumi-line-end">、</span><code>ADDR1</code><span class="mojikumi-line-end">、</span><code>ADDR0</code><span class="mojikumi-line-end">。</span></p>
<p>在图上 bus 用一条较粗的线表示<span class="mojikumi-line-end">，</span>从这条粗线上连出一条细线表示从中 <span class="mojikumi">“</span>pull<span class="mojikumi">”</span> 出单独一个信号<span class="mojikumi-line-end">。</span></p>
<h3 id="additional-schematic-information" class="heading"><a href="#additional-schematic-information" class="heading-anchor" aria-label="章节： Additional Schematic Information" tabindex="-1"></a><span>Additional Schematic Information</span></h3>
<p>在 board-level design 中<span class="mojikumi-line-end">，</span>一个 schematic 在电路图的基础上还需要标明 IC type<span class="mojikumi-line-end">、</span>reference designator<span class="mojikumi-line-end">、</span>pin number 等信息<span class="mojikumi-line-end">，</span>用来精确地描述电路<span class="mojikumi-line-end">。</span></p>
<p>其中<span class="mojikumi-line-end">，</span>IC type 描述了 IC 的功能<span class="mojikumi-line-end">，</span><dfn>reference designator</dfn> 用来在一类 IC 中指定特定的一个实例<span class="mojikumi-line-end">，</span><dfn>pin number</dfn> 用来指定从哪连到哪<span class="mojikumi-line-end">。</span></p>
<p>全都标上长这样<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span>DDPP5 Fig.4-18<span class="mojikumi-line-end">）</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-4-18.957dcbfd.webp" loading="lazy" src="/assets/ddpp-fig-4-18.957dcbfd.webp" width="980" height="645" alt="schematic diagram for a circuit using several SSI parts"></picture></p>
<h2 id="circuit-timing" class="heading"><a href="#circuit-timing" class="heading-anchor" aria-label="章节： Circuit Timing" tabindex="-1"></a><span>Circuit Timing</span></h2>
<p>在时序电路中<span class="mojikumi-line-end">，</span>电路由一个 clock 控制<span class="mojikumi-line-end">，</span>而 clock 的频率会根据完成一步操作在最坏情况下的用时来制订<span class="mojikumi-line-end">，</span>所以计算<span class="mojikumi-line-end">、</span>优化电路的 timing 对电路的性能和正确性都非常重要<span class="mojikumi-line-end">。</span></p>
<h3 id="timing-diagrams" class="heading"><a href="#timing-diagrams" class="heading-anchor" aria-label="章节： Timing Diagrams" tabindex="-1"></a><span>Timing Diagrams</span></h3>
<p><i>timing diagram</i> 用来展示电路里各个信号随时间变化的情况<span class="mojikumi-line-end">，</span>如 DDPP5 Fig.4-19 (b)(c) 所示<span class="mojikumi-line-end">：</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-4-19-bc.303e1075.webp" loading="lazy" src="/assets/ddpp-fig-4-19-bc.303e1075.webp" width="907" height="729" alt="(b) 展示 causality 和 propagation delay 的 timing diagram (c) 展示 minimum / maximum delay 的 timing diagram"></picture></p>
<p>信号的转变不是瞬间发生的<span class="mojikumi-line-end">，</span>从一个状态到另一个状态的用时称作 <dfn>transition time</dfn><span class="mojikumi-line-end">，</span>从 LOW 到 HIGH 的用时叫做 <dfn>rise time</dfn><span class="mojikumi-line-end">，</span>从 HIGH 到 LOW 的用时叫做 <dfn>fall time</dfn><span class="mojikumi-line-end">。</span></p>
<p>在图 (b) 中<span class="mojikumi-line-end">，</span>不同的箭头用来表示 transition 之间的 causality <span class="mojikumi">（</span>因果关系<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>有因果关系的 transition 并不是立刻一个接着一个发生<span class="mojikumi-line-end">，</span>而是会有 <i>delay</i><span class="mojikumi-line-end">，</span>不同的信号<span class="mojikumi-line-end">、</span>路径会有不同的 delay<span class="mojikumi-line-end">。</span>delay 一般是指两个 transition 各自中点的距离<span class="mojikumi-line-end">。</span></p>
<p>很多因素都会对 delay 造成影响<span class="mojikumi-line-end">，</span>所以 delay 一般不是单个数字<span class="mojikumi-line-end">，</span>而是一个区间<span class="mojikumi-line-end">。</span>图 (c) 中标明了 minimum delay 和 maximum delay<span class="mojikumi-line-end">。</span></p>
<p>有时候 timing diagram 不需要区分 rise 和 fall<span class="mojikumi-line-end">，</span>例如用来存储数据的信号<span class="mojikumi-line-end">，</span>就可以如 DDPP5 Fig.4-20 (a) 这样画<span class="mojikumi-line-end">：</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-4-20-a.b0a1e1fd.webp" loading="lazy" src="/assets/ddpp-fig-4-20-a.b0a1e1fd.webp" width="799" height="365" alt="不区分 rise 和 fall 的 timing diagram"></picture></p>
<p>可以将一个 bus 画在一起<span class="mojikumi-line-end">，</span>也可以用数字标注 bus 的取值<span class="mojikumi-line-end">，</span>如 DDPP5 Fig.4-20 (b) 所示<span class="mojikumi-line-end">：</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-4-20-b.97c7ef5b.webp" loading="lazy" src="/assets/ddpp-fig-4-20-b.97c7ef5b.webp" width="794" height="229" alt="将 bus 画在一起的 timing diagram"></picture></p>
<h3 id="propagation-delay" class="heading"><a href="#propagation-delay" class="heading-anchor" aria-label="章节： Propagation Delay" tabindex="-1"></a><span>Propagation Delay</span></h3>
<p><dfn>propagation delay</dfn> 指的是电路的某个输入发生改变后沿着某个路径产生某个输出的 delay<span class="mojikumi-line-end">，</span>一般记作 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>t</mi><mrow><mi mathvariant="normal">p</mi><mi mathvariant="normal">X</mi></mrow></msub></mrow><annotation encoding="application/x-tex">t_{\mathrm{pX}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9012em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">pX</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></span><span class="mojikumi-line-end">，</span>其中 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">X</mi></mrow><annotation encoding="application/x-tex">\mathrm{X}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathrm">X</span></span></span></span></span> 用来标识这个路径<span class="mojikumi-line-end">。</span></p>
<p>影响 propagation delay 的因素有很多<span class="mojikumi-line-end">，</span>例如<span class="mojikumi-line-end">：</span></p>
<ul>
<li>Power-supply voltage: 包括标定的电压<span class="mojikumi-line-end">，</span>以及小的电压波动</li>
<li>Temperature: 包括环境温度和电路工作产生的热量</li>
<li>Output loading: 电路的输出可能与后续电路的很多个输入相连<span class="mojikumi-line-end">，</span>连接到的输入越多<span class="mojikumi-line-end">，</span>将信号传递过去就用时越长</li>
<li>Input rise and fall times: 如果输入的 transition 慢<span class="mojikumi-line-end">，</span>也会计入 propagation delay</li>
<li>Transition direction: 有时 rise 和 fall 的用时会不同</li>
<li>Speed-of-light delays: 如果电路的物理尺寸大<span class="mojikumi-line-end">，</span>或者电路速度非常快<span class="mojikumi-line-end">，</span>光速的限制就不能忽略</li>
<li>Noise and crosstalk: 环境中的各种干扰<span class="mojikumi-line-end">，</span>以及相邻线路之间的干扰</li>
<li>Manufacturing tolerances: 元件被制造出来的时候可能有细微的差异</li>
</ul>
<p>一般来说<span class="mojikumi-line-end">，</span>计算 propagation delay 可以不考虑这么多因素<span class="mojikumi-line-end">，</span>而只需根据生产商提供的元件的 <span class="mojikumi">“</span>maximum<span class="mojikumi">”</span> <span class="mojikumi">“</span>typical<span class="mojikumi">”</span> <span class="mojikumi">“</span>minimum<span class="mojikumi">”</span> propagation delay 来进行计算<span class="mojikumi-line-end">。</span></p>
<p>如果电路有多个输入输出<span class="mojikumi-line-end">，</span>就会有很多条路径需要计算 delay<span class="mojikumi-line-end">。</span></p>
<a id="glitch-与-delay" name="glitch-与-delay" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h4 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f>glitch 与 delay</span></h4><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>第三章中提到的 <a href="/post/2023/01/ddpp-3#timing-hazards">glitch</a> 是否实际发生<span class="mojikumi-line-end">，</span>与电路的 delay 密切相关<span class="mojikumi-line-end">。</span></p></div></div></aside>
<h3 id="timing-specifications" class="heading"><a href="#timing-specifications" class="heading-anchor" aria-label="章节： Timing Specifications" tabindex="-1"></a><span>Timing Specifications</span></h3>
<p>生产商一般会提供元件在某种条件下每个路径<span class="mojikumi-line-end">、</span>每种 transition 方向的 propagation delay 的范围<span class="mojikumi-line-end">，</span>一般会提供 maximum delay 和 minimum delay<span class="mojikumi-line-end">，</span>也可能提供一个 <span class="mojikumi">“</span>typical<span class="mojikumi">”</span> delay<span class="mojikumi-line-end">。</span></p>
<p>一般情况下<span class="mojikumi-line-end">，</span>maximum delay 是最重要的<span class="mojikumi-line-end">，</span>minimum delay 只在少数情况下需要考虑<span class="mojikumi-line-end">，</span>而依赖于 typical delay 是不靠谱的<span class="mojikumi-line-end">。</span></p>
<h3 id="timing-analysis-tools" class="heading"><a href="#timing-analysis-tools" class="heading-anchor" aria-label="章节： Timing Analysis Tools" tabindex="-1"></a><span>Timing Analysis Tools</span></h3>
<p>在复杂的电路中<span class="mojikumi-line-end">，</span>往往需要借助 EDA tool 来计算 timing<span class="mojikumi-line-end">。</span>比起手动计算<span class="mojikumi-line-end">，</span>EDA 可能会利用元件附带的比 min/max delay 更加详细的信息来更加精确地计算 delay<span class="mojikumi-line-end">。</span>可以使用模拟器<span class="mojikumi-line-end">，</span>手动设计输入<span class="mojikumi-line-end">，</span>来计算 delay<span class="mojikumi-line-end">。</span>也可以使用 timing analysis program<span class="mojikumi-line-end">，</span>来自动计算出所有可能的 delay<span class="mojikumi-line-end">。</span></p>
<p>在设计的不同阶段可能会对 timing 进行多次估计和计算<span class="mojikumi-line-end">，</span>在设计基本完成时如果发现 propagation delay 不符合设计要求<span class="mojikumi-line-end">，</span>可能需要进行调整<span class="mojikumi-line-end">，</span>例如针对 critical path 进行线路优化<span class="mojikumi-line-end">，</span>将 critical path 上的元件尽量放在相邻的位置<span class="mojikumi-line-end">，</span>将 high-fanout 的信号复制几分来减轻 output load……这样对 timing 进行调整的过程可能会反复进行很多遍<span class="mojikumi-line-end">，</span>被称作 <dfn>timing closure</dfn><span class="mojikumi-line-end">。</span></p>
<h2 id="hdl-based-digital-design" class="heading"><a href="#hdl-based-digital-design" class="heading-anchor" aria-label="章节： HDL-Based Digital Design" tabindex="-1"></a><span>HDL-Based Digital Design</span></h2>
<h3 id="eda-tool-suites-for-hdls" class="heading"><a href="#eda-tool-suites-for-hdls" class="heading-anchor" aria-label="章节： EDA Tool Suites for HDLs" tabindex="-1"></a><span>EDA Tool Suites for HDLs</span></h3>
<dl>
<dt>text editor</dt>
<dd>包含代码高亮等功能的 HDL source file 编辑器<span class="mojikumi-line-end">。</span>
</dd>
<dt>compiler</dt>
<dd>检查代码中的语法错误<span class="mojikumi-line-end">，</span>将 HDL 编译为 RTL <span class="mojikumi">（</span>register-transfer language<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>
</dd>
<dt>synthesizer (synthesis tool)</dt>
<dd>将 RTL design synthesis 到某个具体的 hardware technology 上<span class="mojikumi-line-end">，</span>通常分为若干步骤<span class="mojikumi-line-end">：</span>
<ol>
<li>mapping: 将 RTL design 对应到具体的 hardware element</li>
<li>placement: 在 FPGA / CPLD 设计中<span class="mojikumi-line-end">，</span>为每个 element 选择具体的 programmable resource instance<span class="mojikumi-line-end">；</span>在 ASIC 设计中<span class="mojikumi-line-end">，</span>为各种 basic building block 安排位置</li>
<li>routing: 在 FPGA / ASIC 设计中<span class="mojikumi-line-end">，</span>在 element 之间连线<span class="mojikumi-line-start">（</span>CPLD 中连线是固定的<span class="mojikumi-line-end">，</span>要根据连线选择 programmable resource<span class="mojikumi-line-end">）</span></li>
</ol>
</dd>
<dt>simulator</dt>
<dd>对给定的 HDL model 和随时间变化的输入<span class="mojikumi-line-end">，</span>计算出随时间变化的输出<span class="mojikumi-line-end">。</span>输入可以是手动编辑的<span class="mojikumi-line-end">，</span>由 <i>test bench</i> 生成的<span class="mojikumi-line-end">，</span>或者通过 <i>waveform editor</i> 编辑的<span class="mojikumi-line-end">。</span>输出可以是波形图或者列表<span class="mojikumi-line-end">，</span>还可能包含警告<span class="mojikumi-line-end">。</span>
</dd>
<dt>template generator</dt>
<dd>生成常用的代码模板<span class="mojikumi-line-end">。</span>
</dd>
<dt>schematic viewer</dt>
<dd>由 HDL model <span class="mojikumi">（</span>RTL<span class="mojikumi">）</span> 或 synthesized result 生成 schematic diagram<span class="mojikumi-line-end">，</span>synthesis 前后的 schematic diagram 可能会有很大的不同<span class="mojikumi-line-end">，</span>但功能是一致的<span class="mojikumi-line-end">。</span>
</dd>
<dt>chip viewer</dt>
<dd>查看 synthesized result 中的物理布局和连线<span class="mojikumi-line-end">。</span>
</dd>
<dt>constraints editor</dt>
<dd>给 synthesizer 调参<span class="mojikumi-line-end">，</span>例如设置 timing 要求<span class="mojikumi-line-end">，</span>调整优化目标<span class="mojikumi-line-end">。</span>
</dd>
<dt>timing analyzer</dt>
<dd>计算某些或全部路径的 delay<span class="mojikumi-line-end">。</span>
</dd>
<dt>back annotator</dt>
<dd>将 timing analyzer 的计算结果插入到 HDL model 中<span class="mojikumi-line-end">，</span>以在 simulation 中展现出 timing<span class="mojikumi-line-end">。</span>
</dd>
</dl>
<h3 id="hdl-based-design-flow" class="heading"><a href="#hdl-based-design-flow" class="heading-anchor" aria-label="章节： HDL-Based Design Flow" tabindex="-1"></a><span>HDL-Based Design Flow</span></h3>
<ol>
<li>specification / hierarchy / block diagram</li>
<li>coding</li>
<li>compilation</li>
<li>simulation / functional verification / pre-fitting timing verification</li>
<li>mapping</li>
<li>fitting / place &#x26; route</li>
<li>post-fitting timing verification</li>
</ol>
<p>其中<span class="mojikumi-line-end">，</span>前四步被称作 <dfn>front-end steps</dfn><span class="mojikumi-line-end">，</span>后三步被称作 <dfn>back-end steps</dfn><span class="mojikumi-line-end">。</span></p>
<p>设计过程一般不会是一步一步顺着来的<span class="mojikumi-line-end">，</span>而是会不断反复<span class="mojikumi-line-end">。</span>为了少折腾<span class="mojikumi-line-end">，</span>第一步中总体设计的合理性<span class="mojikumi-line-end">，</span>以及第四步中进入 back-end steps 前的测试<span class="mojikumi-line-end">，</span>都非常重要<span class="mojikumi-line-end">。</span>由于精确的 timing 计算依赖于具体的 fitting<span class="mojikumi-line-end">，</span>在第七步发现 timing 不符合要求而推倒重来也是很有可能的<span class="mojikumi-line-end">。</span></p>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/ddpp">ddpp</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
        <item>
            <title><![CDATA[DDPP 第三章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/01/ddpp-3</link>
            <guid>https://ouuan.moe/post/2023/01/ddpp-3</guid>
            <pubDate>Sun, 29 Jan 2023 07:52:32 GMT</pubDate>
            <description><![CDATA[
<p><a href="https://wakerly.org/DDPP/">DDPP5</a> 第三章 <span class="mojikumi">“</span>Switching Algebra and Combinational Logic<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
<p>本章的主要内容为逻辑代数<span class="mojikumi-line-end">、</span>逻辑代数在电路中的使用及化简<span class="mojikumi-line-end">、</span>timing hazard<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[
<p><a href="https://wakerly.org/DDPP/">DDPP5</a> 第三章 <span class="mojikumi">“</span>Switching Algebra and Combinational Logic<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
<p>本章的主要内容为逻辑代数<span class="mojikumi-line-end">、</span>逻辑代数在电路中的使用及化简<span class="mojikumi-line-end">、</span>timing hazard<span class="mojikumi-line-end">。</span></p>

<h2 id="switching-algebra" class="heading"><a href="#switching-algebra" class="heading-anchor" aria-label="章节： Switching Algebra" tabindex="-1"></a><span>Switching Algebra</span></h2>
<p>这一节基本上就是离散数学 (1) 开头两章的内容<span class="mojikumi-line-end">，</span>术语和记号有很多不同<span class="mojikumi-line-end">，</span><s>幸好忘的差不多了<span class="mojikumi-line-end">，</span>不然都要搞混了</s><span class="mojikumi-line-end">。</span></p>
<h3 id="记号" class="heading"><a href="#记号" class="heading-anchor" aria-label="章节： 记号" tabindex="-1"></a><span>记号</span></h3>
<ul>
<li>AND<span class="mojikumi-line-end">：</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Y</mi></mrow><annotation encoding="application/x-tex">X\ \cdot\ Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span></span></li>
<li><span class="inline-block w-3"></span>OR<span class="mojikumi-line-end">：</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi><mo>+</mo><mi>Y</mi></mrow><annotation encoding="application/x-tex">X + Y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span></span></span></span></span></li>
<li>NOT<span class="mojikumi-line-end">：</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">X'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span></li>
<li>AND 的优先级高于 OR</li>
</ul>
<p><span class="mojikumi-line-start">（</span>yysy 我还是更喜欢 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∨</mo><mo separator="true">,</mo><mo>∧</mo></mrow><annotation encoding="application/x-tex">\lor, \land</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.75em;vertical-align:-0.1944em;"></span><span class="mord">∨</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">∧</span></span></span></span></span><span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⋅</mo></mrow><annotation encoding="application/x-tex">\cdot</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord">⋅</span></span></span></span></span> 也还行<span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo></mrow><annotation encoding="application/x-tex">+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">+</span></span></span></span></span> 真的有点难以接受<span class="mojikumi">。</span><span class="mojikumi">）</span><wbr><span class="mojikumi-line-start">（</span><s>它们明明是对偶的怎么搞得像个环一样<span class="mojikumi-line-end">。</span></s><span class="mojikumi">）</span><wbr><span class="mojikumi-line-start">（</span>主要还是下面这些定理用加号看起来真的好怪<span class="mojikumi">。</span><span class="mojikumi">）</span><wbr><span class="mojikumi-line-start">（</span>异或不是还号称二进制加法吗<span class="mojikumi">。</span><span class="mojikumi-line-end">）</span></p>
<h3 id="公理" class="heading"><a href="#公理" class="heading-anchor" aria-label="章节： 公理" tabindex="-1"></a><span>公理</span></h3>
<div class="math math-display"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A1)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo mathvariant="normal">≠</mo><mn>1</mn><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><mi>X</mi><mo>=</mo><mn>0</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A1D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo mathvariant="normal">≠</mo><mn>0</mn><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><mi>X</mi><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A2)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>=</mo><mn>0</mn><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A2D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>=</mo><mn>1</mn><mtext>  </mtext><mo>⟹</mo><mtext>  </mtext><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mn>0</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A3)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>0</mn><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mn>0</mn><mo>=</mo><mn>0</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A3D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1</mn><mo>+</mo><mn>1</mn><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A4)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1</mn><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mn>1</mn><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A4D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>0</mn><mo>+</mo><mn>0</mn><mo>=</mo><mn>0</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A5)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>0</mn><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mn>1</mn><mo>=</mo><mn>1</mn><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mn>0</mn><mo>=</mo><mn>0</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(A5D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1</mn><mo>+</mo><mn>0</mn><mo>=</mo><mn>0</mn><mo>+</mo><mn>1</mn><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{array}{rl}
\text{(A1)} &#x26; X \ne 1 \implies X = 0 \\
\text{(A1D)} &#x26; X \ne 0 \implies X = 1 \\\\
\text{(A2)} &#x26; X = 0 \implies X' = 1 \\
\text{(A2D)} &#x26; X = 1 \implies X' = 0 \\\\
\text{(A3)} &#x26; 0 \ \cdot\  0 = 0 \\
\text{(A3D)} &#x26; 1 + 1 = 1 \\\\
\text{(A4)} &#x26; 1 \ \cdot\  1 = 1 \\
\text{(A4D)} &#x26; 0 + 0 = 0 \\\\
\text{(A5)} &#x26; 0 \ \cdot\  1 = 1 \ \cdot\  0 = 0 \\
\text{(A5D)} &#x26; 1 + 0 = 0 + 1 = 1
\end{array}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:16.8em;vertical-align:-8.15em;"></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:8.65em;"><span style="top:-10.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A1)</span></span></span></span><span style="top:-9.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A1D)</span></span></span></span><span style="top:-8.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-7.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A2)</span></span></span></span><span style="top:-6.01em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A2D)</span></span></span></span><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A3)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A3D)</span></span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-0.01em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A4)</span></span></span></span><span style="top:1.19em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A4D)</span></span></span></span><span style="top:2.39em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:3.59em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A5)</span></span></span></span><span style="top:4.79em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(A5D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:8.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:8.65em;"><span style="top:-10.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span></span></span><span style="top:-9.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span></span></span><span style="top:-7.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span></span></span><span style="top:-6.01em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">⟹</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span></span></span><span style="top:-0.01em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span></span></span><span style="top:1.19em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span></span></span><span style="top:3.59em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">0</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span></span></span><span style="top:4.79em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:8.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span></span></span></div>
<h3 id="定理" class="heading"><a href="#定理" class="heading-anchor" aria-label="章节： 定理" tabindex="-1"></a><span>定理</span></h3>
<p>中文名来自<span class="mojikumi-line-start">《</span>数理逻辑与集合论<span class="mojikumi-line-start">（</span>第二版<span class="mojikumi">）</span><span class="mojikumi-line-end">》</span>2.2 节<span class="mojikumi-line-start">“</span>等值公式<span class="mojikumi">”</span><span class="mojikumi-line-end">。</span></p>
<div class="math math-display"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnalign="left left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T1)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>+</mo><mn>0</mn><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T1D)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mn>1</mn><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Identities（同一律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T2)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>+</mo><mn>1</mn><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T2D)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mn>0</mn><mo>=</mo><mn>0</mn></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Null elements（零律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T3)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>+</mo><mi>X</mi><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T3D)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>X</mi><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Idempotency（幂等律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="1em"></mspace><mtext> (T4)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><msup><mo stretchy="false">)</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Involution（双重否定律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T5)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>+</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T5D)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mn>0</mn></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Complements（补余律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T6)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>+</mo><mi>Y</mi><mo>=</mo><mi>Y</mi><mo>+</mo><mi>X</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T6D)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Y</mi><mo>=</mo><mi>Y</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>X</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Commutativity（交换律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T7)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>+</mo><mi>Z</mi><mo>=</mo><mi>X</mi><mo>+</mo><mo stretchy="false">(</mo><mi>Y</mi><mo>+</mo><mi>Z</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T7D)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Y</mi><mo stretchy="false">)</mo><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Z</mi><mo>=</mo><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mo stretchy="false">(</mo><mi>Y</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Z</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Associativity（结合律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T8)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mo stretchy="false">(</mo><mi>Y</mi><mo>+</mo><mi>Z</mi><mo stretchy="false">)</mo><mo>=</mo><mtext> </mtext><mtext> </mtext><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Y</mi><mtext> </mtext><mtext> </mtext><mo>+</mo><mtext> </mtext><mtext> </mtext><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Z</mi><mtext> </mtext><mtext> </mtext></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T8D)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>+</mo><mtext> </mtext><mtext> </mtext><mi>Y</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Z</mi><mtext> </mtext><mtext> </mtext><mo>=</mo><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><mi>Y</mi><mo stretchy="false">)</mo><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><mi>Z</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Distributivity（分配律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T9)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>+</mo><mtext> </mtext><mtext> </mtext><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Y</mi><mtext> </mtext><mtext> </mtext><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext>(T9D)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Covering（吸收律）</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T10)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mtext> </mtext><mtext> </mtext><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>Y</mi><mtext> </mtext><mtext> </mtext><mo>+</mo><mtext> </mtext><mtext> </mtext><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><msup><mi>Y</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mtext> </mtext><mtext> </mtext><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T10D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><mi>Y</mi><mo stretchy="false">)</mo><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><msup><mi>Y</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo stretchy="false">)</mo><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Combining</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T11)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi>X</mi><mo>⋅</mo><mi>Y</mi><mo>+</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>⋅</mo><mi>Z</mi><mo>+</mo><mi>Y</mi><mo>⋅</mo><mi>Z</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo>=</mo><mtext> </mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mi>X</mi><mo>⋅</mo><mi>Y</mi><mo>+</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>⋅</mo><mi>Z</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T11D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>+</mo><mi>Z</mi><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mi>Y</mi><mo>+</mo><mi>Z</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo>=</mo><mtext> </mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><mi>Y</mi><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>+</mo><mi>Z</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Consensus</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T12)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mo>+</mo><mi>X</mi><mo>+</mo><mo>⋯</mo><mo>+</mo><mi>X</mi><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T12D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>X</mi><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mo>⋯</mo><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>X</mi><mo>=</mo><mi>X</mi></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Generalized idempotency</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T13)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">(</mo><mi>X</mi><mtext>  </mtext><mo>⋅</mo><mtext> </mtext><mi>X</mi><mtext>  </mtext><mo>⋅</mo><mtext> </mtext><mo>⋯</mo><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>X</mi><msup><mo stretchy="false">)</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mtext> </mtext><mtext> </mtext><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>+</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>+</mo><mo>⋯</mo><mo>+</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T13D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">(</mo><mi>X</mi><mo>+</mo><mi>X</mi><mo>+</mo><mo>⋯</mo><mo>+</mo><mi>X</mi><msup><mo stretchy="false">)</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mtext> </mtext><mtext> </mtext><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>⋅</mo><mtext> </mtext><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>⋅</mo><mtext> </mtext><mo>⋯</mo><mtext> </mtext><mo>⋅</mo><mtext> </mtext><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>DeMorgan’s theorem</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>（摩根律）</mtext></mstyle></mtd></mtr></mtable></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mspace width="0.5em"></mspace><mtext> (T14)</mtext></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo stretchy="false">[</mo><mi>F</mi><mo stretchy="false">(</mo><msub><mi>X</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>X</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>X</mi><mi>n</mi></msub><mo separator="true">,</mo><mo>+</mo><mo separator="true">,</mo><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mo stretchy="false">)</mo><msup><mo stretchy="false">]</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">=</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mtext> </mtext><mi>F</mi><mo stretchy="false">(</mo><msubsup><mi>X</mi><mn>1</mn><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msubsup><mo separator="true">,</mo><msubsup><mi>X</mi><mn>2</mn><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msubsup><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msubsup><mi>X</mi><mi>n</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msubsup><mo separator="true">,</mo><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mo separator="true">,</mo><mo>+</mo><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable></mstyle></mtd></mtr></mtable></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtable rowspacing="0.16em" columnalign="center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Generalized</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>DeMorgan’s theorem</mtext></mstyle></mtd></mtr></mtable></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{array}{ll}

\begin{array}{rl}
\enspace\text{(T1)} &#x26; X + 0 = X \\
\enspace\text{(T1D)} &#x26; X \ \cdot\  1 = X
\end{array}
&#x26; \text{Identities（同一律）}
\\\\

\begin{array}{rl}
\enspace\text{(T2)} &#x26; X + 1 = 1 \\
\enspace\text{(T2D)} &#x26; X \ \cdot\  0 = 0
\end{array}
&#x26; \text{Null elements（零律）}
\\\\

\begin{array}{rl}
\enspace\text{(T3)} &#x26; X + X = X \\
\enspace\text{(T3D)} &#x26; X \ \cdot\  X = X
\end{array}
&#x26; \text{Idempotency（幂等律）}
\\\\

\begin{array}{rl}
\quad\ \text{(T4)} &#x26; (X')' = X
\end{array}
&#x26; \text{Involution（双重否定律）}
\\\\

\begin{array}{rl}
\enspace\text{(T5)} &#x26; X + X' = 1 \\
\enspace\text{(T5D)} &#x26; X \ \cdot\  X' = 0
\end{array}
&#x26; \text{Complements（补余律）}
\\\\

\begin{array}{rl}
\enspace\text{(T6)} &#x26; X + Y = Y + X \\
\enspace\text{(T6D)} &#x26; X \ \cdot\  Y = Y \ \cdot\  X
\end{array}
&#x26; \text{Commutativity（交换律）}
\\\\

\begin{array}{rl}
\enspace\text{(T7)} &#x26; (X + Y) + Z = X + (Y + Z) \\
\enspace\text{(T7D)} &#x26; (X \ \cdot\  Y) \ \cdot\  Z = X \ \cdot\  (Y \ \cdot\  Z)
\end{array}
&#x26; \text{Associativity（结合律）}
\\\\

\begin{array}{rl}
\enspace\text{(T8)} &#x26; X \ \cdot\  (Y + Z) = \,\: X \ \cdot\  Y \,\: + \,\: X \ \cdot\  Z \,\: \\
\enspace\text{(T8D)} &#x26; X + \,\: Y \ \cdot\  Z \,\: = (X + Y) \ \cdot\  (X + Z)
\end{array}
&#x26; \text{Distributivity（分配律）}
\\\\

\begin{array}{rl}
\enspace\text{(T9)} &#x26; X + \,\: X \ \cdot\  Y \,\: = X \\
\enspace\text{(T9D)} &#x26; X \ \cdot\  (X + Y) = X
\end{array}
&#x26; \text{Covering（吸收律）}
\\\\

\begin{array}{rl}
\text{(T10)} &#x26; \,\: X \ \cdot\  Y \,\: + \,\: X \ \cdot\  Y' \,\: = X \\
\text{(T10D)} &#x26; (X + Y) \ \cdot\  (X + Y') = X
\end{array}
&#x26; \text{Combining}
\\\\

\begin{array}{rl}
\text{(T11)} &#x26; \begin{aligned} &#x26; X \cdot Y + X' \cdot Z + Y \cdot Z \\[-0.2em] =\ &#x26; X \cdot Y + X' \cdot Z \end{aligned} \\
\text{(T11D)} &#x26; \begin{aligned} &#x26; (X + Y) \cdot (X' + Z) \cdot (Y + Z) \\[-0.2em] =\ &#x26; (X + Y) \cdot (X' + Z) \end{aligned}
\end{array}
&#x26; \text{Consensus}
\\\\

\begin{array}{rl}
\text{(T12)}  &#x26; X + X + \cdots + X = X \\
\text{(T12D)} &#x26; X \ \cdot\  X \ \cdot\ \cdots\ \cdot\  X = X
\end{array}
&#x26; \text{Generalized idempotency}
\\\\

\begin{array}{rl}
\text{(T13)} &#x26;
\begin{aligned}
&#x26; (X \ \ \cdot\  X \ \ \cdot\ \cdots\ \cdot\  X)' \\[-0.2em]
= &#x26; \,\: X' + X' + \cdots + X'
\end{aligned}
\\
\text{(T13D)} &#x26;
\begin{aligned}
&#x26; (X + X + \cdots + X)' \\[-0.2em]
= &#x26; \,\: X' \cdot\  X' \cdot\  \cdots \ \cdot\  X'
\end{aligned}
\end{array}
&#x26; \begin{array}{c} \text{DeMorgan’s theorem} \\ \text{（摩根律）} \end{array}
\\\\

\begin{array}{rl}
\enspace\ \text{(T14)} &#x26;
\begin{aligned}
 &#x26; [F(X_1, X_2, \ldots, X_n, +, \ \cdot\ )]' \\[-0.2em]
=&#x26;\ F(X_1', X_2', \ldots, X_n', \ \cdot\ , +)
\end{aligned}
\end{array}
&#x26; \begin{array}{c} \text{Generalized} \\ \text{DeMorgan’s theorem} \end{array}
\end{array}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:54.81em;vertical-align:-27.155em;"></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:27.655em;"><span style="top:-31.255em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T1)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T1D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-29.465em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-27.655em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T2)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T2D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-25.865em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-24.055em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T3)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T3D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-22.265em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-21.055em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-3.01em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:1em;"></span><span class="mspace"> </span><span class="mord text"><span class="mord">(T4)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.85em;"><span style="top:-3.01em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.35em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-19.855em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-18.045em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T5)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T5D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">1</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-16.255em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-14.445em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T6)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T6D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-12.655em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-10.845em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T7)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T7D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-9.055em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-7.245em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T8)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T8D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-5.455em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-3.645em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T9)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mord text"><span class="mord">(T9D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:-1.855em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:-0.045em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(T10)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(T10D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:1.745em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:5.155em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.05em;"><span style="top:-5.05em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord text"><span class="mord">(T11)</span></span></span></span><span style="top:-2.25em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord text"><span class="mord">(T11D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.55em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.05em;"><span style="top:-5.05em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span><span class="mspace"> </span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-2.25em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span><span class="mspace"> </span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.55em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:8.545em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:10.355em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(T12)</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(T12D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner">⋯</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:12.145em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:15.555em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.05em;"><span style="top:-5.05em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord text"><span class="mord">(T13)</span></span></span></span><span style="top:-2.25em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord text"><span class="mord">(T13D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.55em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.05em;"><span style="top:-5.05em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner">⋯</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span></span></span></span></span><span style="top:-2.25em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="minner">⋯</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.55em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:18.945em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"></span></span><span style="top:20.955em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.65em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mspace" style="margin-right:0.5em;"></span><span class="mspace"> </span><span class="mord text"><span class="mord">(T14)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.65em;"><span class="pstrut" style="height:3.65em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mrel">=</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.65em;"><span style="top:-3.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">+</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">⋅</span><span class="mspace"> </span><span class="mclose">)</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span><span style="top:-2.51em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"></span><span class="mspace"> </span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-2.453em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-2.453em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8019em;"><span style="top:-2.453em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">⋅</span><span class="mspace"> </span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">+</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:27.155em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:27.655em;"><span style="top:-31.255em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Identities</span><span class="mord cjk_fallback">（同一律）</span></span></span></span><span style="top:-27.655em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Null elements</span><span class="mord cjk_fallback">（零律）</span></span></span></span><span style="top:-24.055em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Idempotency</span><span class="mord cjk_fallback">（幂等律）</span></span></span></span><span style="top:-21.055em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Involution</span><span class="mord cjk_fallback">（双重否定律）</span></span></span></span><span style="top:-18.045em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Complements</span><span class="mord cjk_fallback">（补余律）</span></span></span></span><span style="top:-14.445em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Commutativity</span><span class="mord cjk_fallback">（交换律）</span></span></span></span><span style="top:-10.845em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Associativity</span><span class="mord cjk_fallback">（结合律）</span></span></span></span><span style="top:-7.245em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Distributivity</span><span class="mord cjk_fallback">（分配律）</span></span></span></span><span style="top:-3.645em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Covering</span><span class="mord cjk_fallback">（吸收律）</span></span></span></span><span style="top:-0.045em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Combining</span></span></span></span><span style="top:5.155em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Consensus</span></span></span></span><span style="top:10.355em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord text"><span class="mord">Generalized idempotency</span></span></span></span><span style="top:15.555em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">DeMorgan’s theorem</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord cjk_fallback">（摩根律）</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span><span style="top:20.955em;"><span class="pstrut" style="height:5.05em;"></span><span class="mord"><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.45em;"><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Generalized</span></span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">DeMorgan’s theorem</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.95em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:27.155em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span></span></span></div>
<div class="math math-display"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnalign="right left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>Shannon’s expansion theorems</mtext></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T15)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>F</mi><mo stretchy="false">(</mo><msub><mi>X</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>X</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>X</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mtext> </mtext><msub><mi>X</mi><mn>1</mn></msub><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>F</mi><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><msub><mi>X</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>X</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo>+</mo><msubsup><mi>X</mi><mn>1</mn><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msubsup><mtext> </mtext><mo>⋅</mo><mtext> </mtext><mi>F</mi><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><msub><mi>X</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>X</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mtext>(T15D)</mtext></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>F</mi><mo stretchy="false">(</mo><msub><mi>X</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>X</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>X</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">[</mo><msub><mi>X</mi><mn>1</mn></msub><mo>+</mo><mi>F</mi><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><msub><mi>X</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>X</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo>⋅</mo><mo stretchy="false">[</mo><msubsup><mi>X</mi><mn>1</mn><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msubsup><mo>+</mo><mi>F</mi><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><msub><mi>X</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>X</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{array}{rl}
&#x26; \text{Shannon’s expansion theorems} \\[0.3em]
\text{(T15)} &#x26; F(X_1, X_2, \ldots, X_n) = \ X_1 \ \cdot\  F(1, X_2, \ldots, X_n) + X_1' \ \cdot\  F(0, X_2, \ldots, X_n) \\
\text{(T15D)} &#x26; F(X_1, X_2, \ldots, X_n) = [X_1 + F(1, X_2, \ldots, X_n)] \cdot [X_1' + F(0, X_2, \ldots, X_n)]
\end{array}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.9em;vertical-align:-1.7em;"></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.2em;"><span style="top:-4.36em;"><span class="pstrut" style="height:3em;"></span><span class="mord"></span></span><span style="top:-2.86em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(T15)</span></span></span></span><span style="top:-1.66em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">(T15D)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.7em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.2em;"><span style="top:-4.36em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord text"><span class="mord">Shannon’s expansion theorems</span></span></span></span><span style="top:-2.86em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-2.4519em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-1.66em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)]</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-2.4519em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">F</span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)]</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.7em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span></span></span></span></span></span></span></div>
<p><span class="mojikumi-line-start">（</span><s>草<span class="mojikumi-line-end">，</span>对齐好累<span class="mojikumi-line-end">，</span>我为什么要浪费这个时间<span class="mojikumi-line-end">。</span></s><span class="mojikumi-line-end">）</span></p>
<h3 id="duality" class="heading"><a href="#duality" class="heading-anchor" aria-label="章节： Duality" tabindex="-1"></a><span>Duality</span></h3>
<p>将一个等式中所有的 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span></span> 换成 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span><span class="mojikumi-line-end">、</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span> 换成 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span></span><span class="mojikumi-line-end">、</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo></mrow><annotation encoding="application/x-tex">+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">+</span></span></span></span></span> 换成 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⋅</mo></mrow><annotation encoding="application/x-tex">\cdot</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord">⋅</span></span></span></span></span><span class="mojikumi-line-end">、</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⋅</mo></mrow><annotation encoding="application/x-tex">\cdot</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord">⋅</span></span></span></span></span> 换成 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo></mrow><annotation encoding="application/x-tex">+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">+</span></span></span></span></span><span class="mojikumi-line-end">，</span>等式依然成立<span class="mojikumi-line-end">。</span></p>
<p>上面的定理中带 <span class="mojikumi">“</span>D<span class="mojikumi">”</span> 的都是上一条的对偶<span class="mojikumi-line-end">。</span></p>
<h3 id="standard-representations-of-logic-functions" class="heading"><a href="#standard-representations-of-logic-functions" class="heading-anchor" aria-label="章节： Standard Representations of Logic Functions" tabindex="-1"></a><span>Standard Representations of Logic Functions</span></h3>
<p>这里需要翻出来我离散 (1) 写的 <a href="https://ouuan.github.io/truth-table-generator/">真值表生成器</a><span class="mojikumi-line-start">（</span>其实可以去加上 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo></mrow><annotation encoding="application/x-tex">+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">+</span></span></span></span></span> 和 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⋅</mo></mrow><annotation encoding="application/x-tex">\cdot</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4445em;"></span><span class="mord">⋅</span></span></span></span></span> 作为 alias<span class="mojikumi-line-end">，</span>但如果要加 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span> 的话会很麻烦所以干脆不加了吧<span class="mojikumi-line-start">（</span></p>
<p>logic function 有若干精确的标准表示方法<span class="mojikumi-line-end">：</span></p>
<ul>
<li>真值表</li>
<li>canonical sum: 主析取范式<span class="mojikumi-line-end">，</span>极小项 (minterm) 的和</li>
<li>使用 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∑</mo></mrow><annotation encoding="application/x-tex">\sum</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span></span></span></span></span> 表示的 minterm list</li>
<li>canonical product: 主合取范式<span class="mojikumi-line-end">，</span>极大项 (maxterm) 的和</li>
<li>使用 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∏</mo></mrow><annotation encoding="application/x-tex">\prod</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop op-symbol small-op" style="position:relative;top:0em;">∏</span></span></span></span></span> 表示的 maxterm list</li>
<li>Verilog <code>case</code> 语句</li>
</ul>
<p>这里用 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∏</mo></mrow><annotation encoding="application/x-tex">\prod</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop op-symbol small-op" style="position:relative;top:0em;">∏</span></span></span></span></span> 表示 maxterm list 的下标比离散 (1) 讲的舒服多了<span class="mojikumi-line-end">：</span>minterm 的 index 就是哪组变量取值下表达式值为 1<span class="mojikumi-line-end">，</span>maxterm 的 index 就是哪组变量取值下表达式为 0<span class="mojikumi-line-end">，</span>所以两种范式的下标刚好是补集<span class="mojikumi-line-end">。</span>例如<span class="mojikumi-line-end">，</span>有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi><mo separator="true">,</mo><mi>Y</mi><mo separator="true">,</mo><mi>Z</mi></mrow><annotation encoding="application/x-tex">X, Y, Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span></span></span></span></span> 三个变量<span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>⋅</mo><mi>Y</mi><mo>⋅</mo><msup><mi>Z</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">X' \cdot Y \cdot Z'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span> 的下标是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span></span><span class="mojikumi-line-end">，</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>+</mo><mi>Y</mi><mo>+</mo><msup><mi>Z</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">X' + Y + Z'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8352em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span> 的下标是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn></mrow><annotation encoding="application/x-tex">5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span></span><span class="mojikumi-line-end">；</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mo>∑</mo><mrow><mi>X</mi><mo separator="true">,</mo><mi>Y</mi><mo separator="true">,</mo><mi>Z</mi></mrow></msub><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>6</mn><mo stretchy="false">)</mo><mo>=</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>⋅</mo><msup><mi>Y</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>⋅</mo><mi>Z</mi><mo>+</mo><msup><mi>X</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>⋅</mo><mi>Y</mi><mo>⋅</mo><msup><mi>Z</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>+</mo><mi>X</mi><mo>⋅</mo><mi>Y</mi><mo>⋅</mo><msup><mi>Z</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><msub><mo>∏</mo><mrow><mi>X</mi><mo separator="true">,</mo><mi>Y</mi><mo separator="true">,</mo><mi>Z</mi></mrow></msub><mo stretchy="false">(</mo><mn>0</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>7</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sum_{X,Y,Z}(1,2,6) = X' \cdot Y' \cdot Z + X' \cdot Y \cdot Z' + X \cdot Y \cdot Z' = \prod_{X,Y,Z}(0,3,4,5,7)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1858em;vertical-align:-0.4358em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1786em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.22222em;">Y</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.07153em;">Z</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">6</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8352em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.22222em;">Y</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">Z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.1858em;vertical-align:-0.4358em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∏</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1786em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.22222em;">Y</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.07153em;">Z</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">7</span><span class="mclose">)</span></span></span></span></span><span class="mojikumi-line-end">。</span></p>
<p>Verilog 的 <code>case</code> 语句大概是这个样子<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span>虽然还完全没学 Verilog<span class="mojikumi-line-end">，</span>但我感觉 Shiki 自带的 system-verilog 高亮看起来就比 verilog 正确许多<span class="mojikumi-line-end">，</span>以后可能也用 system-verilog 的高亮了<span class="mojikumi-line-end">）</span></p>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="SystemVerilog 代码块" data-v-c675dba6>SystemVerilog</h4><ile-root id="ile-14"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-14--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">case</span><span style="color: #403F53"> (</span><span style="color: #994CC3">{</span><span style="color: #4876D6">X</span><span style="color: #403F53">,</span><span style="color: #4876D6">Y</span><span style="color: #403F53">,</span><span style="color: #4876D6">Z</span><span style="color: #994CC3">}</span><span style="color: #403F53">)</span></span>
<span><span style="color: #403F53">  </span><span style="color: #AA0982">1</span><span style="color: #403F53">,</span><span style="color: #AA0982">2</span><span style="color: #403F53">,</span><span style="color: #AA0982">6</span><span style="color: #994CC3">:</span><span style="color: #403F53">    </span><span style="color: #4876D6">F</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">1</span><span style="color: #403F53">;</span></span>
<span><span style="color: #403F53">  </span><span style="color: #994CC3">default:</span><span style="color: #403F53">  </span><span style="color: #4876D6">F</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #AA0982">0</span><span style="color: #403F53">;</span></span>
<span><span style="color: #994CC3">endcase</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">case</span><span style="color: #D6DEEB"> (</span><span style="color: #C792EA">{</span><span style="color: #82AAFF">X</span><span style="color: #D6DEEB">,</span><span style="color: #82AAFF">Y</span><span style="color: #D6DEEB">,</span><span style="color: #82AAFF">Z</span><span style="color: #C792EA">}</span><span style="color: #D6DEEB">)</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">,</span><span style="color: #F78C6C">2</span><span style="color: #D6DEEB">,</span><span style="color: #F78C6C">6</span><span style="color: #C792EA">:</span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">F</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #D6DEEB">  </span><span style="color: #C792EA">default:</span><span style="color: #D6DEEB">  </span><span style="color: #82AAFF">F</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">;</span></span>
<span><span style="color: #C792EA">endcase</span></span></code></pre></div></section>
<h2 id="combinational-circuit-analysis" class="heading"><a href="#combinational-circuit-analysis" class="heading-anchor" aria-label="章节： Combinational-Circuit Analysis" tabindex="-1"></a><span>Combinational-Circuit Analysis</span></h2>
<p>这一节就是说给你一个电路图怎么搞出它的 logic function<span class="mojikumi-line-end">。</span>其实没啥好说的<span class="mojikumi-line-end">，</span>就<span class="mojikumi-line-start">（</span>按拓扑序<span class="mojikumi-line-end">）</span>一个一个 gate 递推就行<span class="mojikumi-line-end">，</span>可以用真值表也可以用逻辑表达式<span class="mojikumi-line-end">。</span></p>
<p>有一个小 trick<span class="mojikumi-line-end">：</span>DeMorgan<span class="mojikumi-narrow-left">’</span>s theorem 在电路图中表现为<span class="mojikumi-line-end">，</span>将 inversion bubble 换到另一侧<span class="mojikumi-line-start">（</span>输入 / 输出<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>并且改变 gate 的类型<span class="mojikumi-line-start">（</span>AND / OR<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>这样的话<span class="mojikumi-line-end">，</span>如果两个 inversion bubble 在一条 wire 上就可以消掉<span class="mojikumi-line-end">。</span></p>
<h2 id="combinational-circuit-synthesis" class="heading"><a href="#combinational-circuit-synthesis" class="heading-anchor" aria-label="章节： Combinational-Circuit Synthesis" tabindex="-1"></a><span>Combinational-Circuit Synthesis</span></h2>
<p>在 digital design 中<span class="mojikumi">，</span><wbr><span class="mojikumi-line-start">“</span>Synthesis<span class="mojikumi">”</span> 有若干种含义<span class="mojikumi-line-start">（</span>例如从 HDL 到 FPGA<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>而在这一节只是指从 formal description 到 gate-level circuit<span class="mojikumi-line-end">。</span></p>
<h3 id="circuit-descriptions-and-designs" class="heading"><a href="#circuit-descriptions-and-designs" class="heading-anchor" aria-label="章节： Circuit Descriptions and Designs" tabindex="-1"></a><span>Circuit Descriptions and Designs</span></h3>
<p>自然语言描述 → 逻辑表达式 / 真值表<span class="mojikumi-line-start">（</span>canonical sum / product<span class="mojikumi">）</span> → 电路</p>
<p>很多时候写出逻辑表达式会比列出真值表简单一些<span class="mojikumi-line-end">，</span>但在面对较为复杂的逻辑关系时<span class="mojikumi-line-end">，</span>列出真值表可以强制设计师考虑到每种情况<span class="mojikumi-line-end">，</span>从而避免漏掉 corner case<span class="mojikumi-line-end">。</span></p>
<p>一个输出是某个逻辑表达式的电路被称作 <i>realize</i> 了这个表达式<span class="mojikumi-line-end">，</span>是这个表达式的 <i>realization</i> 或者 <i>implementation</i><span class="mojikumi-line-end">。</span></p>
<h3 id="circuit-manipulations" class="heading"><a href="#circuit-manipulations" class="heading-anchor" aria-label="章节： Circuit Manipulations" tabindex="-1"></a><span>Circuit Manipulations</span></h3>
<p>在多数电路技术<span class="mojikumi-line-start">（</span>包括 CMOS<span class="mojikumi-line-end">）</span>中<span class="mojikumi-line-end">，</span>NAND / NOR 比 AND / OR 效率更高<span class="mojikumi-line-end">，</span>所以一般会修改电路来尽量使用 inverting gate 而非 noninverting gate<span class="mojikumi-line-end">：</span></p>
<ul>
<li>在 wire 上移动 inversion bubble<span class="mojikumi-line-start">（</span>从上一个输出移到下一个输入<span class="mojikumi-line-end">）</span></li>
<li>在 wire 的两侧同时加上 inversion bubble<span class="mojikumi-line-start">（</span>或者 NOT gate<span class="mojikumi-line-end">）</span></li>
<li>消除同一根 wire 上的两个 inversion bubble</li>
<li>将 inversion bubble 换到另一侧<span class="mojikumi-line-start">（</span>输入 / 输出<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>并且改变 gate 的类型<span class="mojikumi-line-start">（</span>AND / OR<span class="mojikumi-line-end">）</span></li>
</ul>
<h3 id="combinational-circuit-minimization" class="heading"><a href="#combinational-circuit-minimization" class="heading-anchor" aria-label="章节： Combinational-Circuit Minimization" tabindex="-1"></a><span>Combinational-Circuit Minimization</span></h3>
<p>一般情况下<span class="mojikumi-line-end">，</span>逻辑表达式的化简主要用的是定理 T10<span class="mojikumi-line-start">（</span>Combining<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>就是在 sum of products 中找到仅有一项相反的两个 product 将它们合并<span class="mojikumi-line-end">，</span>最终得到的也是一个 sum of products<span class="mojikumi-line-end">，</span>实现为 2-level<span class="mojikumi-line-start">（</span>first-level 计算 product<span class="mojikumi-line-end">，</span>second-level 计算 sum<span class="mojikumi-line-end">）</span>的电路<span class="mojikumi-line-end">。</span></p>
<p>product of sums 电路是对偶的<span class="mojikumi-line-end">，</span>就不重复了<span class="mojikumi-line-end">，</span>下文也是一样<span class="mojikumi-line-end">。</span></p>
<h3 id="karnaugh-maps" class="heading"><a href="#karnaugh-maps" class="heading-anchor" aria-label="章节： Karnaugh Maps" tabindex="-1"></a><span>Karnaugh Maps</span></h3>
<p>如 DDPP5 Figure 3-23 所示<span class="mojikumi-line-end">：</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-3-23.15ec6efa.webp" loading="lazy" src="/assets/ddpp-fig-3-23.15ec6efa.webp" width="1235" height="457" alt="2-variable, 3-variable, and 4-variable Karnaugh maps"></picture></p>
<p>在 Karnaugh map 中<span class="mojikumi-line-end">，</span>每一个表示一个 minterm<span class="mojikumi-line-end">，</span>相邻<span class="mojikumi-line-start">（</span>包括跨过边界到另一侧的相邻<span class="mojikumi-line-end">）</span>的格子仅有一位相反<span class="mojikumi-line-end">，</span>所以边长为 1 / 2 / 4 的矩形可以合并<span class="mojikumi-line-end">。</span></p>
<p>选出若干矩形<span class="mojikumi-line-end">，</span>恰好覆盖所有输出为 1 的格子<span class="mojikumi-line-end">，</span>就可以化简逻辑表达式<span class="mojikumi-line-end">。</span></p>
<p>如果一个矩形覆盖的全是 1<span class="mojikumi-line-end">，</span>并且是极大的<span class="mojikumi-line-start">（</span>在其对应的 product 中减少任何一个输入都会使其覆盖到 0<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>就称作一个 <i>prime implicant</i><span class="mojikumi-line-end">。</span>最简的逻辑表达式是若干 prime implicant 的 sum<span class="mojikumi-line-end">。</span></p>
<p>有的函数的 Karnaugh map 非常分散<span class="mojikumi-line-start">（</span>例如 parity function<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>没有连成一块的 1<span class="mojikumi-line-end">，</span>就需要多级而非 2-level 的电路来进行化简<span class="mojikumi-line-end">。</span></p>
<p>在 FPGA 中<span class="mojikumi-line-end">，</span>输入数量较少的电路都是通过 lookup table (LUT) 而非 gate-level circuit 来实现<span class="mojikumi-line-end">，</span>只需真值表就可以<span class="mojikumi-line-end">。</span>但复杂的电路需要由多个 LUT 组合起来<span class="mojikumi-line-end">，</span>此时逻辑表达式的化简依然有用<span class="mojikumi-line-end">。</span></p>
<h2 id="timing-hazards" class="heading"><a href="#timing-hazards" class="heading-anchor" aria-label="章节： Timing Hazards" tabindex="-1"></a><span>Timing Hazards</span></h2>
<p>真实的电路中会有 delay<span class="mojikumi-line-end">，</span>而上面研究的都是 combinational logic circuit 的 <i>steady-state behavior</i><span class="mojikumi-line-end">，</span>没有考虑到 <i>transient behavior</i><span class="mojikumi-line-end">。</span></p>
<p>因为 delay 的存在<span class="mojikumi-line-end">，</span>可能会发生这样的情况<span class="mojikumi-line-end">：</span>输入发生了改变<span class="mojikumi-line-end">，</span>稳态下的输出不变<span class="mojikumi-line-end">，</span>但在一瞬间内输出发生了变化<span class="mojikumi-line-start">（</span>产生了一个 short pulse<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>这样的 pulse 被称作 <i>glitch</i><span class="mojikumi-line-end">。</span></p>
<p>如果一个电路有产生 glitch 的可能性<span class="mojikumi-line-end">，</span>则称这个电路存在 <i>hazard</i><span class="mojikumi-line-end">。</span>实际物理电路的 delay 大小等因素难以控制<span class="mojikumi-line-end">，</span>所以这里只是考虑产生 glitch 的可能性<span class="mojikumi-line-end">，</span>而非实际是否有 glitch 产生<span class="mojikumi-line-start">（</span>有点类似于并发编程中要保证所有可能的执行顺序下都不出错<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<h3 id="static-hazards" class="heading"><a href="#static-hazards" class="heading-anchor" aria-label="章节： Static Hazards" tabindex="-1"></a><span>Static Hazards</span></h3>
<p><i>static-1 hazard</i><span class="mojikumi-line-end">：</span>稳态输出是 1<span class="mojikumi-line-end">，</span>改变某一个输入后稳态输出还是 1<span class="mojikumi-line-end">，</span>但这一个输入改变时可能会短暂地输出 0<span class="mojikumi-line-end">。</span>static-0 hazard 是类似的<span class="mojikumi-line-end">。</span></p>
<p>书上给了个例子<span class="mojikumi-line-end">，</span>但这个其实很好理解<span class="mojikumi-line-end">，</span>就是电路的一个输入作为多个 gate 的输入<span class="mojikumi-line-end">，</span>而这些 gate 的输出变化得有快有慢<span class="mojikumi-line-end">。</span></p>
<h3 id="finding-static-hazards-using-maps" class="heading"><a href="#finding-static-hazards-using-maps" class="heading-anchor" aria-label="章节： Finding Static Hazards Using Maps" tabindex="-1"></a><span>Finding Static Hazards Using Maps</span></h3>
<p>正常的 sum of products 电路中不会有 static-0 hazard<span class="mojikumi-line-end">，</span>可能有 static-1 hazard<span class="mojikumi-line-end">。</span></p>
<p>可以用 Karnaugh map 来找到 hazard<span class="mojikumi-line-end">：</span>如果两个相邻的 1 没有被同一个 gate 覆盖<span class="mojikumi-line-end">，</span>从其中一个变为另一个时就可能产生 glitch<span class="mojikumi">。</span><wbr><span class="mojikumi-line-start">（</span>因为极端情况下可能所有覆盖原来那一格的 gate 先全部变为 0<span class="mojikumi-line-end">，</span>覆盖后来那一格的 gate 才变为 1<span class="mojikumi">。</span><span class="mojikumi-line-end">）</span></p>
<p>消除 hazard 就是用冗余的 gate 来覆盖这样的相邻的 1<span class="mojikumi-line-end">，</span>类似于定理 T11<span class="mojikumi-line-start">（</span>Consensus<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<h3 id="dynamic-hazards" class="heading"><a href="#dynamic-hazards" class="heading-anchor" aria-label="章节： Dynamic Hazards" tabindex="-1"></a><span>Dynamic Hazards</span></h3>
<p>如果变化一个输入时可能产生不止一次 glitch<span class="mojikumi-line-end">，</span>就称作 <i>dynamic hazard</i><span class="mojikumi-line-end">。</span></p>
<p>一个正常的 2-level sum of products / product of sums 电路中不会有 dynamic hazard<span class="mojikumi-line-end">。</span></p>
<h3 id="designing-hazard-free-circuits" class="heading"><a href="#designing-hazard-free-circuits" class="heading-anchor" aria-label="章节： Designing Hazard-Free Circuits" tabindex="-1"></a><span>Designing Hazard-Free Circuits</span></h3>
<p>在多数电路中<span class="mojikumi-line-start">（</span>尤其是 synchronous digital system 中<span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>hazard 不会造成什么影响<span class="mojikumi-line-end">。</span>但在某些电路<span class="mojikumi-line-start">（</span>asynchronous sequential circuits<span class="mojikumi-line-end">）</span>中<span class="mojikumi-line-end">，</span>需要避免 hazard 的存在<span class="mojikumi-line-end">。</span></p>
<p>在一般的电路中消除 hazard 是复杂的<span class="mojikumi-line-end">，</span>而在 sum of products 中<span class="mojikumi-line-end">，</span>可以用 Karnaugh map 或者取遍所有 prime implicant<span class="mojikumi-line-start">（</span>称作 <i>complete sum</i><span class="mojikumi-line-end">）</span>来消除 hazard<span class="mojikumi-line-end">。</span></p>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/ddpp">ddpp</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
        <item>
            <title><![CDATA[DDPP 第二章学习笔记]]></title>
            <link>https://ouuan.moe/post/2023/01/ddpp-2</link>
            <guid>https://ouuan.moe/post/2023/01/ddpp-2</guid>
            <pubDate>Tue, 24 Jan 2023 14:37:12 GMT</pubDate>
            <description><![CDATA[

<p><a href="https://wakerly.org/DDPP/">DDPP5</a> 第二章 <span class="mojikumi">“</span>Number Systems and Codes<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
<p>本章的主要内容为一些常用的编码以及纠错码的原理<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[

<p><a href="https://wakerly.org/DDPP/">DDPP5</a> 第二章 <span class="mojikumi">“</span>Number Systems and Codes<span class="mojikumi">”</span> 的学习笔记<span class="mojikumi-line-end">。</span></p>
<p>本章的主要内容为一些常用的编码以及纠错码的原理<span class="mojikumi-line-end">。</span></p>

<p>开头整数编码的内容很多是 <a href="/post/2022/09/csapp-2">CS:APP 第二章</a> 讲过的<span class="mojikumi-line-end">，</span>也有一些新内容<span class="mojikumi-line-end">，</span>但基本上都是标星的可选内容<span class="mojikumi-line-end">，</span>我看是看了但懒得写笔记了<span class="mojikumi-line-start">（</span></p>
<hr>
<p>一套编码被称作一个 <i>code</i><span class="mojikumi-line-end">，</span>一个 code 中的单个合法编码<span class="mojikumi-line-start">（</span>二进制串<span class="mojikumi-line-end">）</span>被称作一个 <i>code word</i><span class="mojikumi-line-end">。</span></p>
<h2 id="gray-code" class="heading"><a href="#gray-code" class="heading-anchor" aria-label="章节： Gray Code" tabindex="-1"></a><span>Gray Code</span></h2>
<p>Gray code 的性质<span class="mojikumi-line-end">：</span>相邻两个数的 code word 只有一位不同<span class="mojikumi-line-end">，</span>且 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2^n-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span> 的 code word 中只有一个 1<span class="mojikumi-line-start">（</span>也就是说 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>-bit Gray code 的首尾也只有一位不同<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<a id="4-bit-gray-code" name="4-bit-gray-code" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><details class="shadow-md rd-1 b-l-6 my-6 bg-blue-1 dark:bg-blue-9 b-blue" data-v-a2ab257f><summary class="p-3 flex justify-between items-center cursor-pointer" data-v-a2ab257f><h3 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-pencil text-blue" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>Note: </span><span data-v-a2ab257f>4-bit Gray code</span></h3><span class="details-icon text-5" data-v-a2ab257f></span></summary><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><section class="code-block relative my-6 shadow" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h4 class="text-3 text-footer" aria-label="plain text 代码块" data-v-c675dba6>plain text</h4><ile-root id="ile-15"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-15--></div><div class="dark:hidden" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><samp><span><span style="color: #403f53"> 0: 0000</span></span>
<span><span style="color: #403f53"> 1: 0001</span></span>
<span><span style="color: #403f53"> 2: 0011</span></span>
<span><span style="color: #403f53"> 3: 0010</span></span>
<span><span style="color: #403f53"> 4: 0110</span></span>
<span><span style="color: #403f53"> 5: 0111</span></span>
<span><span style="color: #403f53"> 6: 0101</span></span>
<span><span style="color: #403f53"> 7: 0100</span></span>
<span><span style="color: #403f53"> 8: 1100</span></span>
<span><span style="color: #403f53"> 9: 1101</span></span>
<span><span style="color: #403f53">10: 1111</span></span>
<span><span style="color: #403f53">11: 1110</span></span>
<span><span style="color: #403f53">12: 1010</span></span>
<span><span style="color: #403f53">13: 1011</span></span>
<span><span style="color: #403f53">14: 1001</span></span>
<span><span style="color: #403f53">15: 1000</span></span></samp></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><samp><span><span style="color: #d6deeb"> 0: 0000</span></span>
<span><span style="color: #d6deeb"> 1: 0001</span></span>
<span><span style="color: #d6deeb"> 2: 0011</span></span>
<span><span style="color: #d6deeb"> 3: 0010</span></span>
<span><span style="color: #d6deeb"> 4: 0110</span></span>
<span><span style="color: #d6deeb"> 5: 0111</span></span>
<span><span style="color: #d6deeb"> 6: 0101</span></span>
<span><span style="color: #d6deeb"> 7: 0100</span></span>
<span><span style="color: #d6deeb"> 8: 1100</span></span>
<span><span style="color: #d6deeb"> 9: 1101</span></span>
<span><span style="color: #d6deeb">10: 1111</span></span>
<span><span style="color: #d6deeb">11: 1110</span></span>
<span><span style="color: #d6deeb">12: 1010</span></span>
<span><span style="color: #d6deeb">13: 1011</span></span>
<span><span style="color: #d6deeb">14: 1001</span></span>
<span><span style="color: #d6deeb">15: 1000</span></span></samp></pre></div></section></div></details></aside>
<p>递归构造<span class="mojikumi-line-end">：</span></p>
<ol>
<li><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span>-bit Gray code: 0 是 0<span class="mojikumi-line-end">，</span>1 是 1</li>
<li><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(n+1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></span>-bit Gray code:
<ul>
<li>前 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 个数和 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>-bit Gray code 相同<span class="mojikumi-line-start">（</span>开头加上 0<span class="mojikumi-line-end">）</span></li>
<li>后 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 个数是把 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>-bit Gray code 逆序排列再在开头加上 1</li>
</ul>
</li>
</ol>
<p>直接计算单个数的 Gray code<span class="mojikumi-line-end">：</span></p>
<ul>
<li>递归就能直接计算<span class="mojikumi-line-end">，</span><s>相信大家都会做 <a href="https://uoj.ac/problem/488">NOIPD1T1</a> 吧<span class="mojikumi-line-end">，</span>记得开 <code>unsigned long long</code></s><span class="mojikumi-line-start">（</span></li>
<li>也可以这么算<span class="mojikumi-line-end">：</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 的 Gray code 第 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span></span> 位为 1 当且仅当 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 的二进制中第 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span></span> 位和第 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7429em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span> 位不同</li>
</ul>
<p>书中描述了一个使用场景<span class="mojikumi-line-end">：</span>一个磁盘的每个扇区需要编码<span class="mojikumi-line-end">，</span>从扇区上读取若干 bits 来识别当前处于哪个扇区<span class="mojikumi-line-end">，</span>在两个相邻扇区的交界处可能有部分 bits 来自其中一个扇区<span class="mojikumi-line-end">，</span>另外的 bits 来自另一个扇区<span class="mojikumi-line-end">，</span>Gray code 可以使最终读取到的结果一定是这两个扇区之一<span class="mojikumi-line-end">。</span></p>
<h2 id="codes-for-actions-conditions-and-states" class="heading"><a href="#codes-for-actions-conditions-and-states" class="heading-anchor" aria-label="章节： Codes for Actions, Conditions, and States" tabindex="-1"></a><span>Codes for Actions, Conditions, and States</span></h2>
<p>说白了就是如何编码一个 enum<span class="mojikumi-line-end">。</span>不同的编码方式有各自的特点<span class="mojikumi-line-end">，</span>可以从编码长度<span class="mojikumi-line-end">、</span>电路开销<span class="mojikumi-line-end">、</span>设计难度<span class="mojikumi-line-end">、</span>可纠错性等角度考虑<span class="mojikumi-line-end">，</span>选择最合适的编码方式<span class="mojikumi-line-end">，</span>或者组合使用多种编码方式<span class="mojikumi-line-end">。</span></p>
<ul>
<li>顺着编码为二进制可以使编码长度最短<span class="mojikumi-line-start">（</span><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">⌈</mo><msub><mrow><mi>log</mi><mo>⁡</mo></mrow><mn>2</mn></msub><mi>n</mi><mo stretchy="false">⌉</mo></mrow><annotation encoding="application/x-tex">\lceil \log_2 n \rceil</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">⌈</span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.207em;"><span style="top:-2.4559em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2441em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mclose">⌉</span></span></span></span></span><span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></li>
<li><i>1-out-of-n-code</i><span class="mojikumi-line-end">：</span>合法的 code word 只有一位是 1<span class="mojikumi-line-end">，</span>每个 enum 对应某一位为 1<span class="mojikumi-line-end">。</span>例如<span class="mojikumi-line-end">，</span>控制哪个灯开时<span class="mojikumi-line-end">，</span>这种编码方式无需再有电路来选择要开的灯<span class="mojikumi-line-end">，</span>直接将编码的每一位连到一盏灯就可以了<span class="mojikumi-line-end">。</span></li>
<li><i>m-out-of-n-code</i><span class="mojikumi-line-end">：</span>合法的 code word 恰有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></span> 位是 1<span class="mojikumi-line-end">。</span>要检测一个 code word<span class="mojikumi-line-end">，</span>只需使用一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span></span>-input AND gate<span class="mojikumi-line-end">，</span>电路较为简单<span class="mojikumi-line-end">。</span>而 code word 总数有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo fence="true">(</mo><mfrac linethickness="0px"><mi>n</mi><mi>m</mi></mfrac><mo fence="true">)</mo></mrow><annotation encoding="application/x-tex">\binom nm</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.2em;vertical-align:-0.35em;"></span><span class="mord"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size1">(</span></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7454em;"><span style="top:-2.355em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span style="top:-3.144em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size1">)</span></span></span></span></span></span></span><span class="mojikumi-line-end">，</span>也很多<span class="mojikumi-line-end">。</span></li>
</ul>
<h2 id="n-cubes-and-distance" class="heading"><a href="#n-cubes-and-distance" class="heading-anchor" aria-label="章节： n-Cubes and Distance" tabindex="-1"></a><span>n-Cubes and Distance</span></h2>
<p>以 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>-bit 二进制串作为顶点<span class="mojikumi-line-end">，</span>在只有一个 bit 不同的串之间连边<span class="mojikumi-line-end">，</span>得到的图被称作 <i><span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>-cube</i><span class="mojikumi-line-end">，</span>可以画成一个<span class="mojikumi-line-start">（</span>超<span class="mojikumi-line-end">）</span>立方体<span class="mojikumi">：</span><wbr><span class="mojikumi-line-start">（</span>DDPP5 Figure 2-8<span class="mojikumi-line-end">）</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-2-8.a7fd31fd.webp" loading="lazy" src="/assets/ddpp-fig-2-8.a7fd31fd.webp" width="1213" height="827" alt="n-cubes for n = 1, 2, 3, and 4."></picture></p>
<p>图上两个二进制串之间的距离被称作 <i>Hamming distance</i><span class="mojikumi-line-end">，</span>表示两个串中不相同的位数<span class="mojikumi-line-end">。</span></p>
<h2 id="codes-for-detecting-and-correcting-errors" class="heading"><a href="#codes-for-detecting-and-correcting-errors" class="heading-anchor" aria-label="章节： Codes for Detecting and Correcting Errors" tabindex="-1"></a><span>Codes for Detecting and Correcting Errors</span></h2>
<p>实际存储<span class="mojikumi-line-end">、</span>传输编码时<span class="mojikumi-line-end">，</span>可能会发生错误<span class="mojikumi-line-end">。</span>错误的具体行为可以由 <i>error model</i> 刻画<span class="mojikumi-line-end">。</span>最简单的 error model 是 <i>independent error model</i><span class="mojikumi-line-end">，</span>即每个错误只独立地改变编码中的一位<span class="mojikumi-line-end">，</span>多位同时发生错误的概率比一位发生错误的概率小得多<span class="mojikumi-line-end">。</span></p>
<h3 id="error-detecting-codes" class="heading"><a href="#error-detecting-codes" class="heading-anchor" aria-label="章节： Error-Detecting Codes" tabindex="-1"></a><span>Error-Detecting Codes</span></h3>
<p>对于一个 code<span class="mojikumi-line-end">，</span>不是 code word 的二进制串称作 <i>noncode word</i><span class="mojikumi-line-end">。</span></p>
<p><i>error-detecting code</i> 具有这样的性质<span class="mojikumi-line-end">：</span>任何一个 code word 在任意修改一位后都会得到一个 noncode word<span class="mojikumi-line-end">。</span></p>
<p>使用 error-detecting code 时<span class="mojikumi-line-end">，</span>可以认为只要是 code word 都没有发生错误<span class="mojikumi-line-end">，</span>noncode word 则一定发生了错误<span class="mojikumi-line-end">。</span></p>
<p>一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>-bit error-detecting code 是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>-cube 的一个点独立集<span class="mojikumi-line-end">，</span>也就是说任意两个 code word 的 Hamming distance 都至少为 2<span class="mojikumi-line-end">。</span></p>
<p>奇偶性可以用来设计 error-detecting code<span class="mojikumi-line-end">：</span>任给一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span>-bit code<span class="mojikumi-line-end">，</span>将第 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span> 位设为前 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 位中 1 的个数的奇偶性<span class="mojikumi-line-start">（</span>称作 <i>parity bit</i><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>则可以得到一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(n+1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></span>-bit error-detecting code<span class="mojikumi-line-end">。</span>这样的编码称作 <i>1-bit parity code</i><span class="mojikumi-line-end">，</span>若 code word 都有偶数个 1 则称作 <i>even-parity code</i><span class="mojikumi-line-end">，</span>有奇数个 1 则称作 <i>odd-parity code</i><span class="mojikumi-line-end">。</span></p>
<h3 id="error-correcting-and-multiple-error-detecting-codes" class="heading"><a href="#error-correcting-and-multiple-error-detecting-codes" class="heading-anchor" aria-label="章节： Error-Correcting and Multiple-Error-Detecting Codes" tabindex="-1"></a><span>Error-Correcting and Multiple-Error-Detecting Codes</span></h3>
<p>如果一个 code 中两个 code word 的最小 Hamming distance 有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>c</mi><mo>+</mo><mi>d</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2c+d+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span><span class="mojikumi-line-end">，</span>则可以对最多 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span></span> 位的错误进行纠正<span class="mojikumi-line-end">，</span>并且检测到最多 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>+</mo><mi>d</mi></mrow><annotation encoding="application/x-tex">c+d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span></span> 位的错误<span class="mojikumi-line-start">（</span>一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>+</mo><mi>d</mi><mo>+</mo><mn>1</mn><mo>∼</mo><mn>2</mn><mi>c</mi><mo>+</mo><mi>d</mi></mrow><annotation encoding="application/x-tex">c+d+1 \sim 2c+d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">d</span></span></span></span></span> 位的错误会被认为是来自另一个方向的错误而被错误地纠正<span class="mojikumi-line-end">，</span>从而不能被检测到<span class="mojikumi-line-end">；</span>可以选择少纠错几位来检测到更多位的错误<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p>纠错就是找到和一个 noncode word 的 Hamming distance 最小的唯一一个 code word<span class="mojikumi-line-end">，</span>进行纠错的硬件被称作 error-correcting decoder<span class="mojikumi-line-end">。</span></p>
<h3 id="hamming-codes" class="heading"><a href="#hamming-codes" class="heading-anchor" aria-label="章节： Hamming Codes" tabindex="-1"></a><span>Hamming Codes</span></h3>
<p><i>Hamming code</i> 是一种通用的最小距离为 3 的编码<span class="mojikumi-line-end">。</span>一个有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span></span> 个 check bit 的 Hamming code 最多可以存储 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mi>n</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2^n-n-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span> 个 information bit<span class="mojikumi-line-end">，</span>从而总共有 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2^n-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span> 个 bit<span class="mojikumi-line-end">。</span></p>
<p>一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(2^n-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></span>-bit Hamming code 的 bit 依次编号为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>∼</mo><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">1 \sim 2^n-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span><span class="mojikumi-line-end">，</span>编号为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">1, 2, 4, \ldots, 2^{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></span> 的 bit 是 check bit<span class="mojikumi-line-end">。</span>每个 check bit 代表一个 group<span class="mojikumi-line-end">，</span>编号为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>i</mi></msup></mrow><annotation encoding="application/x-tex">2^i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8247em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8247em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span></span></span></span></span></span></span></span> 的 check bit 所代表的 group 包含的是编号的二进制中包含 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>i</mi></msup></mrow><annotation encoding="application/x-tex">2^i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8247em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8247em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span></span></span></span></span></span></span></span> 的所有 bit<span class="mojikumi-line-end">。</span>check bit 的取值使得每个 group 都含偶数个 1<span class="mojikumi-line-end">。</span></p>
<p>实际使用的 Hamming code 往往会将 check bit 移到末尾<span class="mojikumi-line-end">，</span>例如一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>15</mn></mrow><annotation encoding="application/x-tex">15</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">15</span></span></span></span></span>-bit Hamming code 中 bit 的编号依次为 15, 14, 13, 12, 11, 10, 9, 7, 6, 5, 3, 8, 4, 2, 1<span class="mojikumi-line-end">。</span></p>
<p>因为每个 bit 都至少属于一个 group<span class="mojikumi-line-end">，</span>改变一个 bit 会得到 noncode word<span class="mojikumi-line-end">。</span>改变编号为 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span></span> 和 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span></span> 的两个 bit 时<span class="mojikumi-line-end">，</span>会改变 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span></span></span></span></span> 异或 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span></span> 对应的 group<span class="mojikumi-line-end">，</span>所以改变两个 bit 会得到 noncode word<span class="mojikumi-line-end">。</span>所以 Hamming code 中两个 code word 的 Hamming distance 至少为 3<span class="mojikumi-line-end">。</span></p>
<p>纠错时<span class="mojikumi-line-end">，</span>只要将错误的 check bit 的编号或起来就可以得到错误的 bit 的编号<span class="mojikumi-line-end">。</span></p>
<p>可以通过增加一个 parity bit 来得到一个最小距离为 4 的 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span>-bit extended Hamming code<span class="mojikumi-line-end">。</span></p>
<h3 id="crc-codes" class="heading"><a href="#crc-codes" class="heading-anchor" aria-label="章节： CRC Codes" tabindex="-1"></a><span>CRC Codes</span></h3>
<p><i>cyclic-redundancy-check (CRC) codes</i> 是一种得到广泛应用的 error-correcting code<span class="mojikumi-line-end">，</span>例如被用在文件系统和网络通信中<span class="mojikumi-line-end">，</span>它可以检测到成团出现的多位错误<span class="mojikumi-line-end">，</span>在一些场景中这种错误比随机出现的错误概率更高<span class="mojikumi-line-end">。</span></p>
<h3 id="two-dimensional-codes" class="heading"><a href="#two-dimensional-codes" class="heading-anchor" aria-label="章节： Two-Dimensional Codes" tabindex="-1"></a><span>Two-Dimensional Codes</span></h3>
<p>如 DDPP5 Figure 2-14 (a) 所示<span class="mojikumi-line-end">：</span></p>
<p><picture><img type="image/webp" srcset="/assets/ddpp-fig-2-14-a.6b397e71.webp" loading="lazy" src="/assets/ddpp-fig-2-14-a.6b397e71.webp" width="776" height="529" alt="所有 bits 排列成一个矩阵，矩阵被划分为四个部分: information bits, checks on rows, checks on columns, checks on checks."></picture></p>
<p>选择 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">w</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{\mathrm{row}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight" style="margin-right:0.01389em;">row</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 和 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi mathvariant="normal">c</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">l</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{\mathrm{col}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">col</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 两种编码方式<span class="mojikumi-line-end">，</span>设置 checks on rows 使得 information bits 所在的每一行都是一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">w</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{\mathrm{row}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight" style="margin-right:0.01389em;">row</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 的 code word<span class="mojikumi-line-end">，</span>设置 checks on columns 使得 information bits 所在的每一列都是一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi mathvariant="normal">c</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">l</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{\mathrm{col}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">col</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 的 code word<span class="mojikumi-line-end">，</span>而 checks on checks 则可以选择<span class="mojikumi-line-end">，</span>要么每一行都是一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">w</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{\mathrm{row}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight" style="margin-right:0.01389em;">row</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 的 code word<span class="mojikumi-line-end">，</span>要么每一列都是一个 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi mathvariant="normal">c</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">l</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{\mathrm{col}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">col</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 的 code word<span class="mojikumi-line-end">。</span></p>
<p>这样得到的 <i>two-dimensional code</i> 的最小距离是 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi mathvariant="normal">r</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">w</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{\mathrm{row}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight" style="margin-right:0.01389em;">row</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 和 <span class="math math-inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi mathvariant="normal">c</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">l</mi></mrow></msub></mrow><annotation encoding="application/x-tex">C_{\mathrm{col}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathrm mtight">col</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span> 的乘积<span class="mojikumi-line-end">，</span>所以 two-dimensional code 也被叫做 <i>product code</i><span class="mojikumi-line-end">。</span></p>
<p>RAID 就可以看作使用了 two-dimensional code<span class="mojikumi-line-end">：</span>每块数据盘内的每个 block 都有 CRC code<span class="mojikumi-line-end">，</span>还有一块硬盘用来存所有数据盘的 parity bits<span class="mojikumi-line-end">。</span></p>
<h3 id="checksum-codes" class="heading"><a href="#checksum-codes" class="heading-anchor" aria-label="章节： Checksum Codes" tabindex="-1"></a><span>Checksum Codes</span></h3>
<p>parity bit 可以看作是 bits 在模 2 意义下的和<span class="mojikumi-line-end">，</span>可以推广为 <i>checksum</i><span class="mojikumi-line-end">。</span></p>
<p>例如<span class="mojikumi-line-end">，</span>模 256 意义下<span class="mojikumi-line-end">，</span>可以计算 bytes 的和<span class="mojikumi-line-end">，</span>来检测 bytes 的错误<span class="mojikumi-line-end">。</span></p>
<p>除了改变模数<span class="mojikumi-line-end">，</span>还可以改变计算方式<span class="mojikumi-line-end">，</span>例如使用 ones<span class="mojikumi-narrow-left">’</span> complement 加法来计算模 255 或 65535 意义下的 checksum<span class="mojikumi-line-end">。</span></p>
<h3 id="m-out-of-n-codes" class="heading"><a href="#m-out-of-n-codes" class="heading-anchor" aria-label="章节： m-out-of-n Codes" tabindex="-1"></a><span>m-out-of-n Codes</span></h3>
<p><a href="#codes-for-actions-conditions-and-states">m-out-of-n code</a> 的最小距离为 2<span class="mojikumi-line-end">，</span>并且能够检测到 <i>unidirectional multiple errors</i><span class="mojikumi-line-end">，</span>即所有错误都是 0 变 1 或 1 变 0 的改变多位的错误<span class="mojikumi-line-end">。</span></p>
<h2 id="codes-for-transmitting-and-storing-serial-data" class="heading"><a href="#codes-for-transmitting-and-storing-serial-data" class="heading-anchor" aria-label="章节： Codes for Transmitting and Storing Serial Data" tabindex="-1"></a><span>Codes for Transmitting and Storing Serial Data</span></h2>
<ul>
<li>parallel data transmission: 一个 data word 的所有 bit 同时传输</li>
<li>serial data transmission: 一个 bit 一个 bit 传输</li>
</ul>
<p>在某些场景下<span class="mojikumi-line-end">，</span>serial data transmission 可以减少线路开销<span class="mojikumi-line-end">，</span>或者减少一些设计上的困难<span class="mojikumi-line-end">。</span></p>
<p>最基本的 serial data transmission 需要三个信号<span class="mojikumi-line-end">：</span></p>
<ul>
<li>CLOCK: 将时间划分为一个个 <i>bit cell</i><span class="mojikumi-line-end">，</span>标识出每个 bit 所处的时间范围</li>
<li>SERDATA: 实际传输的数据<span class="mojikumi-line-end">，</span>具体内容依 <i>line code</i> 而定</li>
<li>SYNC: 用来标识 bit 的 significance<span class="mojikumi-line-end">，</span>例如传输 bytes 时用来标记每个 byte 的开头</li>
</ul>
<p>实际上<span class="mojikumi-line-end">，</span>也可以选择合适的 line code 从而只需传输一个信号<span class="mojikumi-line-end">，</span>从数据信号中读取出 CLOCK 和 SYNC 的信息<span class="mojikumi-line-end">。</span></p>
<a id="serial-line-codes" name="serial-line-codes" aria-hidden="true"></a>
<aside role="note" data-v-a2ab257f><div class="shadow-md rd-1 b-l-6 my-6 bg-gray-2 dark:bg-gray-11 b-gray-6" data-v-a2ab257f><div class="p-3 flex justify-between items-center" data-v-a2ab257f><h3 class="flex items-center gap-1 font-bold" data-v-a2ab257f><span class="text-5 i-mdi-timer-sand text-gray" data-v-a2ab257f></span><span class="sr-only" data-v-a2ab257f>WIP: </span><span data-v-a2ab257f>Serial Line Codes</span></h3><!--v-if--></div><div class="overflow-auto rd-br-1 bg-card px-6 dark:bg-bghover" data-v-a2ab257f><p>Serial Line Codes 这一节我感觉有些地方没完全理解<span class="mojikumi-line-end">，</span>也有和 Wikipedia 有出入的地方<span class="mojikumi-line-end">，</span>也标星了<span class="mojikumi-line-end">，</span>感觉后面不一定用得上<span class="mojikumi-line-end">，</span>就先咕了<span class="mojikumi-line-end">。</span></p></div></div></aside>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/ddpp">ddpp</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
        <item>
            <title><![CDATA[DDPP 学习笔记系列 序]]></title>
            <link>https://ouuan.moe/post/2023/01/ddpp</link>
            <guid>https://ouuan.moe/post/2023/01/ddpp</guid>
            <pubDate>Sun, 15 Jan 2023 11:49:22 GMT</pubDate>
            <description><![CDATA[<p><a href="https://wakerly.org/DDPP/">Digital Design Principles and Practices</a> 5th edition 的学习笔记<span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[<p><a href="https://wakerly.org/DDPP/">Digital Design Principles and Practices</a> 5th edition 的学习笔记<span class="mojikumi-line-end">。</span></p>

<hr>
<p>下学期要选数电或数设<span class="mojikumi-line-end">，</span>听说数电是纯考试<span class="mojikumi-line-end">，</span>数设是考试 + 大作业<span class="mojikumi-line-end">，</span>又听说数设助教全是 tuna 群友<span class="mojikumi-line-end">，</span>就选了数设<span class="mojikumi-line-end">，</span>还好没掉课<span class="mojikumi-line-start">（</span></p>
<p>虽然不知道讲课内容和 DDPP 有多少是正交的<span class="mojikumi-line-end">，</span>但看一看 <s>除了没时间学缓考的课有挂科风险</s> 也没啥坏处<span class="mojikumi-line-end">。</span></p>
<p>上学期 <a href="/post/2022/09/csapp">在上课期间学 CS:APP</a> 还是挺痛苦的<span class="mojikumi-line-end">，</span>希望这次寒假能多学一点<span class="mojikumi-line-end">。</span>本来想寒假补完一下 CS:APP<span class="mojikumi-line-end">，</span>但大概是没时间了<span class="mojikumi-line-end">。</span>先学 DDPP 可能对 CS:APP 的第四章也会有些帮助 (?)<span class="mojikumi-line-end">。</span></p>
<p>看了下 preface 和 chapter 1 开头<span class="mojikumi-line-end">，</span>感觉这个作者说话挺有意思的<span class="mojikumi-line-end">，</span>joke 含量很高<span class="mojikumi-line-end">。</span>下面这句摘自 chapter 1 开头<span class="mojikumi-line-end">，</span>两词三义<span class="mojikumi-line-end">，</span><s><a href="https://zh.moegirl.org.cn/%E5%AE%AB%E4%B8%8B%E7%88%B1"><span class="text-aisan">爱姐</span></a><a href="https://zh.moegirl.org.cn/%E5%86%85%E7%94%B0%E7%A7%80"><span class="text-mia">秀酱</span></a>狂喜</s><span class="mojikumi-line-end">，</span><s>又多了一个不读中文翻译的理由</s><span class="mojikumi-line-end">，</span><s>让技术书籍的翻译也来体验一下<span class="text-nijigasaki">虹咲</span>烤肉 man 的痛苦吧</s><span class="mojikumi-line-end">。</span></p>
<blockquote>
<p>Or perhaps you<span class="mojikumi-narrow-left">’</span>re an electrical engineering student who already knows something about analog electronics and circuit design, but you wouldn<span class="mojikumi-narrow-left">’</span>t know a bit if it bit you.</p>
</blockquote>
<p>P.S. 为什么不是 <span class="mojikumi">“</span>DD:PP<span class="mojikumi">”</span> 呢 🤔 <s>是不是作者学 CS:APP 的时候觉得冒号打起来太麻烦了<span class="mojikumi-line-end">，</span>就想着一定要为自己的读者省去这个麻烦</s><span class="mojikumi-line-end">。</span></p>
<p>UPD: 终于读完第一章了<span class="mojikumi-line-end">。</span>drill problem 第一题是<span class="mojikumi">，</span><wbr><span class="mojikumi-line-start">“</span>Give three different definitions for the word <span class="mojikumi-narrow-right">‘</span>bit<span class="mojikumi-narrow-left">’</span> as used in this chapter<span class="mojikumi">”</span><wbr><span class="mojikumi-line-start">（</span></p>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/ddpp">ddpp</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">学习笔记</category>
        </item>
    </channel>
</rss>