【更新中】《硬件架构的艺术》笔记(二):时钟与复位
本章主要针对ASIC设计给出建议,独立于CAD工具以及工艺,主要针对模块设计和存储器接口。
同步设计
这是对时钟域控制最安全的方法,单个主时钟和单个主置位/复位信号驱动设计中所有时序器件。
避免使用行波计数器
行波计数器:用触发器的输出来驱动其他触发器的时钟输入,一般会存在问题。此时触发器的时钟并不是同步的,存在相位偏移,若该触发器链很长,延迟累积,会导致采样到错误的数据。
门控时钟
门控单元会导致时钟偏移,并会引入尖峰脉冲单元作用于触发器。可能仿真正常,综合出问题。
门控时钟作为低功耗设计的常用方法,通常由DC工具插入,在RTL除auto_clock_gating控制外,不要对时钟做任何处理
双边沿或混合边沿时钟
缺点:
- 复杂性增加:使用双边沿时钟会导致设计的复杂性增加。电路设计师必须确保在两个边沿上对信号的处理是同步的,并且要处理好时序问题。
- 同步复位问题:在使用同步复位的电路中,复位信号必须在时钟的某一边沿有效。双边沿时钟可能导致复位信号在不同边沿上产生不同的行为,从而增加了调试和验证的复杂性。
- 插入扫描链的困难:在测试过程中,插入扫描链时,双边沿时钟可能会导致信号路径的确认变得更加困难。因为在一个时钟周期内,信号在不同边沿上可能会有不同的状态,这使得测试和验证变得更加复杂。
- 信号路径的时序问题:由于信号在两个边沿上都可能被采样,设计者需要更加小心地确认信号路径的时序,确保在时钟的每个边沿上,所有相关信号都能在正确的时序下稳定。
不过有时候为了追求性能还是会使用双边沿,如DDR。
用触发器驱动另一个触发器的异步复位端
第二级输出同时受时钟边沿和复位信号影响,违反了同步设计原理,第二级触发器的时钟和复位之间存在潜在的竞争条件。
推荐的设计技术
要理解综合工具如何对不同的HDL编码风格和结果进行解释(硬件思维),其会影响设计门数和时序性
避免在设计中出现组合环路
在同步设计中,所有反馈回路都应包含寄存器,组合环路违背了同步设计原理。组合环路是不可综合的。
解决方法:引入一个触发器或者寄存器。
许多设计工具中,组合环路都会导致无休止的循环计算,所以EDA可能以不同的方式把组合环路打断,导致于原始设计意图不一致。
避免数字设计中的延迟链
延迟链:两个或多个单扇入单扇出的连续节点产生延迟。通常使用反相器链在一起。
使用场景:异步设计中,解决其他组合逻辑导致的竞争条件。
缺点:增加设计对操作环境的敏感性,降低设计的可靠度,增加移植到不同器件结构上的难度。
避免使用延时链,需要在设计中使用同步技术取代异步技术。
避免使用异步脉冲产生器
两种脉冲产生的方法(纯异步):
- 同一个信号接两输入与门或者或门,其中一个取反或者加延迟链,脉宽取决于两个信号相对延迟。(相当于人为增加毛刺宽度)
- 寄存器输出延迟后驱动同一个寄存器的异步复位端。
异步产生的脉冲宽度常常为综合和布局布线软件带来困难,实际脉宽只有在布局布线之后,布线和传播延迟已知时才能确定。所以在创建HDL时很难得到可靠的延迟值,且PVT(压力、体积、温度)环境,工艺脉宽都会变。除此之外,STA不能验证脉宽,验证工作会变得困难。
由于涉及对脉冲数量的控制,所以多脉冲结构会比脉冲产生器引起更多问题。多脉冲也增加了设计的频率。
推荐使用的同步脉冲产生器:
这个结构脉宽总是于时钟周期宽度相等,可以用时序分析验证,易于移植,独立于工艺。
always@(posedge clk) beginq2<=q1;q1<=d; end assign Pulse=q1&~q2;
这里有点问题,经过触发器后触发信号延后了一个周期,脉冲应该也延后一个周期。
类似的,可以在触发输入末端产生脉冲的脉冲产生器。
避免使用锁存器
图中电路X和Y同时拉高,形成了一个类似组合环路的结构,会使电路振荡。
原因:Latch的触发信号高电平时,输出对于输入来说是“透明的”。
- STA分析器通常会做出与锁存器透明有关的错误假设:要么发现伪路径,要么丢失真正的关键路径。
- 寄存器本身时序也是模糊的。这样的代码很难移植或者复用。
- 锁存器常常使电路不可测。
- FPGA是寄存器密集型电路,所以使用latch会占用更多资源。
- 不完整的if或者case会导致意料外的的latch的生成(因为组合电路要保持之前的值就得用latch)。
- 对于某些不支持Latch的FPGA,就会综合出组合环路代替Latch。
图中电路有锁存数据的能力,但是可能违背建立时间和保持时间的要求,而且很难发现。
Latch也并不是完全没用,事实上可以用Latch挪用周且或者借用时间来满足关键路径的要求。
避免使用双沿时钟
双沿时钟使得数据传输在给定的时钟速率下能达到双倍的吞吐率,但违背了同步电路原理,会引发以下问题:
等效同步电路:
上述等价是在时钟占空比为50%时成立的,如果时钟非对称占空比可能导致违背建立和保持时间,扫描路径也不能容易地通过触发器。
使用条件:对性能/速度要求很高、且无法承受使用等效同步电路在DFT和验证方面带来的额外开支。
优点
1、提升性能。
2、降低功耗。
时钟方案
内部产生的时钟
应尽量避免內部产生时钟。组合逻辑产生时钟会引入毛刺,也会引起时序方面的问题。同步时序电路数据的毛刺不会引起任何问题,而毛刺出现在时钟输入端或异步输入端就会产生明显的影响。
毛刺到达时钟输入端如果数据变化,会违背建立和保持时间。即使没有违背时序要求,寄存器也可能输出意料外的值。毛刺可能导致计数器增加额外的计数值,如图。
解决方法:组合逻辑输出增加一个寄存器输出,这个寄存器可以阻止组合逻辑产生的毛刺。
组合逻辑时钟也会增加时钟延迟,可能导致违背时序要求。
图中由于时钟偏移导致违背了建立时间。
一种减少时钟偏移的方法:将产生的时钟放到SoC中高扇出且低偏移值的时钟树上。
分频时钟
设计中要保证大多数时钟来自于PLL,避免异步时钟分频逻辑引起的许多问题。对主时钟分频时应使用同步计数器或状态机。
保证总是由寄存器直接产生分频时钟信号,不要使用组合逻辑避免毛刺和尖峰脉冲。
行波技术器
使用行波计数器对时钟进行幂为2的分频。
优点:使用的门更少。
缺点:对STA和综合工具带来麻烦,应尽量避免。
功耗较高的系统中很适合使用这种计数器,可以大量降低由逻辑或SoC所引起的峰值功耗。
需要处理多个频率标准的通信应用常常使用多个时钟。
使用多路时钟的前提:
同步时钟使能和门控时钟
优点:减少功耗。
缺点:不是同步设计,显著增加设计时间和验证的工作量。增加时钟偏移并对毛刺敏感,所以能导致设计失败。
可以使用同步的时钟使能,用纯同步的方法关闭时钟域,但这样时钟树一直保持反转,触发器保持内部活跃,无法降低功耗。
这里通过选通信号选择触发器输入,但是并没有真正意义上关闭触发器,只是使其值保持。
门控时钟方法学
同步设计中,功耗主要有三个部分:
对时钟门控能够大幅降低触发器的功耗,门控可以在时钟数的根部、末端或者两者之间的任何位置。
时钟数几乎消耗了整个芯片功耗的50%,所以最好在根部产生或者关闭时钟。
不带锁存器的门控时钟电路
使用与门、或门实现。为避免过早截断或产生多个时钟脉冲、应强制要求使能在时钟上升沿到下降沿一直保持常量。该限制使得基于单时钟触发器的设计中不适合使用不含锁存器的门控时钟。(因为对使能信号有较高的要求)
图中为过早截断的情况。
基于锁存器的门控时钟电路
使用锁存器就可以使门控时钟电路不需要满足上面的条件了。
使用与门控制上升沿有效的时钟,反之使用或门控制。
这个电路在使能关闭时为低电平,当打开时便不会漏掉下降沿。
使用这项技术时,使能信号必须在半时钟周期内产生。(锁存器只在半个时钟周期内具有锁存功能)
要保证设计中所有时钟能同时使能以便DFT,可以再加一个或门。
该电路还是存在一个不可忽略的缺点,产生使能信号逻辑的延迟(Latch延迟)和时钟到达“与”门的延迟非对齐时,会产生毛刺,如下图所示(情况一):
情况一:clock_B延迟大于Latch延迟,第一个时钟周期出现毛刺
情况二:clock_B超前于clock(skew<0),此时在最后一个时钟周期出现毛刺。
基于寄存器的门控时钟电路
基于寄存器的门控时钟电路使用寄存器缓存EN,然后再与CLK_B相与,得到GATED_CLK,电路图如下所示:
该电路的时序图如下所示,由于EN由寄存器锁存输出,EN1和CLK_B可认为是同步的,所以不存在“基于锁存器的门控时钟电路”的缺点。
实际使用门控时钟电路
基于以上分析,基于寄存器的门控时钟电路在性能上是最优的,理论上实际芯片应该使用该策略进行寄存器级的门控时钟以降低功耗,但实际芯片中使用的确是“基于锁存器的门控时钟电路”,原因如下:
- 芯片设计一般要求时钟门控率在95%以上(甚至98%以上),芯片中大量的寄存器需要门控时钟单元,而锁存器的面积仅为寄存器的1/2(甚至更小),所以从面积角度考虑会使用“基于锁存器的门控时钟电路”。
- “基于锁存器的门控时钟电路”毛刺问题:大多数ASIC生产厂商都提供“门控时钟单元”作为标准单元库的一部分,所以Latch的延迟和CLK_B的延迟问题可以由厂商解决。
门控信号
特殊部分使用门控信号提高能效。(感觉这里的意思就是减少组合逻辑的功耗)
重组数据路径以减少转换传播
把容易产生毛刺或者会经常翻转电平的电路放在电路后级,可以减少转换传播从而降低功耗。
复位信号的设计策略
用同步复位进行设计
使用同步复位会出现的问题:综合工具无法分辨数据信号和复位信号,如下图所示,两个电路功能一样,但是下面的电路如果load信号为X,触发器便会停在不定态。可以使用编译指令告诉指定的信号为复位信号,综合工具就会使该信号尽可能接近触发器,防止初始化的问题发生。(将这些指令加入RTL代码中以避免重新综合)
使用同步复位的优点
- 保证电路100%同步。
- 同步复位会综合为更小的触发器,特别是复位信号被触发器输入逻辑门控(如上图)。
- 确保复位只发生在有效时钟沿,过滤掉毛刺。
- 一些设计中复位由内部产生,这样的设计中使用同步复位信号,可以将时钟间的复位毛刺过滤掉。
使用同步复位的缺点
- 不是所有ASIC库中都带有内置的同步复位触发器,很容易把复位逻辑综合到触发器本身之外。
- 可能需要一个脉冲展宽器,保证复位信号出现在时钟有效沿。多时钟设计中必须考虑这个问题。
- 复位经过组合逻辑产生就会存在潜在的问题。
- 在复位信号发出时,时钟可能关闭,这时只能使用异步复位,并在时钟恢复前移除复位信号。
有三态就需要oe立即动作适合使用异步复位,下面同步复位信号也可以直接做到立即撤销使能,且可以简化时序分析。
使用异步复位进行设计
异步复位没有额外的路径,比同步复位更简单。
使用异步复位的优点
- 器件库有带异步复位的触发器,就能保证数据路径上是干净的。不会引入额外的逻辑门和额外的延时,保证了没有任何复位信号加在数据路径上。
- 不管有没有时钟都能复位。综合工具能自动判断异步复位无需加入任何综合参数。
使用异步复位的缺点
- DFT时,异步复位引脚若不能直接被IO驱动,就必须将异步复位电路和复位驱动器断开保证DFT的正确。
- 在触发器时钟有效沿附近释放,触发器就会进入亚稳态,复位状态就会丢失。
- 复位信号毛刺会引发伪复位,需要设计毛刺过滤器。这个问题可以考虑使用同步复位。
- 复位树应是时间可控的,以保证复位能在一个时钟周期内释放。解决方法:使用分布式异步复位同步触发器(这种异步复位方法将复位同步器放置在设计的每个层次结构中。)
带异步复位和异步置位的触发器
这段代码能正确地综合成实际的器件,但是在仿真时会有问题,因为always事件会只在敏感事件的有效边沿触发。
图中只对1和2时间触发,3和4由于不是敏感事件所以不会触发。
正确的仿真模型,应该在set_n在rst_n前面撤走时,将输出置为1
移除异步复位的问题
移除系统中的异步复位会使芯片进入不稳定的未知状态。同步复位时,复位信号的前沿和尾沿必须远离时钟的有效边沿。
两个问题:
1、违背复位恢复时间。复位恢复时间类似于建立时间,复位信号撤离应在时钟有效沿前一段时间到达,否则可能导致寄存器数据输出出现信号完整性问题或者亚稳态问题。
2、复位移除会在不同时序元件的不同周期内发生。异步复位移除传播延迟可能导致某些寄存器或者触发器提前退出复位状态。
复位同步器
这是确保正确移除复位最常使用的方法。没有复位同步器,即使仿真时复位能正常工作,最终系统中的异步复位信号仍然是无效的。
复位撤销后,典型情况下需要两个时钟上升沿来同步移除主复位信号。两级的主要目的就是为了消除亚稳态。
第一级可能的亚稳态是因为不满足复位恢复时间。
第二个触发器不会出现恢复亚稳态问题,因为移除复位时,触发器输入输出都为低电平。
总的复位分布时间:
过滤复位毛刺
异步复位对毛刺很敏感。
可以将复位信号和延迟后的复位信号相或过滤毛刺。
复位输入引脚也必须是施密特触发器引脚才有助于毛刺过滤。(施密特触发器:即滞回比较器,有两个判决电平,起到了减小毛刺的作用)
延时使用提供的宏单元或者在优化后的已综合设计中手动加入延时,如加多个较慢的缓冲器。缺点:延迟会随温度电压工艺变化,需要保证在所有PVT环境中都能满足设计要求。