时钟与复位,是块儿硬骨头

时钟与复位,是块儿硬骨头

思维导图:
在这里插入图片描述
做的比较简陋,让您见笑了。

时钟:

时钟,即clock信号,是由晶体经过激发产生的振荡电路。时钟参与着系统的启动、休眠,数据的读取、写入,信号的调制、解调,微波的发射、接收等一系列的工作。
如果说电源是系统的血液,那么时钟就是经脉,把整个身体打通,让所有组织联系在一起。
分类
时钟可以分为有源时钟和无源时钟两类。
所谓有源,就是在外供电源情况下,生成震荡信号,可以作为一个独立的模块。而无源的则是只有单独一个晶体,需要什么电路来产生震荡,是需要外部搭出来的。
通常,我们把有源的叫做晶振(Oscillator),把无源的叫做晶体(Crystal)。
更加详细的分类请参考上面的思维导图。
常见几种振荡电路简介
常见的振荡电路有RC振荡电路、LC振荡电路和晶体振荡电路。
RC振荡电路结构简单,但选频取决于RC的值,又因为器件都有自己的负载能力,太重的负载会导致烧毁元器件,因此RC振荡电路的频率不高,大约为1MHz以下。
LC振荡电路频率一般都高于1MHz。事实上,晶体振荡电路的等效电路就是LC振荡电路,LC振荡电路的频率几乎跟谐振网络的固有频率相等,Q值越大越接近。
VC-TCXO和RTC时钟都属于晶体振荡电路。它们的工作原理都一样,只不过VC-TCXO有一个VCONT管脚,用来调整变容二极管工作电压,即改变外接负载,微调振荡频率。射频动辄几百兆赫兹的信号,是以VC-TCXO为基准频率,通过锁相环电路倍频产生的。
最简单的RTC只需要四个器件:晶体、两个电容、一个反相器。反相器是集成在芯片内部的。所以外部电路就只有晶体和电容,如下图所示:
在这里插入图片描述
参考时序:何时使用晶体或时钟
第一个设计原则是理清硬件设计的参考时钟需求,并选择用于系统中处理器、FPGA、 ASIC、PHY、DSP 和其他组件的参考时钟类型。如果 IC 已集成振荡器和片上锁相环 (PLL)用于片内时序,那么通常可以使用石英晶体。石英晶体具有成本效益,因其优异 的相位噪声特性而被广泛使用,他们放在靠近 IC 的地方,以简化电路板布局。然而,晶 体的缺点之一是在整个温度范围内频率有显著变化,超出许多串化器/并化器(SerDes) 应用中高精度 ppm 等级的稳定性需求。在许多要求高稳定性的高速 SerDes 应用中,推荐 使用晶体振荡器(XO),因其可以确保比无源晶体更可靠的稳定性。
当需要多个参考频率时,通常使用时钟发生器和时钟缓冲器。在某些应用中, FPGA/ASIC 有多个时钟域用于数据通路、控制平面和存储控制器接口,需要多个特定参 考频率。如果 IC 不提供晶体输入接口,或者当 IC 需要与外部参考(同步源应用)同步时,又或者当所需高频参考值很难由晶体生成时,时钟发生器和缓冲器也是优先选择。
自由运行对比同步时钟树
一旦硬件设计确定下来,并且为部分器件选择了晶体,接下来的步骤就是为剩下的时钟选 择时序架构:自由运行或同步。对于需要一个或多个独立参考时钟,且没有任何特殊锁相 环或同步需求的应用来说,XO、时钟发生器和时钟缓冲器是理想选择。处理器、存储控 制器、SoC 和外围组件(例如,USB 和 PCI Express 转换器)通常使用 XO、时钟发生器 和时钟缓冲器组合,为自由运行和异步的应用提供参考时序。如果应用需要一到两个定时 源,XO 是最好的选择;而时钟发生器和缓冲器更适合同时需要多个独立时钟的应用。时钟发生器能够合成多个不同频率的时钟,但与由时钟缓冲器加上 XO组成的时钟树相比, 牺牲部分抖动性能。时钟缓冲器可以与 XO参考联合分配多个相同频率的时钟,并且为多 输出时钟树实现最低抖动。
同步时钟用于需要连续通信和网络级同步的应用,例如光传输网络(OTN)、 SONET/SDH、移动回程、同步以太网和 HD SDI 视频传输。以上应用需要发射器和接收 器在相同频率操作。同步所有的 SerDes 参考时钟到一个高精度网络参考时钟(例如, Stratum 3 或 GPS),保证所有节点同步。在这些应用中,基于低带宽 PLL 时钟提供漂移 和抖动滤波(抖动消除),以确保网络级同步。在网络线路卡 PLL 应用中,带有压控振 荡器(VCO)的专用抖动衰减时钟或分立 PLL 是 SerDes 定时首选的时钟解决方案。为了 获得最佳性能,抖动衰减时钟应放置在时钟树末端,直接驱动 SerDes 器件,时钟发生器 和缓冲器可为其他系统提供参考。
时钟抖动
时钟抖动是时序器件的一个关键指标,因为过多的时钟抖动会影响系统性能。有三种常见 的时钟抖动类型,并且在不同的应用中,某种抖动类型可能比另外两种更重要。
• 相邻周期间抖动是指任意两个相邻时钟周期之间,时钟周期的最大差异,通常测量 1000个时钟周期以上。
• 周期抖动是指在大量周期(通常为 10000 个时钟周期)中,实际周期与理想周期的最 大偏差。相邻周期间抖动和周期抖动在计算数字系统的建立和保持定时余量时有一定 作用,而且是 CPU和 SoC器件常见的性能系数。
• 相位抖动是高速 SerDes 应用的性能系数。他是噪声功率对信号总功率的比值,是通过 对时钟信号单边带相位噪声所在的偏离载波信号的频带范围进行积分计算而得。相位 抖动在 FPGA和高速 SerDes定时应用中非常关键,过度的相位抖动会增加高速串行接 口的位错误率。
在时钟树设计和器件选择期间,基于最大抖动性能来评估器件非常重要。一般的抖动规格 并不能确保在所有情况下(包括工艺、电压、温度和频率变化)皆能符合性能。除了额外 因素,最大抖动还包括更全面的规格。
此外,要特别注意确认时序器件数据手册上的抖动测试条件。时钟抖动性能在很多情况下 都会变化,包括器件配置、工作频率、信号格式、输入时钟转换速率、供电电源和电源噪声。要尽可能寻求完全符合指定抖动测试条件的器件,才能确保在更广的操作范围内工作。

