数字电路设计——复位信号(异步复位、同步释放)
概述
在仿真中复位信号的基本作用是将电路强制到一个确定的状态 。在实际设计中是否需要复位,取决于芯片的应用和功能,如果一个芯片不需要一个确定的起始状态,则没有必要使用复位信号;相反,如果芯片的正常工作必须从一个确定状态开始,那么复位信号就是必须的。
复位信号最基本的目的是使硬件电路能够进入一个稳定操作的确定状态
总的来说,认为不论对于系统来说是否需要,一个芯片的所有触发器都应该是可以复位的。(在一些高速应用中,除去一些触发器的复位可以提高设计的性能,例如应用在流水线的寄存器)。
在选择复位实现的策略之前,需要思考一些问题。比如
- 使用同步复位还是异步复位;
- 是否每个触发器都要收到复位信号;
- 复位树的要求;
- 如何验证复位信号的时序;
- 怎样测试复位功能;
- 多时钟域的设计中实现如何复位等等。
本文将主要介绍同步复位、异步复位,复位树。以及异步复位同步释放的处理方法
同步复位
定义:复位信号发生变化时,并不立即生效,需要等到时钟有效沿采样到变化地的复位信号后才对寄存器进行复位 。
优点
- 同步复位通常确保电路是100%同步的,有利于时序分析,综合出来的最高频率一般较高;
- 同步复位会综合成更小的触发器,特别在该复位信号被触发器的输入逻辑门控时;
- 同步复位确保复位只发生在有效时钟沿。时钟可以作为过滤掉复位毛刺的手段;
- 在一些设计中,复位必须由一组内部条件产生。推荐在这样的设计中使用同步复位信号,这样可以将时钟之间的复位毛刺过滤掉。
总结:保证电路同步,利于时序分析;可以滤除高于时钟频率的毛刺
缺点:
- 大多数逻辑器件库中的DFF只有异步复位端口,所以使用同步复位,综合器会在寄存器的数据输入端插入组合逻辑,一是会耗费组合逻辑资源,二是综合器无法分辨复位信号和其他数据信号,需要判断综合出的复位信号是否满足设计需求。详见例1。
- 复位信号的有效时间必须大于时钟周期,才能保证被可靠地识别,完成复位。所以需要考虑到以下因素:clk skew、组合逻辑路径延时、复位延时等因素,详见例二。有时需要脉冲展宽器,以保证复位信号能出现再时钟有效沿处。
- 补充(含门控时钟电路情况):同步复位需要时钟以复位电路。在出于节省功耗的目的而使用门控时钟时,可能出现问题。在复位信号发出时,时钟可能关闭,在这种情况下只能使用异步复位,并在时钟恢复前移除复位信号。
总结:同步复位与时钟相关,需要考虑复位信号能否可靠地被采样,所以需要考虑clk skew、组合逻辑路径延时、复位延时等因素;综合器无法辨别复位信号,会在数据输入端引入组合逻辑,增大逻辑资源,此外需要判断是否满足设计需求。
例1
2.31所示电路功能与图2.30相同。唯一的区别是复位与门在多路复用器之外。现在,考虑门级仿真时发生的情况。通过保持rst_n为低,可以将MUX的两个分支的输入强制为0,但是如果load未知(X),并且MUX模型是悲观的,则触发器将保持未知(X),而不是复位。注意,这只是仿真过程中的一个问题!实际电路将正常工作并将触发器重置为0。
Synopsys提供编译器指令sync_set_reset,它告诉综合工具给定的信号是同步复位(或置位)。综合工具将把这个信号“拉”到尽可能接近触发器的位置,以防止这个初始化问题的发生。在本例中,这个指令通过在模块内的某处添加以下行来使用
推荐的做法使在项目开始时把这些指令接入RTL代码中避免重新综合影响项目进度。
另外,可以在读取RTL之前将综合变量hdlin_ff_always_sync_set_reset设置为true,这将产生相同的结果,而代码本身无需任何指令。
例2
如上图所示,同步复位信号的持续时间需要大于最慢的时钟周期,此外还要考虑,复位树的组合逻辑延时,复位信号的传播延时,以及时钟偏斜。
代码风格
always @ ( posedge clk ) begin
if ( ! rst_ )
begin
…
end
else
begin
…
end
end
异步复位
异步复位操作与时钟无关,当复位信号有效沿到达时,无论时钟沿是否有效,都会立即对目标进行复位。
异步复位优点
- 大多数器件库的DFF都有异步复位端口,采用异步复位可以节省资源,此外,确保数据路径干净;
- 设计相对简单
- 异步复位识别方便,可以很方便的使用FPGA的全局复位端口GSR
总结:Vendor提供的器件库大多都有带异步复位的触发器,这样能确保数据路径是干净的,不像同步复位会引入组合逻辑。此外,不论是否有时钟,都能对电路进行复位,综合工具也能自动识别。
异步复位缺点
- 在复位信号释放(Release)的时候可能会出现亚稳态问题:复位释放在时钟有效沿附近;
- 容易受到毛刺的影响
移除复位信号的问题
移除系统中的异步复位信号会使芯片进入不稳定的未知状态。在释放复位信号时必须注意避免这种情况的发生。在使用同步复位时,复位的上升沿和下降沿都需远离时钟的有效边沿。复位信号的释放可能存在以下两个问题:
1)违背复位恢复时间。复位恢复时间是指复位信号撤销后和时钟再一次置高之间的时间,违背数据恢复时间会使得寄存器数据输出端出现数据完整性或亚稳态问题。
2)复位移除会在不同时序元件的不同时钟周期内发生。当复位移除与时钟上升沿异步时,在复位信号和/或时钟信号上不同的传播延迟会导致某些寄存器或触发器提前退出复位状态。
异步复位问题解决——复位同步器、复位毛刺过滤
复位同步器
如图所示,异步复位有效时,复位信号立即生效。但在复位信号撤销时,需要经过时钟的同步的处理。
该电路具有以下特点:
1、能够很大概率降低复位信号撤销带来的亚稳态问题。当第一级的输出出现亚稳态,经过一个时钟通常能够得到稳定的复位信号(高电平或者低电平),在第二级触发器的作用下输出同步释放的复位信号。
2、能够有效捕捉复位信号:
3、异步不依赖于时钟:
代码实现:
module async_rst (
output reg rst_n,
input clk,asyncrst_n
);
reg rff1;
always @(posedge clk or negedge asyncrst_n)
if (!asyncrst_n)
{rst_n,rff1} <= 2'b0;
else
{rst_n,rff1} <= {rff1,1'b1}
endmodule
复位毛刺过滤
异步复位对毛刺很敏感,这就意味着任何满足触发器最小复位脉冲宽度的输入都能引起触发器复位。如果复位线受到毛刺的影响,这就真成为问题了。在设计中,可能没有足够高频的采样时钟来检测复位上的小毛刺。下面介绍了过滤毛刺的方法,其需要一个数字延迟来过滤毛刺。复位输入引脚也必须是施密特触发器引脚才有助于毛刺过滤。
为了增加延迟,一些供应商提供了可以手动实例化的延迟宏单元。如果没有这样的延迟宏,设计人员可以在优化后手动将延迟实例化到综合设计中。 第二种方法是实例化模块中的慢速缓冲器,然后多次实例化该模块以获得所需的延迟。 在这个概念上可以有很多变化。
总结:通过延时消除毛刺,方法:1、vendor提供的延时单元;2、插入缓冲buffer。
并不是所有系统都需要这种毛刺滤波器。 设计人员必须研究系统要求,以确定是否需要延迟。
复位网络
在一个设计中,无论是同步复位还是异步复位,其扇出数量往往仅次于时钟 网络。复位网络通常会被布线在全局网络上,在布线的时候需要控制各个路 径的时钟偏移保持在大致相等的水平上,使复位能“同时”撤离。
两个复位信号在撤离时可能会存在一个周期的偏差, 在实际电路系统中,可能会导致时序错乱。
采用复位分发技术:
疑问
1、为什么说同步复位总能和出来的fmax较大?
2、对复位树还不太理解
参考:
[1] 《硬件架构的艺术》
[2] Mooc:芯动力——硬件加速设计方法 课程
[3] 《Asynchronous & Synchronous ResetDesign Techniques - Part Deux》