<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Digital on ICCI</title><link>https://icci.ink/categories/digital/</link><description>Recent content in Digital on ICCI</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 11 May 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://icci.ink/categories/digital/index.xml" rel="self" type="application/rss+xml"/><item><title>Verilog 实例demo</title><link>https://icci.ink/study/code/digital-verilog-demo/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><guid>https://icci.ink/study/code/digital-verilog-demo/</guid><description>&lt;p&gt;用一个简单的例子来介绍verilog的用法&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目录&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TOC
{:toc}&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="verilog概述"&gt;verilog概述&lt;a class="anchor" href="#verilog%e6%a6%82%e8%bf%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Verilog能够在多种抽象级别对数字逻辑系统进行描述，Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言。当前广泛使用的硬件描述语言包括VHDL以及Verilog HDL（VHSIC Hardware Description Language）；同时verilog还衍生出了一些变种语言如System Verilog、Verilog-AMS等等，丰富了Verilog语言的应用场景。&lt;/p&gt;
&lt;div class="img-center"&gt;&lt;img src="https://icci.ink/images/blog/2025-5-12-verilog介绍.png"/&gt;
&lt;p&gt;不同语言在芯片设计上的主流场景&lt;/p&gt;
&lt;/div&gt; 
&lt;p&gt;verilog语言和VHDL语言功能基本相同，在目前的项目上可以支持混用，但是VHDL的语法上更加严格一些，verilog语言更倾向于C语言，如果是入门学习，作者个人认为学习verilog语言就足够了，学完了Verilog语言基本就能看懂VHDL程序的意思。&lt;/p&gt;
&lt;h2 id="实例"&gt;实例&lt;a class="anchor" href="#%e5%ae%9e%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;话不多说，先看看verilog程序整什么样：
Verilog程序一般分为程序和测试程序（一般习惯叫Testbench），测试程序会依据程序的功能尽可能的覆盖多的场景。&lt;/p&gt;
&lt;h3 id="verilog程序实例"&gt;verilog程序实例&lt;a class="anchor" href="#verilog%e7%a8%8b%e5%ba%8f%e5%ae%9e%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Verilog" data-lang="Verilog"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// and2x模块：实现两个输入信号的与逻辑
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;module&lt;/span&gt; and2x(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;input&lt;/span&gt; a, &lt;span style="color:#75715e"&gt;// 输入信号a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;input&lt;/span&gt; b, &lt;span style="color:#75715e"&gt;// 输入信号b
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;output&lt;/span&gt; r &lt;span style="color:#75715e"&gt;// 输出信号r，等于a和b的与逻辑结果
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 由于a和b已经定义为input，这里不需要再次定义wire
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// wire a, b, r; 这行代码是多余的，应该删除
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// assign语句将a和b的与逻辑结果赋值给输出r
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;assign&lt;/span&gt; r &lt;span style="color:#f92672"&gt;=&lt;/span&gt; a &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;endmodule&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="verilog-testbench程序实例"&gt;verilog testbench程序实例&lt;a class="anchor" href="#verilog-testbench%e7%a8%8b%e5%ba%8f%e5%ae%9e%e4%be%8b"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;再看看verilog程序的测试程序长什么样子&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Verilog" data-lang="Verilog"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;`timescale&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;ns &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;ps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;module&lt;/span&gt; tb_and2x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 定义信号
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;reg&lt;/span&gt; a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;reg&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;wire&lt;/span&gt; r;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 实例化 and2x 模块
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; and2x uut (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .a(a),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .b(b),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .r(r)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 测试过程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;initial&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;begin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 初始化输入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 等待 10ns
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 测试第一个条件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 等待 10ns
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 测试第二个条件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 等待 10ns
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 测试第三个条件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 等待 10ns
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 测试结束
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $finish;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 监控输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//end 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;initial&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;begin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $dumpfile(&lt;span style="color:#e6db74"&gt;&amp;#34;out.vcd&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// This will dump all signal, which may not be useful
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//$dumpvars;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// dumping only this module
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//$dumpvars(1, testbench);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// dumping only these variable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// the first number (level) is actually useless
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $dumpvars(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, testbench);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;endmodule&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="verilog有什么用"&gt;verilog有什么用&lt;a class="anchor" href="#verilog%e6%9c%89%e4%bb%80%e4%b9%88%e7%94%a8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="img-center"&gt;&lt;img src="https://icci.ink/images/blog/2025-5数字芯片设计流程.png
"/&gt;
&lt;p&gt;数字芯片设计流程&lt;/p&gt;</description></item><item><title>Verilog 语法篇</title><link>https://icci.ink/study/code/digital-verilog%E8%AF%AD%E6%B3%95%E7%AF%87/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><guid>https://icci.ink/study/code/digital-verilog%E8%AF%AD%E6%B3%95%E7%AF%87/</guid><description>&lt;p&gt;verilog语法的基本认识&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目录&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TOC
{:toc}&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="前言"&gt;前言&lt;a class="anchor" href="#%e5%89%8d%e8%a8%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;verilog的语法入门篇&lt;/p&gt;
&lt;h2 id="数据类型"&gt;数据类型&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;reg（寄存器）：&lt;/strong&gt;&lt;br&gt;
用于存储逻辑电路中的状态变量，可以通过赋值操作进行更新。其用法类似于其他编程语言中的变量，但不同的是，在 Verilog 中，reg类型的变量可以不仅可以存储数字和布尔值，还可以存储多位二进制数（也可以存储 ASCII 字符）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;integer（整数）：&lt;/strong&gt;&lt;br&gt;
用于存储整数类型的变量，可以进行加减乘除等基本算术运算。其范围为 -2^31 到 2^31 - 1。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;real（实数）：&lt;/strong&gt;&lt;br&gt;
用于存储浮点数类型的变量，可以进行基本的算术运算和一些特殊的数学函数运算。其精度和范围可能因实现而异。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;time（时间）：&lt;/strong&gt;&lt;br&gt;
用于存储时间类型的变量，可以表示电路中的时间间隔，通常以纳秒为单位。在仿真过程中，时间变量可以用于控制模拟过程的进行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;event（事件）：&lt;/strong&gt;&lt;br&gt;
用于在电路中表示事件，可以通过事件触发器（Event Trigger）来控制模块的行为。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;parameter（参数）：&lt;/strong&gt;&lt;br&gt;
用于在模块内部定义常量，其值在模块实例化时被确定。在模块中，参数可以用于配置模块的行为。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除了上述的变量类型之外，Verilog 中还有其他一些变量类型，如bit、byte、logic等，它们的具体用法和特点可能略有不同。在实际设计中，可以根据需要选择和使用适当的变量类型来实现设计。&lt;/p&gt;
&lt;h2 id="数值表示"&gt;数值表示&lt;a class="anchor" href="#%e6%95%b0%e5%80%bc%e8%a1%a8%e7%a4%ba"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;verilog是面向数字电路的编程语言，数值的表示更侧重于二进制的方式，和C语言会有一些区别。&lt;/p&gt;
&lt;h3 id="数据种类"&gt;数据种类&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e7%a7%8d%e7%b1%bb"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Verilog HDL 有下列四种基本的值来表示硬件电路中的电平逻辑：&lt;/p&gt;
&lt;p&gt;0：逻辑 0 或 &amp;ldquo;假&amp;rdquo;&lt;br&gt;
1：逻辑 1 或 &amp;ldquo;真&amp;rdquo;&lt;br&gt;
x 或 X：未知&lt;br&gt;
z 或 Z：高阻&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;x 意味着信号数值的不确定，即在实际电路里，信号可能为 1，也可能为 0。&lt;/li&gt;
&lt;li&gt;z 意味着信号处于高阻状态，常见于信号（input, reg）没有驱动时的逻辑结果。例如一个 pad 的 input 呈现高阻状态时，其逻辑值和上下拉的状态有关系。上拉则逻辑值为 1，下拉则为 0 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数字声明时，合法的基数格式有 4 中，包括：十进制(&amp;rsquo;d 或 &amp;lsquo;D)，十六进制(&amp;lsquo;h 或 &amp;lsquo;H)，二进制（&amp;lsquo;b 或 &amp;lsquo;B），八进制（&amp;lsquo;o 或 &amp;lsquo;O）。数值可指明位宽，也可不指明位宽。&lt;/p&gt;</description></item></channel></rss>