亚稳态以及测试逻辑实现

在逻辑设计中,如果整个系统使用的都是同步时钟,并且后续时钟都是由同一时钟经过PLL或者DCM产生的时钟信号,那么时钟和数据总会有固定的关系。当这个关系满足寄存器的建立时间和保持时间要求的时候。输出端会在特定的传输延迟时间后输出一个稳定的有效状态。因为在同步系统中,输入信号总是满足寄存器的建立保持时间要求,所以不会发生亚稳态。但是在实际的工程设计中,不可避免地在电路设计时引入异步设计,对于异步系统,由于数据和时钟的关系不是固定的,因此有可能会出现违反建立时间和保持时间的情况。此时,输出就不是一个稳定的状态,而可能处于某一种中间状态。


亚稳态的概念

由违反寄存器的建立时间和保持时间而产生的。其实对于逻辑设计中基本上绝大多数的时序问题,都是由这个原因产生的。在设计中,任何信号通路上的寄存器都有特定的建立时间和保持时间。在时钟有效沿附近∂t这段时间内,输入信号应该保持稳定不变,但是如果信号在这段时期发生了变化,那么输出将是未知的,将这个“未知的状态”称之为“亚稳态”。这回导致寄存器的输出产生毛刺,或者暂时保持在不稳定的状态,需要较长的时间才能回到稳定状态。亚稳态输出恢复到稳定状态所需要的超出规定的时钟到输出的延迟时间(tco)的额外时间部分称为稳定时间(tmet)。一般来说,触发器都会在一个或两个时钟周期内返回稳态。


避免亚稳态的产生

当违背建立时间和保持时间时,亚稳态就有可能出现。最常见的出现亚稳态的情况有以下几种:

  • 输入信号是异步信号
  • 时钟偏移/摆动(上升/下降时间)高于容限值。(时钟信号质量不好)
  • 信号在两个不同频率或者相同频率但香味和偏移不同的时钟域下跨时钟域工作。
  • 组合延迟使寄存器的数据输入在亚稳态窗口内发生变化。


亚稳态测试电路

在前段时间的设计中,有一个异步控制信号影响后续电路进入亚稳态,导致整个系统在一段时间内的输出无法达到期望的结果。在仿真的时候,无法分析出输出会进入亚稳态,虽然综合工具的时序报告显示的时序裕量已经接近满足要求(因为在实际设计中,有时使时序完全满足建立保持时间需要付出太大的代价,故如果接近满足时序裕量,则认为设计可靠)。所以当时在逻辑设计中,对这个异步信号进行亚稳态检测,发现确实在接下来的一个时钟周期内引起了亚稳态。解决方法是将同步器从两级加到了三级。从而满足时序要求。


下面就介绍一种检测亚稳态的方法和逻辑设计。

下图为设计原理图

亚稳态以及测试逻辑实现_第1张图片


异步输入async_in输入到由时钟上升沿触发的寄存器qa。qb和qc都是由时钟的下降沿来触发。

当两个互为反相的信号分别传递到qb和qc的输入时,无论qa什么时候出现亚稳态,异或非(XNOR)们的输出都会变为高电平。在寄存器qd输出端捕捉到高电平就表明已经检测到亚稳态时间。


因为解析触发器(qb和qc)由时钟下降沿触发,所以可以通过改变时钟高电平的时间(∂t)来控制所要求的稳定时间。稳定时间tmet由下式确定

tmet = ∂t - tACN

其中tACN是最小时钟周期,等于tcq(qa的时钟到输出延时) + 解析寄存器(qb或qc)的建立时间tsu。

减少解析时间或者稳定时间的方法之一就是给建立/保持时间处的数据集中加入抖动。时序电路图如下:


亚稳态以及测试逻辑实现_第2张图片


HDL代码实现

    
always @ (posedge clk or negedge rstn)
begin
    if(!rstn)
        qa  <=  1'b0;
    else
        qa  <=  async_in;
end

assign clk_inv                   = !clk;

always @ (posedge clk_inv or negedge rstn)
begin
    if(!rstn)
        qb  <=  1'b0;
    else
        qb  <=  qa;
end

always @ (posedge clk_inv or negedge rstn)
begin
    if(!rstn)
        qc  <=  1'b0;
    else
        qc  <=  !qa;
end

assign temp = !(qb ^ qc);

always @ (posedge clk or negedge rstn)
begin
    if(!rstn)
        qd  <=  1'b0;
    else
        qd  <=  temp;
end

assign async_det = qd;




你可能感兴趣的:(FPGA逻辑设计之设计方法)