minor update to post josh-verilog

This commit is contained in:
2023-07-09 10:52:38 +08:00
parent 5a9e7370ef
commit 8c57cf87b9
5 changed files with 871 additions and 287 deletions
+785 -201
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -12,7 +12,7 @@
"version": "6.3.0" "version": "6.3.0"
}, },
"dependencies": { "dependencies": {
"@next-theme/plugins": "^8.17.0", "@next-theme/plugins": "^8.17.1",
"hexo": "^6.3.0", "hexo": "^6.3.0",
"hexo-abbrlink": "^2.2.1", "hexo-abbrlink": "^2.2.1",
"hexo-deployer-git": "^4.0.0", "hexo-deployer-git": "^4.0.0",
@@ -29,11 +29,11 @@
"hexo-related-posts": "^1.5.1", "hexo-related-posts": "^1.5.1",
"hexo-renderer-ejs": "^2.0.0", "hexo-renderer-ejs": "^2.0.0",
"hexo-renderer-pandoc": "^0.4.0", "hexo-renderer-pandoc": "^0.4.0",
"hexo-renderer-stylus": "^2.1.0", "hexo-renderer-stylus": "^3.0.0",
"hexo-server": "^3.0.0", "hexo-server": "^3.0.0",
"hexo-tag-cloud": "2.1.*", "hexo-tag-cloud": "2.1.*",
"hexo-theme-landscape": "^1.0.0", "hexo-theme-landscape": "^1.0.0",
"hexo-theme-next": "^8.17.0", "hexo-theme-next": "^8.17.1",
"hexo-word-counter": "^0.1.0" "hexo-word-counter": "^0.1.0"
} }
} }
@@ -20,7 +20,7 @@ toc:
expand_all: true expand_all: true
max_depth: 4 max_depth: 4
abbrlink: 460433dd abbrlink: 460433dd
description: 本文阐述了 HDL 语言/设计方法的基本概念。主要介绍了数字系统建模方法的演变,引入了 HDL 语言的基本概念,对 Verilog HDL 和 VHDL、Verilog HDL 和 C 的联系与区别进行了说明,在最后引入了 HDL 的设计和验证流程,并对各个流程进行了简单介绍。 description: 本文阐述了 HDL 语言/设计方法的基本概念。主要介绍了数字系统建模方法的演变,引入了 HDL 语言的基本概念,对 Verilog HDL 和 VHDL、Verilog HDL 和 C 的联系与区别进行了说明,最后引入了 HDL 的设计和验证流程,并对各个流程进行了简单介绍。
--- ---
# 1. 设计方法的变迁<a id="toc.1"></a> # 1. 设计方法的变迁<a id="toc.1"></a>
@@ -29,11 +29,11 @@ description: 本文阐述了 HDL 语言/设计方法的基本概念。主要介
<!-- more --> <!-- more -->
随着数字电路系统的不断发展,系统的逻辑复杂度与规模日益增加,数字系统的设计方法也随之不断演进。早期简单的门逻辑设计阶段,EDA 工具应用范围十分有限,工程师们习惯于使用**{% label prime@卡诺图 %}**简化设计,然后通过面包板等实验系统验证设计;系统相对复杂后,工程师们借助 EDA 工具通过原理图描述数字系统。 随着数字电路系统的不断发展,系统的逻辑复杂度与规模日益增加,数字系统的设计方法也随之不断演进。在早期简单的门逻辑设计阶段,EDA(Electronic Design Automation,电子设计自动化)工具应用范围十分有限,工程师们习惯于使用**{% label prime@卡诺图 %}**简化设计,然后通过面包板等实验系统验证设计;系统相对复杂后,工程师们借助 EDA 工具通过原理图描述数字系统。
{% note default %} {% note default %}
原理图由元件库中的元件构成,使用 EDA(Electronic Design Automation,电子设计自动化)工具可以对原理图进行仿真并分析其性能。 原理图由元件库中的元件构成,使用 EDA 工具可以对原理图进行仿真并分析其性能。
{% endnote %} {% endnote %}
@@ -41,7 +41,7 @@ description: 本文阐述了 HDL 语言/设计方法的基本概念。主要介
使用 HDL 语言,可以从算法、系统级(System Level)、功能模块级(Functional Model Level)、行为级(Behavioral Level)、寄存器传输级(RTL, Register Transfer Level)、门级(Gate Level)到开关级(Switch Level)等不同层次描述数字电路系统,然后通过 EDA 工具综合、仿真并实现该系统。可以说 HDL 语言的出现是数字系统设计方法的一个重大飞跃。 使用 HDL 语言,可以从算法、系统级(System Level)、功能模块级(Functional Model Level)、行为级(Behavioral Level)、寄存器传输级(RTL, Register Transfer Level)、门级(Gate Level)到开关级(Switch Level)等不同层次描述数字电路系统,然后通过 EDA 工具综合、仿真并实现该系统。可以说 HDL 语言的出现是数字系统设计方法的一个重大飞跃。
数字电路系统设计方法的另一个重大飞跃是随着 EDA 工具的不断推陈出新发生的。早期 ASIC 和 PLD 设计时,人们需要直接描述 CMOS 的开关电路或门级电路,其设计量庞大,仿真速度也非常慢,像当今系统门数量为千万门级的 FPGA 用开关级或门级方法描述在当时是不可想象的。这时人们就希望能够使用 HDL 直接从更高的层次描述电路,然后使用 EDA 工具自动将高层次的 HDL 电路描述解析到门级,这些将大大节约设计与仿真时间,这个**{% label prime@从高层次的电路描述通过 EDA 工具解析到门级等低层次的电路描述的过程就叫“综合”(Synthesize),或者逻辑综合 %}**。 数字电路系统设计方法的另一个重大飞跃是随着 EDA 工具的不断推陈出新发生的。早期 ASIC 和 PLD 设计时,需要直接描述 CMOS 的开关电路或门级电路,其设计量庞大,仿真速度也非常慢,用开关级或门级方法描述如当今门数量为千万门级的 FPGA 在当时是不可想象的。这时人们就希望能够使用 HDL 直接从更高的层次描述电路,然后使用 EDA 工具自动将高层次的 HDL 电路描述解析到门级,这些将大大节约设计与仿真时间,这个**{% label prime@从高层次的电路描述通过 EDA 工具解析到门级等低层次的电路描述的过程就叫“综合”(Synthesize),或者逻辑综合 %}**。
{% note default %} {% note default %}
@@ -95,7 +95,7 @@ Verilog 语言是根据 C 语言发明而来的,因此 Verilog 具备了 C 语
2. HDL 语言的本质 2. HDL 语言的本质
硬件描述语言(HDL)同软件语言(如 C、C++ 等)是有本质区别的。Verilog 作为硬件描述语言,**它的本质作用在于描述硬件**。Verilog 虽然采用了 C 语言形式,但是它的最终描述结果是芯片内部的实际电路。所以评判一段 HDL 代码优劣的最终标准是其描述并实现的硬件电路的性能(包括面积和速度两个方面)。评价一个设计的代码水平较高,仅仅是说这个设计由硬件向 HDL 代码这种表现形式转换得更流畅、合理。而一个设计的最终性能更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。 硬件描述语言(HDL)同软件语言(如 C、C++ 等)是有本质区别的。Verilog 作为硬件描述语言,**它的本质作用在于描述硬件**。Verilog 虽然采用了 C 语言形式,但是它的最终描述结果是芯片内部的实际电路。所以评判一段 HDL 代码优劣的最终标准是其描述并实现的硬件电路的性能(包括**面积**和**速度**两个方面)。评价一个设计的代码水平较高,仅仅是说这个设计由硬件向 HDL 代码这种表现形式转换得更流畅、合理。而一个设计的最终性能更大程度上取决于设计工程师所构想的硬件实现方案的效率以及合理性。
{% note warning %} {% note warning %}
@@ -105,7 +105,7 @@ Verilog 语言是根据 C 语言发明而来的,因此 Verilog 具备了 C 语
3. Verilog 与 C 的结合 3. Verilog 与 C 的结合
Verilog 毕竟是硬件描述语言,在抽象层次上比 C 语言要差一些,语法不如 C 灵活,例如文件输入和输出方面,Verilog 的功能显然不如 C。为了克服 Verilog 高级抽象的缺陷,Verilog 的设计者们发明了 PLI。PLI 可以在仿真器中将 C 语言的程序和 Verilog 的程序互相通信,或者在 Verilog 中调用 C 语言的函数库,这样就大大扩展了 Verilog 语言的灵活性和高层次抽象的能力。开发时,一方面,硬件设计者使用 Verilog 进行硬件建模;另一方面,验证工程师却常常使用 C 来编写测试向量,然后通过 Verilog 的 PLI 将 Verilog 和 C 联系起来。这样,C 语言就很好地弥补了 Verilog 高层次建模的缺陷。 Verilog 毕竟是硬件描述语言,在抽象层次上比 C 语言要差一些,语法不如 C 灵活,例如文件输入和输出方面,Verilog 的功能显然不如 C。为了克服 Verilog 高级抽象的缺陷,Verilog 的设计者们发明了 PLI(Programming Language Interface)。PLI 可以在仿真器中将 C 语言的程序和 Verilog 的程序互相通信,或者在 Verilog 中调用 C 语言的函数库,这样就大大扩展了 Verilog 语言的灵活性和高层次抽象的能力。开发时,一方面,硬件设计者使用 Verilog 进行硬件建模;另一方面,验证工程师却常常使用 C 来编写测试向量,然后通过 Verilog 的 PLI 将 Verilog 和 C 联系起来。这样,C 语言就很好地弥补了 Verilog 高层次建模的缺陷。
# 3. HDL 的设计与验证流程<a id="toc.3"></a> # 3. HDL 的设计与验证流程<a id="toc.3"></a>
@@ -155,8 +155,8 @@ RTL 级综合指 **{% label prime@将 RTL 级 HDL 语言翻译成由与、或、
# 参考文献 # 参考文献
EDA 先锋工作室. *轻松成为设计高手——Verilog HDL 实用精解.* 北京航空航天大学出版社, 2012. EDA 先锋工作室. _轻松成为设计高手——Verilog HDL 实用精解._ 北京航空航天大学出版社, 2012.
[Part 3——描述方式和设计层次的 5. 设计层次]: https://josh-gao.top/posts/fd117896.html#toc.5 [Part 3——描述方式和设计层次的 5. 设计层次]: https://josh-gao.top/posts/fd117896.html#toc.5
[^1]: 最新的 Verilog HDL标准为 IEEE 1364-2005。 [^1]: 最新的 Verilog HDL标准为 [IEEE 1364-2005](https://ieeexplore.ieee.org/document/1620780)。
@@ -63,13 +63,13 @@ EDA 行业的先行者们发明了 Verilog 硬件描述语言,其最根本的
**这些电路单元都是同时并行工作的,相互之间并没有先后顺序关系,这一点与软件设计程序很不一样。** **这些电路单元都是同时并行工作的,相互之间并没有先后顺序关系,这一点与软件设计程序很不一样。**
下面具体分析 [HelloVlog 模块](#HelloVlog) 的电路功能。源代码如下。 下面具体分析 [HelloVlog 模块](#HelloVlog) 的电路功能,代码如下。
<a id="HelloVlogCode"></a> <a id="HelloVlogCode"></a>
``` verilog HelloVlog.v ``` verilog HelloVlog.v
// 编译指令, 定义时间单位和时间精度 // 编译指令, 定义时间单位和时间精度
`timescale 1ns/100p // 每个时间单位是1ns, 仿真精度是100ps `timescale 1ns / 100ps // 每个时间单位是1ns, 仿真精度是100ps
// module名 + 端口列表 // module名 + 端口列表
module HelloVlog( clk, rst_n, A_in, B_in, sel, A_xor_out, B_xor_out ); module HelloVlog( clk, rst_n, A_in, B_in, sel, A_xor_out, B_xor_out );
@@ -217,7 +217,7 @@ endmodule
在 [Part 3——描述方式和设计层次][]中会详细介绍 Verilog 语言中的这 3 种描述方式。 在 [Part 3——描述方式和设计层次][]中会详细介绍 Verilog 语言中的这 3 种描述方式。
# 3. Verilog 的基本词法<> # 3. Verilog 的基本词法
1. Verilog HDL 是一种**大小写敏感**的语言,这一点与 VHDL 不同,因此在书写的时候要格外注意。在 Verilog 语言中,**所有的关键字(又叫保留字)都为小写**。Verilog 的内部信号名(或称为标识符)使用大写和小写都可以。标识符可以是字母、数字、`$`(美元符号)和 `_`(下划线)任意组合,只要**第一个字符是字母或者下划线**即可。 1. Verilog HDL 是一种**大小写敏感**的语言,这一点与 VHDL 不同,因此在书写的时候要格外注意。在 Verilog 语言中,**所有的关键字(又叫保留字)都为小写**。Verilog 的内部信号名(或称为标识符)使用大写和小写都可以。标识符可以是字母、数字、`$`(美元符号)和 `_`(下划线)任意组合,只要**第一个字符是字母或者下划线**即可。
@@ -593,7 +593,7 @@ end
在下一小节中,将引入“驱动”和“赋值”两个概念,深入探讨两种变量的含义。 在下一小节中,将引入“驱动”和“赋值”两个概念,深入探讨两种变量的含义。
## 7.4. 驱动和赋值<a id>="toc.7.4"</a> ## 7.4. 驱动和赋值<a id="toc.7.4"></a>
为了更清楚地描述寄存器和线网变量的概念,将以上述[实例代码](#HelloVlogCode)中的语句来说明。首先,引入 Verilog 语言中两个重要的概念:驱动(Driving)和赋值(Assigning)。 为了更清楚地描述寄存器和线网变量的概念,将以上述[实例代码](#HelloVlogCode)中的语句来说明。首先,引入 Verilog 语言中两个重要的概念:驱动(Driving)和赋值(Assigning)。
@@ -687,7 +687,7 @@ parameter xor_delay = 4;
- `begin ... end`:顺序语句组; - `begin ... end`:顺序语句组;
- `fork ... join`:并行语句组。 - `fork ... join`:并行语句组。
在 `begin ... end` 中存在的语句,按照 Veilog 的语义,应该是顺序执行的。而在 `fork ... join` 中的语句,则是并行执行的。 在 `begin ... end` 中存在的语句,按照 Verilog 的语义,应该是顺序执行的。而在 `fork ... join` 中的语句,则是并行执行的。
相比较顺序运行的事物,并行的事物比较难以理解和建模。同时,用于仿真的计算机是串行执行的,而 Verilog 语言本身的语义是用计算机进行模拟的语义,是用一种串行的语义来模拟并行的硬件。 相比较顺序运行的事物,并行的事物比较难以理解和建模。同时,用于仿真的计算机是串行执行的,而 Verilog 语言本身的语义是用计算机进行模拟的语义,是用一种串行的语义来模拟并行的硬件。
@@ -178,7 +178,7 @@ assign #(4:5:6, 3:4:5) A_xor_wire = eq0 ^ eq1;
表示上升延时的 `min:typ:max` 为 `4:5:6`,下降延时的 `min:typ:max` 为 `3:4:5`。 表示上升延时的 `min:typ:max` 为 `4:5:6`,下降延时的 `min:typ:max` 为 `3:4:5`。
需要注意的是,在连续赋值语句中的延时具有硬件电路中惯性延时的特性。也就是说,**任何小于其延时的信号变化脉冲将被滤除掉,不会体现在输出端口上**。关于这部分内容会在后续详细描述。 需要注意的是,在连续赋值语句中的延时具有硬件电路中惯性延时的特性。也就是说,**任何小于其延时的信号变化脉冲将被滤除掉,不会体现在输出端口上**。
另外,`assign` 语句中的延时特性通常是被逻辑综合工具忽略的。因为综合工具要将 Verilog 语言模型综合成逻辑电路,而逻辑电路的延时是由基本的单元库和走线延时决定的。用户无法对逻辑单元指定延时,但是,用户可以在综合和实现工具中加时序约束,让工具尽量满足设计的时序要求。 另外,`assign` 语句中的延时特性通常是被逻辑综合工具忽略的。因为综合工具要将 Verilog 语言模型综合成逻辑电路,而逻辑电路的延时是由基本的单元库和走线延时决定的。用户无法对逻辑单元指定延时,但是,用户可以在综合和实现工具中加时序约束,让工具尽量满足设计的时序要求。
@@ -710,7 +710,7 @@ Verilog 作为硬件描述语言,最重要的特性就是其设计层次比较
高级编程语分为3大类: 高级编程语分为3大类:
- `if ... else` 语句; - `if ... else` 语句;
- case语句; - `case` 语句;
- 循环语句:`forever`、`repeat`、`while`、`for`。 - 循环语句:`forever`、`repeat`、`while`、`for`。
下面将逐一介绍。 下面将逐一介绍。
@@ -1405,7 +1405,7 @@ Verilog 支持不同设计层次的混描述。
# 参考文献 # 参考文献
EDA 先锋工作室. *轻松成为设计高手——Verilog HDL 实用精解.* 北京航空航天大学出版社, 2012. EDA 先锋工作室. _轻松成为设计高手——Verilog HDL 实用精解._ 北京航空航天大学出版社, 2012.
[Part 2——Verilog 语言基础]: https://josh-gao.top/posts/fd2ca242.html [Part 2——Verilog 语言基础]: https://josh-gao.top/posts/fd2ca242.html
[Part 2——Verilog 语言基础的 2.2 3 种描述方法]: https://josh-gao.top/posts/fd2ca242.html#toc2.2 [Part 2——Verilog 语言基础的 2.2 3 种描述方法]: https://josh-gao.top/posts/fd2ca242.html#toc2.2