复位

复位的目的
复位信号在数字电路里面的重要性仅次于时钟信号。对一个芯片来说,复位的主要目的是使芯片电路进入一个已知的,确定的状态。主要是触发器进入确定的状态。在一般情况下,芯片中的每个触发器都应该是可复位的。在某些情况下,当在高速应用程序中使用流水线触发器(移位寄存器触发器)时,为了实现更高的性能设计,可能会从某些触发器中消除复位。这种类型设计需要在复位激活期间,运行预先确定数量的时钟周期,以使ASIC处于已知的状态。
为什么需要复位呢?
复位可以使电路从确定的初始状态开始运行:
  上电复位:上电的时候,为了避免上电后进入随机状态而使电路紊乱,这个时候就需要上电复位。
  中间复位:有时候,要求电路从初始状态开始执行电路的功能,要对电路进行复位,让它从最初的状态开始运行。
复位可以使电路从错误状态回到可以控制的确定状态:
  如果电路发生了异常,比如状态不正常,中断异常,firmware程序跑飞,这个时候就可以对电路进行复位,让它从错误的状态回到一个正常的状态。
电路仿真时需要电路具有已知的初始值
在仿真的时候,信号在初始状态是未知状态(也就是所谓的x,不过对信号初始化之后的这种情况除外,因为仿真的时候对信号初始化就使信号有了初始值,这就不是x了)。
对于数据通路(数字系统一般分为数据通路和控制通路,数据通路一般是对输入的数据进行处理,控制通路则是对运行的情况进行操作),在实际电路中,只要输入是有效数据(开始的时候可能不是有效的),输出后的状态也是确定的;在仿真的时候,也是输入数据有效了,输出也就确定了。也就是说,初始不定态对数据通路的影响不明显
对于控制通路,在实际电路中,只要控制通路完备(比如说控制通路的状态机是完备的),即使初始状态即使是不定态,在经过一定的循环后,还是能回到正确的状态上;然而在仿真的时候就不行了,仿真的时候由于初始状态为未知态,控制电路一开始就陷入了未知态;仿真跟实际电路不同,仿真是“串行”的,仿真时控制信号的初始不定态会导致后续的控制信号结果都是不定态,也就是说,初始的不定态对控制通道是致命的
不需要复位的情况
复位信号很重要,但是并不是每一部分的电路都需要复位电路,一方面是复位电路也消耗逻辑资源、占用芯片面积,另一方面是复位信号会增加电路设计的复杂性(比如要考虑复位的策略、复位的布局布线等等)。
当某个电路的输出在任何时刻都可以不受到复位信号的控制就有正确的值时,比如说数据通路中的对数据进行处理的部分。在某些情况下,当流水线的寄存器(移位寄存触发器)在高速应用中时,应该去掉某些寄存器的复位信号以使设计达到更高的性能,因为带复位的触发器比不带复位的触发器更复杂,反应也更慢。

