[数字IC/FPGA设计] 数字电路系统亚稳态介绍及预防措施

作者:Cicero-Guo
邮箱:kaikuo1998@hotmail.com
个人官方博客(英文)地址:https://cicero-guo.github.io/
希望我的技术分享能对初学者们有所帮助!也欢迎大家来我的个人博客参观。如果乐意打赏(二维码在个人官方博客内),在下不胜感激!

1. 什么是亚稳态?

如果想要理解数字电路系统中亚稳态(Metastability)的概念及其形成原理,那么绕不开地,我们要首先去了解静态时序分析中建立时间(Setup Time)与保持时间(Hold Time)的概念。在理想情况下,寄存器间的数据传递(如图1.1所示)不存在任何物理上的延迟,如图1.2所示,当T3周期结束时,Reg_1会释放数据并更新至Q端;而当T4周期开始时,Reg_2会在上升沿采集Reg_1即将被更新的数据,从而完成数据在两个寄存器之间的传输。

图1.1 寄存器数据传递模型

图1.1 寄存器数据传递模型

图1.2 理想传递波形图

图1.2 理想传递波形图

然而,如上面所说,这是在理想条件下没有物理延迟时才会发生的,而在现实条件下这种情况自然不会出现。一方面,数据在寄存器之间以及寄存器中(数据被采集到被输出至Q端口)传输存在延迟,另一方面,寄存器采集与保存数据也需要时间。寄存器要求,数据必须至少提前时钟上升沿一定时间到达寄存器D端口,或者说,数据必须在这个时间段前保持稳定,以确保数据能够被正常采集到。这个时间段值被称之为建立时间。相对应地,为了确保数据能够被下一个寄存器正常接受,寄存器数据需要在时钟上升沿之后继续保持一段时间的稳定。这个时间段被称之为保持时间。建立时间与保持时间的关系与示意如图1.3所示。简而言之,前一个寄存器(即图1.1中的Reg_1)的Q端数据必须在建立时间与保持时间中保持稳定,否则电路系统就有可能进入亚稳态。
图1.3 建立时间与保持时间

图1.3 建立时间与保持时间

而Altera在他们官方手册[1]中给出来的定义是这样的:

"If a data signal transition violates a register's setup time or hold time requirements, the output of the register may go into a metastable state."

即,如果说信号变化发生在了建立时间与保持时间前后这段区间内,那么就有可能会导致Reg_2数据输出不稳定。如图1.3所示,如果出现亚稳态,那么Reg_2既有可能输出值0,也有可能输出值1,使寄存器和相应电路系统处在一个极度不确定的状态下。
图1.4 亚稳态下信号输出示例

图1.4 亚稳态下信号输出示例[1]

2. 亚稳态的危害

根据上面所述可知,亚稳态其中一大危害就是会造成逻辑混乱。当电路系统出现亚稳态问题时,对应目的寄存器就像薛定谔的猫,在数据从Q端被输出之前,我们无法确定该寄存器是会输出一个期望的正确值还是一个错误的值。而这在一些电路系统中导致的后果可能是致命的,例如在异步复位电路中,错误的输出值可能会导致整个电路系统的复位失效,导致系统崩溃。同时,不可预知的输出值也可能会影响系统后续的逻辑判断和程序整体运行的走向,进而影响电路的稳定性。另外,亚稳态也有可能会导致信号毛刺的出现,从而影响电路性能。

3. 容易出现亚稳态的场合

亚稳态多发生于异步系统中,即:两个时钟域的信号进行数据传递时,无法保证建立时间与保持时间约束条件被满足,从而导致亚稳态的出现;而对于异步复位寄存器,亚稳态则是会伴随恢复时间违例(recovery time violation)和去除时间违例(removal time violation,后面会解释恢复与去除时间这两个时序概念)而出现。在接下来的小节中,我将介绍如何对于这两个场景减少亚稳态出现的概率。

4. 预防亚稳态的措施

i. 跨时钟域传输:打拍法

打拍法是最常见的跨时域数据同步方法之一。如图4.1所示,时钟域clk1中的数据信号sig1先是由触发器Reg1缓存,之后进入Reg2与Reg3所在的clk2时钟域,被打两拍同步后输出为sig2。通过打拍处理,该同步器可以拥有足够的额外时间,在信号被输出为sig2之前,将潜在的亚稳态信号解析为已知的确定值[1]。因此说,通过使用打拍法,可以大大降低异步系统中亚稳态危害出现的概率。
图4.1 打拍法

图4.1 打两拍使数据同步

除了打拍法,边沿检测同步器也可以被用于预防亚稳态在跨时域异步系统中的出现。如图4.2所示,在边沿检测之前,先通过一个双触发器打拍来消除异步系统中的亚稳态影响,再使用寄存器Reg3来判断数据上升沿是否到来。结合图4.3,我们可以看到,在周期T3时,同步寄存器Reg2的Q端输出数据波形;此时寄存器Reg3输出之前在T2周期中寄存的低电平数据,通过AND门,拉高输出端的波形,表明该单比特数据上升沿被检测到,即检测到了单比特数据的到来。
图4.2 边沿检测同步器

图4.2 边沿检测同步器

图4.3 边沿检测同步器:波形图

图4.3 边沿检测同步器:波形图

