复位
对一个芯片来说,复位的主要目的是让芯片电路进入一个已知的,确定的状态,主要是触发器进入确定的状态。一般情况下,芯片里每个触发器都是可以复位的。但某些情况下,为了实现更高的性能设计,可能会从某些触发器中消除复位,这种类型设计需要在复位激活期间运行预定数量个周期,使得asic处于已知确定状态。
复位的目的:
- 复位可以让电路从确定的初始状态开始运行
- 复位可以让电路从错误状态回到可以控制的确定状态
- 电路仿真时需要电路具有已知的初始值
不需要复位的情况:
- 复位电路消耗资源,占用面积,增加电路设计复杂性。
- 电路的输出在任何时刻都可以不受复位信号控制就可以正确时可以不用复位。比如高速应用中可以去掉某些寄存器的复位信号以使设计达到更高的性能。因为带复位的触发器比不带复位的触发器更复杂,反应也更慢。
同步复位
同步复位(synchronous reset):当复位激活时,寄存器在下一个时钟有效沿到来之后被复位,时钟有效沿到来之前还是保持之前的值。复位信号可以作为组合逻辑的一部分送给触发器的D端。编码方式为:
always @(posedge clk) begin
if (!rst_n) begin
q <= 1'b0;
end
else begin
// q <= comb
end
end
实际设计中应保证复位信号尽可能直接和触发器的D输入端相连。synopsys提供编译器指令sync_set_reset来告知综合工具给定信号是同步复位信号,工具会把这个信号拉到尽可能靠近触发器的位置。
同步复位的优点:
- 同步复位会综合成更小的触发器,代价是组合逻辑的电路变多,所以总的电路节省并不显著。
- 同步复位确保电路100%是同步的,无论是复位的下发还是释放。
- 同步复位对复位的小毛刺有滤波作用。
- 在一些设计中,复位必须由内部条件产生,同步复位能过滤时钟间逻辑等式的毛刺。
同步复位的缺点:
- 需要库里有自带同步复位的触发器,否则只能通过把复位当作输入来解决。
- 同步复位需要复位脉冲足够宽,能够被有效时钟采集到。否则如果复位脉冲不够宽则不能保证有效复位。
- 同步复位电路必须要有一个时钟来复位,如果有时钟门控,那么打开icg的时候就没办法复位。
- 同步复位会在数据输入端增加逻辑,会增加数据路径的净延迟。
- 综合工具不能很好的区分复位和其他信号。
异步复位
异步复位(asynchronous reset):当复位激活时,寄存器立刻被复位,和时钟沿到来与否没关系,不需要时钟触发。异步复位触发器则是在设计触发器的时候加入了一个复位引脚,复位逻辑集成在触发器里面,一般情况下低电平的复位信号到达触发器的复位端时触发器复位,直到复位信号释放。
编码方式为:
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
q <= 1'b0;
end
else begin
// q <= comb
end
end
异步复位激活和拉低是和时钟无关的,当复位信号到来时,触发器输出立刻被复位,不需要等到时钟沿到来。
异步复位的优点:
- 异步复位FF是在库里的,使用异步复位FF的datapath不涉及复位信号,不用把复位信号和数据做逻辑,复位路径上不会有额外的延时,也不会受外部信号的干扰。
- 异步复位触发器和时钟无关,没有时钟仍然可以复位触发器,可以实时复位,所以也可以加在门控时钟里面。
- 异步复位不需要加入综合指令,综合工具能自动识别。
异步复位的缺点:
- 亚稳态,异步复位是异步的,在复位阶段和解复位阶段都是异步的。复位阶段异步没有问题,解复位异步会产生亚稳态的问题。如果在触发器的活动时钟沿或附近解复位,那么触发器的输出可能变为亚稳态,这样电路的复位状态可能丢失。
所以一般都是异步复位同步释放,即reset assertion是异步的,但是reset release一定是和时钟同步的。对于解复位在STA阶段需要检查recovery time和removal time。
- 异步复位的抖动和毛刺,由于异步复位和时钟无关,所以任何一个毛刺都可以引起复位。所以复位源不能有毛刺,下面电路也要过滤毛刺。
同步复位和异步复位的区别
- 同步复位会将复位信号算在两个寄存器之间的组合逻辑中,增加延时。另外如果复位信号负载很大,可能使得复位通路的组合延时很大,限制性能。
- D触发器本身是没有复位pin的,异步复位信号通常会综合出一个带有复位pin的寄存器。
- 异步复位不需要时钟,如果哪些模块需要在没有时钟的时候复位,只有异步复位能做到。
- 异步复位信号需要去毛刺滤波后作为异步复位同步释放电路的异步复位输入。当异步复位信号和延迟后的复位信号均为复位态时才可以作为有效的复位信号。
复位同步器
异步复位同步释放的电路称为复位同步器,代码逻辑如下:
always @(posedge clk, negedge rst_async_n) begin
if (!rst_async_n) begin
rst_q1 <= 1'b0;
rst_q2 <= 1'b0;
end
else begin
rst_q1 <= 1'b1;
rst_q2 <= rst_q1;
end
end
assign rst_sync_n = rst_q2;
两级FF不会出现亚稳态,如果复位刚好在时钟边沿,那么第一级FF会出现亚稳态,但是加了第二级之后,降低了亚稳态的概率。
所以亚稳态只会影响一个周期的输出。
reset release电路
复位同步释放的时钟如果频率比较高,复位释放的recovery timing会比较难收,因此需要reset_release_crg电路用于在复位释放的时候将时钟降频。
抹沿数量和几拍后解复位都可以配置。
电路内部在解复位时先通过控制内部icg将clk抹沿,而后再下发解复位,解复位后再关闭icg恢复频率。后续触发器使用该电路的输出时钟和复位信号来实现异步复位同步释放。
复位树
对于同步复位,可以通过插入FF来实现,好处是复位信号不需要在一个时钟周期内到达所有触发器,需要几个时钟才能把整个电路复位掉。
采用这种技术,同步复位信号可以像其他数据信号一样处理,更方便分析timing和fan-out。
对于异步复位,可以通过复位同步器完成复位树的建立,每个层级都加上一个异步复位同步器。这种异步复位树,复位时可以所有的FF都同时复位,但是解复位必须要几个cycle才能完成。
坏处:不同层级解复位的时间点可能是不一样的。
好处:不用等到P&R之后才去手动调整timing,完全可以交给综合工具(DC/PT)去插入buffer。