同步复位:顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用Verilog描述如下:

always @ (posedge clk) 
begin
 if (!Rst_n)
 ...
 end

异步复位:它是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下:

always @ (posedge clk or negedge Rst_n) 
begin
 if (!Rst_n)
 ...
 end

各自的优缺点:
1、总的来说,同步复位的优点大概有3条:
a、有利于仿真器的仿真。
b、可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高。
c、因为他只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺,抗干扰好。
他的缺点也有不少,主要有以下几条:
a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素。
b、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源。
完全同步复位:a.可能由于时钟的特性,捕获不到复位信号,b.可能耗费逻辑资源。
2、对于异步复位来说,他的优点也有三条,都是相对应的:
a、大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源。
b、设计相对简单。
c、异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口DEV_CLRn。
缺点:
a、在异步复位信号释放(release)的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。同步复位有同样的问题存在。
b、复位信号容易受到毛刺的影响。
一般都推荐使用异步复位,同步释放的方式,而且复位信号低电平有效。这样就可以两全其美了。其根本思想,也是将异步信号同步化。


以下补充内容源自公众号摸鱼范式,总结的的确很好,献出膝盖。
异步重置的最大问题是它们是异步的,在复位阶段和解复位阶段(复位撤离)都是异步的。复位阶段不是问题,解复位才是问题。如果在触发器的活动时钟边缘或附近释放异步复位,则触发器的输出可能变为亚稳态,这样电路的复位状态可能会丢失,解复位失败。
如下图所示, 异步复位信号复位解除时是和时钟信号完全异步的。
这种情况下由两个问题:复位恢复时间(reset recovery) 违例和复位解除时间(reset removal) 违例发生在不同的触发器的不同时钟周期
在这里插入图片描述
下面先解释一下两个概念:复位恢复时间(reset recovery time)和复位解除时间(reset removal time)
恢复时间(Recovery Time)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“下个时钟沿”来临之前变无效的最小时间长度。这个时间的意义是,如果保证不了这个最小恢复时间,也就是说这个异步控制信号的解除与“下个时钟沿”离得太近(但在这个时钟沿之前),没有给寄存器留有足够时间来恢复至正常状态,那么就不能保证“下个时钟沿”能正常作用,也就是说这个“时钟沿”可能会失效。
解除时间(Removal Time)是指异步控制信号(如寄存器的异步清除和置位控制信号)在“有效时钟沿”之后变无效的最小时间长度。这个时间的意义是,如果保证不了这个去除时间,也就是说这个异步控制信号的解除与“有效时钟沿”离得太近(但在这个时钟沿之后),那么就不能保证有效地屏蔽这个“时钟沿”,也就是说这个“时钟沿”可能会起作用。
换句话来说,如果你想让某个时钟沿起作用,那么你就应该在“恢复时间”之前是异步控制信号变无效,如果你想让某个时钟沿不起作用,那么你就应该在“解除时间”过后使控制信号变无效。如果你的控制信号在这两种情况之间,那么就没法确定时钟沿是否起作用或不起作用了,也就是说可能会造成寄存器处于不确定的状态。而这些情况是应该避免的。所以恢复时间和去除时间是应该遵守的
不满足复位恢复时间或者撤离时间,可能会导致亚稳态问题。(注意是可能)因为如果输出本身就是复位后的值,即使当前时钟沿不能判断是否复位,输出也是复位值,这时候就不会产生亚稳态,因为已经是复位态了。
不满足复位恢复时间或者撤离时间可能会导致不同FF复位状态不一致的问题。复位信号和时钟信号一样,通过复位网络到达各个触发器。复位网络具有非常大的扇出和负载,到达不同的触发器存在不同的延时,不满足复位恢复或者解除时间的情况下,就有可能在不同的触发器的不同时钟周期内进行解复位。注意,这里的假设条件是复位树和时钟树已经做成立平衡状态,不再考虑复位树和时钟树没做好的情况。
既然同步复位和异步复位都有问题,那么到底应该怎么复位呢?能不能即有同步复位和异步的优点,而没有同步复位和异步复位的缺点呢?小孩子才做选择,成年人就是我都要。所以解决方案就是: 异步复位同步释放。
异步复位同步释放
异步复位的同步释放电路也称为复位同步器。
规则:每个异步复位的电路,必须包含一个复位同步器。代码和电路如下:
在这里插入图片描述
复位和解复位都是通过pad_rst_n来实现的,第一级FF的输入是拉成高(固定为“1”),第二级的FF用来消除解复位时可能带来的的亚稳态。
为什么两级FF就不会出现亚稳态呢?第一级FF输入是1, 输出的reset值是0,而reset又是异步的,如果reset刚好在clock边沿附近,就会出现亚稳态。但是加上了第二级FF就不会出现亚稳态。这是因为第二级的FF的输入比第一个FF延时了一个cycle,这样第一个FF在解复位时候,即使有亚稳态,那么也只是影响下一个周期的Q1输出,下一个周期Q1可能为0也可能为1,但是当前Q1还是为低(0), 因为这时第一个FF还是复位状态。这样第二个FF当前周期的输入是0,复位输出也是0,所以能不能复位成功都不会改变输出为0,即当前周期不会产生亚稳态。下一个周期的Q1输出虽然可能是0也可能是1,但是已经稳定,是一个确定的值,所以第二个FF输出也是稳定的值。如下图所示:
在这里插入图片描述
(手画的,见谅)
异步复位的抖动或毛刺
由于异步复位和时钟无关,任何一个毛刺都可以引起复位。这是一个reset源的问题。下面的电路可以过滤毛刺,主要原理是把输入源与上它的延时来消除毛刺。
在这里插入图片描述
但是这并不是一个很完美的设计,主要原因是delay单元的实现,因为不同温度不同制程下,delay值可能会不同。
有的库里面包含Delay宏,有的没有;没有的话就需要手动增加delay或者插buffer,同时增加约束让delay不被综合掉。
同时rst_n 输入也必须是一个史密斯触发器pad,进一步消除抖动。
并不是所有的系统都需要增加防抖,要根据应用范围来判断。