值得注意的是,以上两种办法指的是对于从低速时域到高速时域的数据同步,对于快到慢的时域同步,还需要去考虑脉冲展宽等处理措施才能实现跨时域传输。另外,以上方法也主要针对单比特数据的跨时域传输,而对于多比特数据,最好是使用FIFO缓存处理来实现数据的跨时域传输。

ii. 跨时钟域传输:FIFO缓存

对于多比特数据流的跨时域传输处理,最好的方法之一则是使用FIFO作为中间缓冲之后,再由目的时域来读取FIFO中的数据。在异步FIFO中,格雷码被用于比较读写地址来判断FIFO的满空,而格雷码每次只能变化1个比特位的特性大大降低了亚稳态在空满判断上出现的可能;另外,即使在亚稳态进行读写,格雷码也能进行正确的空满判断。有关FIFO处理的细节,我就在此不再多作展开,之后会另开文章详细讲解FIFO跨时域数据处理的原理说明。

iii. 异步复位同步释放

亚稳态危害容易出现的另一大场景就是异步信号的复位。不同于同步系统,异步复位信号与被复位系统之间不存在时钟上的同步关系,也因此我们无法将建立时间与保持时间的概念引入异步复位场景中。因此,在该场景中,恢复时间(recovery time)去除时间(removal time) 两个概念被引入进来。定义上,恢复时间就是使异步控制信号在下一个时钟边沿出现前无效的最短时间,而去除时间就是使异步控制信号在下一个时钟边沿出现后保持稳定(即保持无效)的最短时间。这么说来有点拗口,但如果结合建立时间与保持时间的概念去理解的话,那么这两个概念其实非常简单。图4.4中的波形图假设了一个异步复位的场景。当我们想要使rstn信号无效,恢复电路系统的正常工作,那么我们就必须至少在这个时钟沿之前的一段时间之前让rstn转为低电平,那么这段时间就是恢复时间;对应地,为了保证复位信号使无效能够成功,在这个时钟沿之后的一段时间内必须保持复位信号处于低电平,那么这段时间就是去除时间。
图4.4 恢复时间与去除时间

图4.4 恢复时间与去除时间

结合波形图来看的话,我们可以发现,作用上恢复时间与去除时间和同步时序中的建立时间与保持时间非常类似,即我们需要在这个前后时间段内保持控制信号的稳定,否则亚稳态就有可能出现。对于普通的异步复位电路,复位信号直接连接在寄存器的复位端上,那么在复位时,控制信号很有可能就会进入恢复与去除时间前后的这一区间,导致亚稳态出现。为了规避这类问题,一个有效办法就是使用异步复位同步释放设计。简单地说,就是先去使用打拍逻辑同步复位信号,再用同步后的复位信号去做系统复位。设计代码[2]与电路图如下所示:

//摘抄自菜鸟教程Verilog高级教程5.1节
module areset_srelease(
input       rstn,  //异步复位信号
input       clk,   //时钟
input       din,   //输入数据
output reg  dout   //输出数据
);
 
reg   rstn_r1, rstn_r2;
always @ (posedge clk or negedge rstn) begin
    if (!rstn) begin
        rstn_r1 <= 1'b0;     //异步复位
        rstn_r2 <= 1'b0;  
    end
    else begin
        rstn_r1 <= 1'b1;     //同步释放
        rstn_r2 <= rstn_r1;  //同步打拍,时序差可以多延迟几拍
    end
end
 
//使用 rstn_r2 做同步复位,复位信号可以加到敏感列表中
always @ (posedge clk or negedge rstn_r2) begin
    if (!rstn_r2) dout <= 1'b0; //同步复位
    else          dout <= din;
end
endmodule

图4.5 异步复位同步释放电路图

图4.5 异步复位同步释放电路图

iv. 其他改善措施

除了改变电路设计,制程选择也能影响亚稳态的出现概率。更加高速的制程技术可以使数字系统更加迅速地脱离亚稳态[1],而根据Altera官方的叙述,在设计FPGA芯片时如果选择使用更高的制程,那么电路鲁棒性将增强,更不易收到亚稳态影响。另外,供电电压的大小也能影响亚稳态的出现概率。虽然减小供电电压可以有效地降低电路系统功耗,但是在低电压情况下如果电路陷入亚稳态,随着电压降低电路增益减小,寄存器更难从亚稳态中摆脱出来。因此,提高供电电压也可有效地减少亚稳态的影响。

5. 总结

在这篇文章中,我简单介绍了亚稳态的成因危害与高发场景,也介绍了在这些高发场景下应对亚稳态的措施。关于这些应对措施的细节,我大多没详细展开,之后有精力的话会连续更新几篇文章详细讲解下跨时域传输与异步复位相关内容(挖坑中)。最后有一点值得提醒一下,就是上述应对亚稳态的措施,全部都是为了降低亚稳态发生的概率,尽可能地防范亚稳态的出现,而不是消除亚稳态。亚稳态不可能被完全消除,很多数字IC公司也在他们笔试中将这作为一重要考点,这一点一定牢记。

6. 参考资料或链接

[1]. Altera. (2009, July). Understanding Metastability in FPGAs. http://www.pldworld.com/_altera/html/tip/wp-01082-quartus-ii-metastability.pdf
[2]. Runoob. (n.d.). 5.1 Verilog 复位简介. https://www.runoob.com/w3cnote/verilog2-reset.html

posted @ 2022-08-31 23:39  Cicero-Guo  阅读(923)  评论(0)    收藏  举报