【《硬件架构的艺术》读书笔记】02 时钟和复位(1)
2.1 概述
这章主要内容是ASIC设计时的一些建议,这些建议独立于EDA和工艺,主要针对模块设计和存储器接口。
2.2 同步设计
同步设计特点:单个主时钟和单个主置位/复位信号驱动设计中所有时序器件。
同步设计:ASIC设计时域控制最安全的方法。
2.2.1 避免使用使用行波计数器。
行波计数器:将触发器输出作为其他触发器的时钟输入端,由于数据相对时钟会有延迟,所以不推荐这种使用方式。
2.2.2 门控时钟
门控单元会导致时钟偏移,并会引入尖峰脉冲单元作用于触发器。
可能仿真正常,综合出问题。
2.2.3 双边沿或混合边沿时钟
缺点:为使用同步复位和使用插入扫描链这样的测试方法带来麻烦,增加了确认关键信号路径的难度。
不过有时候为了追求性能还是会使用双边沿,如DDR。
2.2.4 用触发器驱动另一个触发器的异步复位端
第二级输出同时受时钟边沿和复位信号影响,违反了同步设计原理。
2.3 推荐的设计技术
要理解综合工具如何对不同的HDL编码风格和结果进行解释(硬件思维),其会影响设计门数和时序性能。
2.3.1 避免在设计中出现组合环路
所有反馈回路都应包含寄存器,组合环路违背了同步设计原理。
组合环路是不可综合的。
解决方法:引入一个触发器或者寄存器。
许多设计工具中,组合环路都会导致无休止的循环计算,所以EDA可能以不同的方式把组合环路打断,导致于原始设计意图不一致。
2.3.2 避免数字设计中的延迟链
延迟链:两个或多个单扇入单扇出的连续节点产生延迟。
使用场景:异步设计中,解决其他组合逻辑导致的竞争条件。
缺点:增加设计对操作环境的敏感性,降低设计的可靠度,增加移植到不同器件结构上的难度。
避免使用延时链,需要在设计中使用同步技术取代异步技术。
2.3.3 避免使用异步脉冲产生器
两种脉冲产生的方法(纯异步):
1、同一个信号接两输入与门或者或门,其中一个取反或者加延迟链,脉宽取决于两个信号相对延迟。(相当于人为增加毛刺宽度)
2、寄存器输出延迟后驱动同一个寄存器的异步复位端。
异步产生的脉冲宽度常常为综合和布局布线软件带来困难,实际脉宽只有在布局布线之后,布线和传播延迟已知时才能确定。所以在创建HDL时很难得到可靠的延迟值,且PVT环境,工艺脉宽都会变。且STA不能验证脉宽,验证工作会变得困难。
PVT环境:压力、体积、温度(Pressure-Volume-Temperature)。
这里多谐振荡器翻译成多振子有点怪怪的。
由于涉及对脉冲数量的控制,所以多脉冲结构会比脉冲产生器引起更多问题。多脉冲也增加了设计的频率。
推荐使用的同步脉冲产生器:
这个结构脉宽总是于时钟周期宽度相等,可以用时序分析验证,易于移植,独立于工艺。
always@(posedge clk) begin q2<=q1; q1<=d; end assign Pulse=q1&~q2;
不过感觉这里还是有点问题,经过触发器后触发信号延后了一个周期,脉冲应该也延后一个周期才对。
类似的,可以在触发输入末端产生脉冲的脉冲产生器。
2.3.4 避免使用锁存器
这是一个老生常谈的问题了,在其他的书里已经看到了很多次。
图中电路X和Y同时拉高,形成了一个类似组合环路的结构,会使电路振荡。原因:Latch的触发信号高电平时,输出对于输入来说是“透明的”。
STA分析器通常会做出与锁存器透明有关的错误假设:要么发现伪路径,要么丢失真正的关键路径。寄存器本身时序也是模糊的。这样的代码很难移植或者复用。
锁存器常常使电路不可测。
FPGA是寄存器密集型电路,所以使用latch会占用更多资源。
不完整的if或者case会导致意料外的的latch的生成(因为组合电路要保持之前的值就得用latch)。
对于某些不支持Latch的FPGA,就会综合出组合环路代替Latch。
图中电路有锁存数据的能力,但是可能违背建立时间和保持时间的要求,而且很难发现。
Latch也并不是完全没用,事实上可以用Latch挪用周且或者借用时间来满足关键路径的要求。
2.3.5 避免使用双边沿时钟
优点:给定时钟速率下达到两倍的吞吐量。
缺点:违反了同步电路的原理并将造成一系列的问题。
问题:
等效同步电路:
上述等价是在时钟占空比为50%时成立的,如果时钟非对称占空比可能导致违背建立和保持时间,扫描路径也不能容易地通过触发器。
使用条件:对性能/速度要求很高、且无法承受使用等效同步电路在DFT和验证方面带来的额外开支。
优点:
1、提升性能。
2、过高的时钟频率会给许多接口带来问题。
3、降低功耗。
除非等效同步电路无法完成所期望的性能时,设计人员才应该使用双边沿时钟。
这里补充一个芯片功耗公式:
第一项为动态功耗,与负载电容、供电电压的平方和工作频率成正比。
第二项为静态功耗主要是漏电带来的功耗。