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
@@ -509,7 +509,7 @@ case (var)
# 2. 同步设计原则和多时钟处理
## 2.1 同步设计原则<a name="0201"></a>
## 2.1 同步设计原则<a name="toc.2.1"></a>
同步设计是 PLD 和 ASIC 设计的最重要原则。本小节首先阐释为什么在 PLD 设计中要采用同步时序设计,然后重点论述同步时序设计的要点。
@@ -550,7 +550,7 @@ case (var)
- 同步时序电路的延迟。同步时序设计中电路延迟最常用的设计方法是用分频或倍频的时钟或者同步计数器完成所需延迟。换句话说,同步时序电路的延时被当作一个电路逻辑来设计。对于**比较大的和特殊定时要求的延时,一般用高速时钟产生一个计数器,根据计数器的计数,控制延时**;对于**比较小的延时,可以用 D 触发器打一下**,这种做法**不仅使信号延时了一个时钟周期,而且完成了信号与时钟的初次同步**,在输入信号采样或增加时序约束余量时使用。另外许多初学者用行为级(Behavioral Level)方法描述延时,如 `#5 a<= 4'b0101;` 这种行为级描述方法常用于仿真测试激励,但是**在电路综合时会被忽略、并不能起到延时作用**。
## 2.2 亚稳态
## 2.2 亚稳态<a id="toc.2.2"></a>
在后续笔记中会介绍异步时钟域转换的问题,在谈这个话题之前,先分析一下什么是亚稳态,以及如何避免。
@@ -593,7 +593,7 @@ case (var)
在早期逻辑电路图设计阶段,有一些设计者养成了手工加入 Buffer 或者非门调整数据延迟的习惯,从而保证本级模块的时钟对上级模块数据的建立、保持时间的要求。这些做法目前主要应用的场合有两种:一是使用分立逻辑元件(如 74 系列)搭建数字逻辑电路;另一种是在 ASIC 设计领域。**目前使用分立逻辑元件搭建数字逻辑电路的场合一般为系统复杂度相对较低,系统灵活性要求不高的场合。**在上述场合使用分立逻辑器件设计数字逻辑电路,由于可以使用的调整延时的手段相对有限,而且采用插入 Buffer 、数字延迟逻辑甚至两个非门等手段调整采样的 Setup 和 Hold 时间是可以接受的。而 ASIC 设计领域采用这种方法是以严格的仿真和约束条件作为强力支持的。
正如 [2.1 同步设计原则](#0201)所述,**使用组合逻辑方法产生延迟,容易产生毛刺**,而且这种设计方法的**时序余量较差**,一旦外界条件变换(环境试验,特别是高低温试验),采样时序就有可能完全紊乱,造成电路瘫痪。另外,一旦芯片更新换代,或者移植到其他器件族的芯片上,采样时延必须重新调整,电路的可维护性和继承性都很差。
正如 [2.1 同步设计原则](#toc.2.1)所述,**使用组合逻辑方法产生延迟,容易产生毛刺**,而且这种设计方法的**时序余量较差**,一旦外界条件变换(环境试验,特别是高低温试验),采样时序就有可能完全紊乱,造成电路瘫痪。另外,一旦芯片更新换代,或者移植到其他器件族的芯片上,采样时延必须重新调整,电路的可维护性和继承性都很差。
2. 盲目使用时钟正负沿调整数据采样
@@ -649,7 +649,7 @@ case (var)
在后面的几节中,将详细谈谈设计和代码风格。
# 4. 结构层次和模块划分
# 4. 结构层次和模块划分<a id="toc.4"></a>
## 4.1 结构层次化编码
@@ -822,7 +822,7 @@ endmodule
## 6.2 Ripple Counter
所谓 Ripple Counter,即行波计数器,其结构为:一组寄存器级连,每个寄存器的输出端接到下一级寄存器的时钟管脚,这种计数器常常用于异步分频电路。早期的 PLD 设计经常使用 Ripple Counter 以节约芯片资源。但是由于 Ripple Counter 是一种典型的异步时序逻辑,正如前面“[同步设计原则](#0201)”所述,异步时序逻辑会带来各种各样的时序问题,**在同步时序电路设计中必须严格避免使用 Ripple Counter**。
所谓 Ripple Counter,即行波计数器,其结构为:一组寄存器级连,每个寄存器的输出端接到下一级寄存器的时钟管脚,这种计数器常常用于异步分频电路。早期的 PLD 设计经常使用 Ripple Counter 以节约芯片资源。但是由于 Ripple Counter 是一种典型的异步时序逻辑,正如前面“[同步设计原则](#toc.2.1)”所述,异步时序逻辑会带来各种各样的时序问题,**在同步时序电路设计中必须严格避免使用 Ripple Counter**。
## 6.3 时钟选择
@@ -843,7 +843,7 @@ endmodule
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-12-05-josh-verilog-part-5/2020-12-05-josh-verilog-part-5-170-GatedClock.png!sign" width="800px" alt="门控时钟"/>
</div>
但是 Gated Clock 不是同步时序电路,其 Gating Logic(门控逻辑)会污染 Clock 的质量,通过控制门后会产生毛刺并使时钟的 Skew(偏斜)、Jitter(延时)等指标恶化。正如“[同步设计原则](#0201)” 一节所述,在同步时序电路中,应该尽量不使用 Gated Clock 。
但是 Gated Clock 不是同步时序电路,其 Gating Logic(门控逻辑)会污染 Clock 的质量,通过控制门后会产生毛刺并使时钟的 Skew(偏斜)、Jitter(延时)等指标恶化。正如“[同步设计原则](#toc.2.1)” 一节所述,在同步时序电路中,应该尽量不使用 Gated Clock 。
虽然有些材料指出当功耗成为主要矛盾时,可以使用门控时钟改进电路如[图 5-18](#fig.5-18) 所示的电路完成类似门控时钟的功能,但是笔者仍强烈建议在 PLD 设计中不要使用该图所示的门控时钟改进电路。虽然这个改进电路已经在较大程度上解决了门控电路产生的毛刺,但是请读者注意,这个电路工作的前提是时钟源Clock 的占空比(Duty Cycle)是非常理想的 50%,如果时钟的占空比不能保证 50%,则会产生许多有规律的毛刺信号。另外这个电路还有一个前提,那就是 Clock 与 Enable 信号的不布线 Skew 为 0,否则也会造成宽度为 Skew 的毛刺。
@@ -865,7 +865,7 @@ endmodule
<img src="https://josh-blog-1257563604.cos.ap-beijing.myqcloud.com/img/2020-12-05-josh-verilog-part-5/2020-12-05-josh-verilog-part-5-190-EnableSynchronization.png!sign" width="500px" alt="同步使能端"/>
</div>
# 7. RTL 代码优化技巧
# 7. RTL 代码优化技巧<a id="toc.7"></a>
## 7.1 使用 Pipelining 技术优化时序