review josh-verilog-4, change hyperref styles

This commit is contained in:
2023-04-17 19:46:59 +08:00
parent 5f2488bfa9
commit e50c0bcfcc
6 changed files with 302 additions and 265 deletions
+18 -18
View File
@@ -25,7 +25,7 @@ description: Verilog 语言可以用多种方式来描述硬件,同时,使
# 1. 描述方式
在[《Part 2——Verilog 语言基础》的第 3 小节][]中己经介绍过,Verilog 语言有 3 种最基本的描述方式.
在 [Part 2——Verilog 语言基础][]中己经介绍过,Verilog 语言有 3 种最基本的描述方式.
- 数据流描述,采用 `assign` 连续赋值语句;
- 行为描述,使用 `always` 语句或 `initial` 语句块中的过程赋值语句;
@@ -63,7 +63,7 @@ assign #1 A_xor_wire = eq0 ^ eq1;
1. **连续驱动**
在[《Part 2——Verilog 语言基础》的 7.4 驱动和赋值][]部分,已经解释了驱动和赋值之间的微妙区别。
在 [Part 2——Verilog 语言基础的 7.4 驱动和赋值][]部分,已经解释了驱动和赋值之间的微妙区别。
连续赋值语句是连续驱动的。也就是说,任何时刻输入的任何变化都将导致该语句的重新计算。
@@ -71,7 +71,7 @@ assign #1 A_xor_wire = eq0 ^ eq1;
由于仿真器中不会存储连续赋值语句中被赋值的变量值,因此该变量是线网类型(Net),不能是寄存器类型。需要记住,只有线网类型的变量才可以在 `assign` 语句中被赋值。
另外,线网类型的变量可以被多重驱动,也就是说,可以在多个连续赋值语句中驱动同一个线网。在 [2.4 驱动源线网](#drive)中将进一步介绍。但是,寄存器变量就不同了,它不能被不同的行为进程(例如 `always` 语句块)驱动。
另外,线网类型的变量可以被多重驱动,也就是说,可以在多个连续赋值语句中驱动同一个线网。在 [2.4 驱动源线网](#toc.2.4)小节中将进一步介绍。但是,寄存器变量就不同了,它不能被不同的行为进程(例如 `always` 语句块)驱动。
3. **使用 `assign` 对组合逻辑建模**
@@ -182,7 +182,7 @@ assign #(4:5:6, 3:4:5) A_xor_wire = eq0 ^ eq1;
另外,`assign` 语句中的延时特性通常是被逻辑综合工具忽略的。因为综合工具要将 Verilog 语言模型综合成逻辑电路,而逻辑电路的延时是由基本的单元库和走线延时决定的。用户无法对逻辑单元指定延时,但是,用户可以在综合和实现工具中加时序约束,让工具尽量满足设计的时序要求。
## 2.4. 驱动源线网<a id="drive"></a>
## 2.4. 驱动源线网<a id="toc.2.4"></a>
下面分为几种线网类型来描述当线网具有多重驱动源时的情况。
@@ -274,9 +274,9 @@ endmodule
![图 3-5 三态驱动总线电路](https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-11-30-josh-verilog-part-3/2020-11-30-josh-verilog-part-3-050-WireTri.png!sign){width=700px}
# 3. 行为描述<a id="03"><a>
# 3. 行为描述<a id="toc.3"><a>
在 [《Part 2——Verilog 语言基础》的第 2.2 小节][]中介绍过行为描述的概念。所谓行为描述,是指用语言描述电路的行为。行为描述的语句有两种:`initial` 和 `always` 语句。
在 [Part 2——Verilog 语言基础的 2.2 3 种描述方法][]中介绍过行为描述的概念。所谓行为描述,是指用语言描述电路的行为。行为描述的语句有两种:`initial` 和 `always` 语句。
## 3.1. 行为描述的语句格式
@@ -474,7 +474,7 @@ endmodule
要注意的是,目前多数综合工具还不支持 `wait` 语句,因此这个锁存器的功能只能在仿真时用,不能实现为具体的电路。
## 3.2. 过程赋值语句
## 3.2. 过程赋值语句<a id="toc.3.2"></a>
所谓过程赋值语句就是在 `initial` 和 `always` 语句块中的赋值语句。赋值对象只能是寄存器变量类型。右边的表达式可以是任意操作符的表达式。
@@ -697,7 +697,7 @@ end
在 `always` 以外的i变量和 `always` 里面定义的i变量属于**两个不同的变量,并不冲突**。它们在仿真的时候将占用两块不同的内存,类似于 C 语言中的静态局部变量。
## 3.4. 高级编程语旬
## 3.4. 高级编程语句<a id="toc.3.4"></a>
### 3.4.1. 为什么需要编程语句
@@ -1258,13 +1258,13 @@ Verilog 模块参数的这一特性非常有用,用户可以定义一个通用
使用上面这种参数直接带入法时,要注意一点,所有的参数都需要全部按顺序列出来,不能遗漏,也不能颠倒顺序,否则就容易对应不上。
# 5. 设计层次
# 5. 设计层次<a id=toc.5></a>
在前面几节中,介绍了 Verilog 的描述方式。
Verilog 语言是一种强大的硬件描述语言,可以支持多个设计层次。在这里将进行简单的介绍。
## 5.1. 系统级和行为级<a id=5.1></a>
## 5.1. 系统级和行为级<a id=toc.5.1></a>
Verilog 语言作为一种用户工具,提供给用户许多描述硬件的手段,如前面所述:数据流描述、行为描述(`always` 和 `initial` 语句)、结构化描述。同时,不同用户可以根据自己的需要,在不同抽象层次上对硬件进行描述。有如下设计层次金字塔供参考。
@@ -1282,7 +1282,7 @@ Verilog 语言作为一种用户工具,提供给用户许多描述硬件的手
4. 验证工程师:他们负责对设计的电路进行验证,他们编写的代码主要是用来产生激励,这些激励大部分需要的抽象层次更高,以使仿真的效率更高。然后在工具中对电路进行仿真,检查响应结果。这些代码不会实现为具体癭件,有些并不需要精确到时钟周期,而只是在软件的仿真工具中运行,实现一定的功能即可,称这种描述层次为行为级。
这里的行为级描述,不同于 [3. 行为描述](#03)中所述的“行为描述方式”。这里特指一种描述的抽象层次。
这里的行为级描述,不同于 [3. 行为描述](#toc.3)中所述的“行为描述方式”。这里特指一种描述的抽象层次。
下面举一个实例说明 RTL 级和行为级的区别,要实现的状态机一部分如[图 3-18](#fig.3-18) 所示。=
@@ -1361,7 +1361,7 @@ end
Verilog 设计电路最常用的设计层次就是 RTL 级。在 RTL 描述时,设计者需要关注寄存器的行为,其中保存着数据;同时需要关注寄存器和寄存器之间的组合逻辑功能,是否能满足功能需求和时序需求。RTL 级模型是严格精确到时钟周期的模型。
[《Part 4 —— RTL 概念与常用 RTL 建模》][]、[《Part 5 —— RTL 设计与编码指导》][]和[《Part 6—— 如何写好状态机》][]会重点介绍 RTL 设计的方法和技巧。
[Part 4 —— RTL 概念与常用 RTL 建模][]、[Part 5 —— RTL 设计与编码指导][]和[Part 6—— 如何写好状态机][]会重点介绍 RTL 设计的方法和技巧。
{% note info %}
@@ -1407,9 +1407,9 @@ Verilog 支持不同设计层次的混描述。
EDA 先锋工作室. *轻松成为设计高手——Verilog HDL 实用精解.* 北京航空航天大学出版社, 2012.
[《Part 2——Verilog 语言基础》的第 3 小节]: https://josh-gao.top/posts/fd117896.html#%E8%A1%8C%E4%B8%BA%E6%8F%8F%E8%BF%B0
[《Part 2——Verilog 语言基础》的 7.4 驱动和赋值]: https://josh-gao.top/posts/fd2ca242.html#%E9%A9%B1%E5%8A%A8%E5%92%8C%E8%B5%8B%E5%80%BC
[《Part 2——Verilog 语言基础》的第 2.2 小节]: https://josh-gao.top/posts/fd2ca242.html#%E7%A7%8D%E6%8F%8F%E8%BF%B0%E6%96%B9%E6%B3%95
[《Part 4 —— RTL 概念与常用 RTL 建模》]: https://josh-gao.top/posts/ecb88422.html
[《Part 5 —— RTL 设计与编码指导》]: https://josh-gao.top/posts/53b8b42e.html
[《Part 6—— 如何写好状态机》]: https://josh-gao.top/posts/d860a67e.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 语言基础的 7.4 驱动和赋值]: https://josh-gao.top/posts/fd2ca242.html#toc7.4
[Part 4 —— RTL 概念与常用 RTL 建模]: https://josh-gao.top/posts/ecb88422.html
[Part 5 —— RTL 设计与编码指导]: https://josh-gao.top/posts/53b8b42e.html
[Part 6—— 如何写好状态机]: https://josh-gao.top/posts/d860a67e.html