异步复位 & 同步释放


1. 复位信号的必要性

  • 好的设计要求每一个触发器都要提供复位信号。
  • 但是并不是每一部分的电路都需要复位电路。
    • 如果每个电路的输出在任何时刻都可以不受到复位信号的控制就有正确的值时,例如对数据通路中的数据进行处理的部分。
    • 而且电路有更高的速度更高的性能要求时,可以去掉复位信号的设计。

2. 同步复位 & 异步复位

2.1 同步复位

  • 时钟有效边沿到来时,才能复位触发器状态。
    always@(posedge clk) 
    begin
      if(!nrst)
        a <= 1'b0;
      else a <= 1'b1;
    end
    
  • 综合工具会提供编译指令,告知综合工具指定的信号是同步复位信号(或置位信号)。综合工具会将该信号拉的尽可能接近触发器。
    // 直接写到RTL设计中,其中//synopsys为一条综合工具可找到的指令,还有/*synopsys、//$s、//$S
    //synopsys sync_set_reset "rst_n"
    always@(posedge clk)
      if(!rst_n) ...
      else if ....
    
    • 或者在读取RTL之前将合成变量hdlin_ff_always_sync_set_reset设置为-true,这样就可以得到相同的结果,而不需要在代码本身中执行任何指令。
    • 类似的RTL指令还有async_set_reset,指定异步复位信号。这两种指令在某些情况下必须使用,更为具体的案例可见这篇文章
  • 同步复位的优点
    • 因为复位信号只有在时钟边沿才会被采到,所以可以过滤掉复位信号的毛刺。
    • 有利于时序分析,完全的同步电路。
  • 同步复位的缺点
    • 同步复位信号只是一个普通的数据信号,所以很容易把复位逻辑综合到触发器外面,额外增加了所需要的电路资源和线延迟。
    • 需要保证复位信号的有效时间比时钟周期长,可能需要加额外的脉冲展宽电路。
    • 如果考虑低功耗设计,那么可能加的时钟门控电路导致时钟被关闭,此时没办法使用时钟进行同步复位。只能使用异步复位。
    • 一些三态总线的初始化过程中,要求最好异步复位。
      • 考虑oe是时钟边沿触发的,复位做的三态总线初始化是给信号oe一个0,三态门输出Z态。
      • 但是考虑到三态门的数据输入可能也是边沿触发,且和oe同一个边沿,那么由于两个边沿不是完全对齐的,如果三态门的数据比使能信号先到,那么三态门短暂的打开过,导致总线各个slave存在竞争关系。
      • 也可以使用同步复位信号,但是该复位信号必须可以直接撤销三态的使能;如下图所示。

2.2 异步复位

  • 随时可以进行复位,有自己的边沿检测。
    always@(posedge clk or negedge nrst)
    begin
      if(!nrst)
        a <= 0;
      else a <= 1;
    end
    
  • 异步复位的优点
    • 生产方提供的库中如果有异步复位触发器,那么就可以保证数据路径是干净的,不会像同步复位一样插入额外的逻辑。
      • 对于数据路径时序很紧的设计,无法承担同步设计再加入的同步复位带来的额外单元门和额外线路延迟,就可以使用异步复位。
    • 异步复位跟时钟没有关系,因此即使加了门控时钟,仍可完成复位。
    • 综合工具能够自动推断出异步复位而不必像同步复位一样在RTL设计中加编译指令或设置额外变量。
  • 异步复位的缺点
    • DFT测试时,对异步复位信号需要特殊处理。(DFT这部分不太清楚)。
    • 产生复位不会有问题,但是在复位释放时,如果在触发器时钟有效边沿附近释放,可能会不满足建立保持时间,进入亚稳态。
    • 可能会有噪声或毛刺引起的伪复位,需要设计毛刺过滤器来消除毛刺的影响。
    • 复位信号和时钟信号一样,都是大扇出,所以无论同步或异步,在后端版图设计时需要分析复位树的时序确保满足时序要求。尽管存在复位 buffer tree,但最好要对复位信号少做逻辑。

3. 异步复位同步释放

  • 复位或释放需要满足两个时间

    • recovery time
      • 对于释放复位信号时,需要在时钟沿到来前保持一段时间,目的是准备好复位释放后需要的数据,类似于同步时钟的setup时间。
    • removal time
      • 对于复位信号,需要在时钟沿到来之后仍保持一段复位值稳定的时间,类似同步时钟的hold time。
  • 异步复位不一定什么时候会被释放掉,很有可能不满足recovery time和removal time;导致进入亚稳态。

  • 解决方法:异步复位,同步释放。

    • 复位时不受时钟的控制,但是释放时受到时钟信号的同步。第二个触发器用于移除第一个触发器释放时可能会出现的亚稳态。
    //Synchronized Asynchronous Reset
    //异步复位、同步释放:只适用于没有PLL的系统复位信号的设置
    module sync_async_reset(clock,reset_n,rst_n);
    
      input clock, reset_n;
      output rst_n;
    
      reg rst_nr1, rst_nr2;
    
      always @(posedge clock or negedge reset_n) begin
          if(!reset_n) begin
      	  rst_nr1 <= 1'b0;
              rst_nr2 <= 1'b0;		//异步复位
          end
          else begin
      	  rst_nr1 <= 1'b1;
      	  rst_nr2 <= rst_nr1;		//同步释放
      	end
      end
      
      assign rst_n = rst_nr2;			//新的系统复位信号rst_n
      //信号rst_n作为新的系统复位信号,后续可以用来直接“异步复位”
      
    endmodule							// sync_async_reset
    
    • 时序如下所示
  • 复位分发技术

    • 错误的分发:上下两路的复位信号可能会存在一个周期的偏差(可能上面寄存器不满足时序要求或是下面,导致最后采到的复位信号不一致)。
    • 正确的分发:首先用两级同步器,对异步复位进行同步,得到了根复位信号之后,再对其用复位同步电路进行分发。
      • 由于同步后的根复位信号不会带来亚稳态问题,在分发过程中,再次适用两级寄存器对跟复位信号进行同步和分发,是很安全的。
      • 分发后的各个子复位网络是各自独立的,并且扇出的数量比根复位网络要小很多。
posted @ 2023-07-17 17:22  可达达鸭  阅读(554)  评论(0编辑  收藏  举报