概述
仿真中复位信号的基本作用是强制电路进入某种状态。 实际设计中是否需要复位取决于芯片的应用和功能。 如果芯片不需要确定的启动状态,则不需要使用复位信号; 相反,如果芯片的正常工作必须从某个确定的状态开始,那么复位信号就是必要的。
复位信号最基本的目的是使硬件电路进入某种稳定运行的状态。
一般来说,人们认为芯片的所有触发器都应该是可复位的,无论系统是否需要。 (在一些高速应用中,去掉一些触发器的复位可以提高设计的性能,例如流水线中使用的寄存器)。
在选择重置实施策略之前,有一些问题需要考虑。例如
本文将主要介绍同步重置、异步重置、重置树,以及如何处理异步重置和同步释放
同步复位
定义:当复位信号改变时,并不立即生效。 必须等到时钟的有效沿在改变的位置采样复位信号后才能复位寄存器。
优点:同步复位通常可以保证电路100%同步,有利于时序分析。 合成的最高频率一般较高; 同步复位将被合成到更小的触发器中,特别是当复位信号由触发器的输入逻辑选通时。 时间; 同步复位确保复位仅发生在有效时钟边沿。 时钟可以作为滤除复位毛刺的一种手段; 在某些设计中,复位必须由一组内部条件产生。 建议在此类设计中使用同步复位信号,以便滤除时钟之间的复位毛刺。
总结:保证电路同步,方便时序分析; 可以滤除高于时钟频率的毛刺
缺点:逻辑器件库中的大多数DFF只有异步复位端口,因此当使用同步复位时,合成器会在寄存器的数据输入端插入组合逻辑。 首先,它会消耗组合逻辑资源。 其次,合成器无法区分复位信号和其他数据信号,需要判断合成的复位信号是否满足设计要求。 详细信息请参见示例 1。 复位信号的有效时间必须大于时钟周期,以保证其被可靠识别并完成复位。 因此,需要考虑以下因素:clk skew、组合逻辑路径延迟、复位延迟等因素。 详细信息请参见示例 2。 有时需要脉冲展宽器来确保复位信号出现在时钟的有效边沿。 补充(包括门控时钟电路的情况):同步复位需要时钟来复位电路。 当使用门控时钟来节省电力时,可能会出现问题。 当复位信号发出时,时钟可能会关闭,这种情况下只能使用异步复位,并且在时钟恢复之前移除复位信号。
总结:同步复位与时钟有关,需要考虑复位信号能否可靠采样,因此需要考虑clk skew、组合逻辑路径延迟、复位延迟等因素; 合成器无法区分复位信号,将其引入数据输入端。 组合逻辑可以增加逻辑资源。 另外,还要确定是否满足设计要求。
示例1
2.31所示电路功能与图2.30相同。 唯一的区别是复位与门位于多路复用器外部。 现在,考虑门级仿真期间会发生什么。 通过将 rst_n 保持为低电平,MUX 两个分支的输入可以强制为 0,但如果负载未知 (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提供的器件库都有带有异步复位的触发器,这可以确保数据路径是干净的,不像同步复位引入组合逻辑。 此外,该电路可以在有或没有时钟的情况下复位,并且可以被综合工具自动识别。
异步复位的缺点:复位信号释放时可能会出现亚稳态问题:在时钟有效沿附近释放复位; 很容易受到毛刺和移除复位信号问题的影响
从系统中移除异步复位信号可能会导致芯片进入不稳定且未知的状态。 释放复位信号时必须注意避免这种情况。 使用同步复位时,复位的上升沿和下降沿都需要远离时钟的有效沿。 复位信号的释放可能会出现以下两个问题:
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. 厂商提供的延迟单元; 2. 插入缓冲区。
并非所有系统都需要该毛刺滤波器。 设计人员必须研究系统要求以确定是否需要延迟。
重置网络
在一个设计中,无论是同步复位还是异步复位,扇出的数量往往仅次于时钟网络。 重置网络通常在全局网络上路由。 在布线过程中,需要控制每条路径的时钟偏移保持在大致相等的水平,以便可以“同时”撤消复位。
疏散过程中两个复位信号之间可能存在一个周期的偏差,这可能会导致实际电路系统中的时序混乱。
使用复位分配技术:
怀疑
1. 为什么说同步复位总是导致fmax较大?
2. 还不太理解reset树
参考:
[1]《硬件架构的艺术》
[2] Mooc:核心力量-硬件加速设计方法课程
[3]“异步和同步复位设计技术 – Part Deux”