复位树
复位树和时钟树一样应该引起重视,因为典型的数字电路中,reset的负载和clock的负载数量一般是相当的。不管是同步复位还是异步复位,对复位树都是有时序要求的。一个典型的复位树如下图所示:
在这里插入图片描述
时钟分布树和重置分布树之间的一个重要区别是时钟树需要紧密平衡分布重置之间的偏差(skew)。与时钟信号不同,只要与复位信号相关的延迟足够短,允许在一个时钟周期内传播所有复位负载,并且仍然满足所有目标寄存器和触发器的恢复时间,那么复位信号之间的偏差(skew)就不是关键。
另外一个需要考虑的问题是,时钟树和复位树之间的关系。到底用那个时钟来驱动复位树的FF呢?如果能够用分支clock来驱动master reset的FF那最好了,但是在大多数情况下,没有足够的时间让时钟脉冲遍历时钟树、时钟复位驱动触发器,然后让复位遍历复位树,所有这些都在一个时钟周期内完成。这种情况如下图所示:
在这里插入图片描述
为了能让reset到达所有逻辑的速度更快,更好的方式是用一个更早的clock来驱动reset ff,即用源时钟来驱动。必须进行Post layout timing分析,以保证复位同步器的FF不会出现setup/hold违例。通常情况下,两个tree之间详细的时序调整必须等到layout完成才能进行。电路结构如下图所示:
在这里插入图片描述
上述的复位树对同步复位树和异步复位树都是适用的。
同步复位树
对同步复位,一种技术是通过插入FF来实现复位树。这样的好处是,reset不需要在一个时钟周期内到达所有的FF。所以需要几个时钟才能把整个设计复位掉。每个模块都需要包含如下代码:
在这里插入图片描述
同步复位时钟树如下所示:
在这里插入图片描述
采用这种技术,同步复位信号可以像其他数据信号一样处理,设计中每个模块的timing分析都很容易,复位树的每个阶段都有合理的扇出。
异步复位树
对异步复位,是通过复位同步器来完成复位树的建立。即每个层级都加上一个异步复位同步器。如下图所示:
在这里插入图片描述
异步复位树和同步复位树有点相似,但是这里的异步复位同步器是两级的FF。这种异步复位树,复位时可以所有的FF都同时复位,但是解复位必须要几个cycle才能完成。
这种结构的问题就是,不同层级解复位的时间点可能是不一样的。如果设计要求整个芯片在同一个cycle来解复位,那么就需要对复位同步器做平衡设计,保证到达每个复位终点是同一个时钟。同步时钟树也存在这个问题。
使用这种结构的好处是,不用等到P&R之后才去手动调整timing,完全可以交给综合工具(DC/PT)去插入buffer。
在使用异步重置时,至关重要的是,设计人员要在DC和PT中使用设置为适当设置的适当变量,以确保从复位同步触发器的q-output驱动的异步复位得到缓冲(如果需要的话)和timed。有关这些设置的详细信息可以在SolvNet文章#901989[43]中找到。文章指出,DC和PT都可以并且将时间按照本地时钟进行异步复位输入,如果设置了以下变量:
在这里插入图片描述
这些设置应该是Synopsys的默认设置(只要确保它们是环境设置)。正确设置这些标志和使用分布式复位同步器后,就可以不用类似时钟树去构建缓冲复位树了。
多时钟域复位
对于多时钟域的设计,每个时钟域必须有自己单独的复位同步器和分布式复位树。这样才能保证reset能满足不用时钟域的reset recovery time。如下图所示:
在这里插入图片描述
对于多个时钟域的解复位顺序有两种情况:
大部分多时钟域的设计,解复位的顺序并没有特殊要求。即当前时钟域解复位的时间点,在另一个时钟域的精确时间点并不重要。通常来说,跨时钟域的设计,本身就会带来延时的不确定行。这种情况下,上面的单独建立不同时钟域的复位结构就足够了。
有些多时钟设计,复位解除必须按顺序进行。这种设计,可以使用优先级的复位结构如下所示:
在这里插入图片描述
这种结构,除了最高优先级的同步器输入是 tied 1, 其他的输入都是上一优先级的输出。
异步复位的DFT
在做DFT(可测性设计:在芯片设计阶段为了提高芯片的可测性,降低测试时间和测试成本而采用的电路设计技术)的时候,如果异步复位信号不能直接被I/O引脚驱动,就必须将异步复位信号和后面的的被驱动电路断开,用来保证DFT扫描和测试能够正确进行。两个同步复位触发器不应该包含在扫描链种,需要手动测试。
后记
复位是芯片设计的一个重要主题,只有深入理解了为什么要复位,同步复位和异步复位的优缺点,才能深入理解工程设计中的各种解决方法。

哈姆雷特,请保持前行!

  • 20
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值