复位电路之深入理解

在FPGA中复位策略必须考虑,如使用同步复位或者异步复位或者异步复位同步释放,以及每个触发器是否都需要进行复位。而复位的基本目的是让器件进入到可以稳定工作的确定状态,避免器件在上电后进入到司机状态导致跑飞了。

基于赛灵思7系列架构的FPGA器件的每个slice中含有8个寄存器,这些寄存器都是D类触发器,共享一个通用的控制集。触发器控制集的组成包括时钟输入clk,高电平有效芯片使能端CE,高电平有效端SR端口,输入输出。触发器中的SR端口既可以用作同步置位/复位端口,也可以用作异步预设/清除端口。

使用全局复位无法解决复位结束可能造成的时序问题,因位全局网络的延时较大,并且不可以直接连到寄存器的复位端,仍然需要局部走线,这对于时序要求紧张的场合较难满足时序。另外会占用全局时钟资源,多个复位信号会占用更多的全局时钟资源。
同步复位是指复位信号只有在时钟上升沿到来时才有效,同步复位代码如下:

module	sync_rst(
	input clk,
	input rst,
	input din,
	output reg dout
);

always @ (posedge clk) begin
	if(	!rst) begin
		dout <= 0;
	end
	else begin
		dout <= din;
	end
end
endmodule

复位电路之深入理解_第1张图片
同步复位的优点:一般情况下能确保电路是百分百同步的;确保复位只发生在有效时钟沿,可以作为过滤掉毛刺的手段。
同步复位的缺点:复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位。同时还要考虑:时钟偏移,组合逻辑路径延时、复位延时等因素;采样同步复位会耗费较多的逻辑资源。

异步复位:指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位;异步复位代码如下:

module async_rst(
	input clk,
	input rst,
	input din,
	output reg dout
);
always @ (posedge clk or negedge rst) begin
	if(!rst) begin
		dout <= 0;
	end
	else begin
		dout <= din;
	end
end
endmodule

复位电路之深入理解_第2张图片
异步复位的优点:异步复位信号识别简单;省资源
异步复位缺点:复位信号很容易受到毛刺的影响;如果复位结束时刻恰好在亚稳态窗口内。无法决定现在的复位状态是1还是0,会导致亚稳态。

不管使用同步或异步复位,一般都需要让复位和时钟同步。只要全局复位脉冲的持续时间足够长,器件上所有的触发器都会进入复位状态。但是取消复位信号后的断言必须满足触发器的时序要求,才能保证触发器顺利的从复位状态转换到正常状态,不能满足时序要求,触发器就会进入亚稳态。

异步复位同步释放:就是在复位信号到来时候不接收时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。异步复位同步释放代码如下:

module sync_async_reset (
	input clk,
	input reset,
	input din,
	output reg dout
);
reg reset1;
reg rst;
always @ (posedge clk or negedge reset) begin
	if(!reset) begin
		reset1 <= 0;
		rst <= 0;
	end
	else begin
		reset1 <= 1;
		rst <= reset1;
	end
end
always @ (posedge clk or negedge rst) begin
	if(!rst) begin
		dout <= 0;
	end
	else begin
		dout <= din;
	end
end

endmodule

复位电路之深入理解_第3张图片

关于复位会有以下几个着重点:

1、多时钟域复位
2、复位毛次消除
3、复位的目的
4、同步复位
5、异步复位
6、异步复位同步释放

1、复位的目的?
复位信号在数字电路中重要性仅次于时钟信号。对于一个芯片来说,复位的主要目的是使芯片电路进入一个已知的、确定的状态。主要是触发器进入确定的状态。在一般情况下,芯片中的每个触发器都应该是可复位的。在某些情况下,当高速应用程序中使用流水线触发器(移位寄存器触发器)时,为了实现更高的性能设计,可能会从某些触发器中消除复位。这种类型设计需要在复位激活前进,运行预先确定数量的时钟周期,以使ASIC处于已知状态。

1.1为什么要复位?
(1)使电路在复位后从确定的初始状态运行:
上电的时候,为了避免上电后进入随机状态而使电路紊乱,这时就需要上电复位。
有时候,电路在某个状态下,想或者别人要求你从电路的初始状态开始进行延时你的电路功能,这时候就要对电路进位复位,让它从最初的初始状态开始运行。

(2)使电路从错误状态回到可以控制的确定状态
有时候,电路发生异常,比如状态机跑飞等,就需要让电路进行复位,让它从错误的状态回到一个正常的状态。

(3)电路仿真时需要电路具有已知的初始值
在仿真的时候,信号在初始状态是未知状态(也就是所谓的x,不过对信号初始化之后这种情况除外,因为仿真的时候对信号初始化就使信号有了初始值,这就不是x了)。

对于数据通路(数字系统一般分为数据通路和控制通路,数据通路一般是对输入的数据进行处理,控制通路则是对运行的情况进行操作),在实际电路中,只要输入具有有效数据(开始的时候可能不是有效的),输出后的状态也是确定的;在仿真的时候,也是输入数据有效了,输出也就确定了。这就是说,初始不定态对数据通路的影响不明显。

对于控制通路,在实际电路中,只要控制通路完备(比如说控制通路的状态机试完备的),即使初始状态是不定态,在经过一定的循环后,还是能回到正确的状态上;然而在仿真的时候就不行,防真的时候由于初始状态是未知态,控制电路一开始就陷入了未知态;仿真跟实际电路不同,仿真是“串行”的,仿真时控制信号的初始不定态会导致后续的控制信号结果都是不定态,也就是说,初始的不定态对控制通道是致命的。

1.2不需要复位的情况
复位信号很重要,但是并不是每一部分的电路都需要复位电路,一方面是复位电路也消耗逻辑资源,占用芯片面积。另一方面是复位信号会增加电路设计的复杂性(比如要考虑复位的策略、复位的布局布线等)

当某个电路的输出在任何时刻都可以不受到复位信号的控制就有正确的值时,比如说数据通路中的对数据进行处理的部分。在某些情况下,当流水线的寄存器(移位寄存触发器)在高速应用中,应该去掉某些寄存器的复位信号以使设计达到更高的性能,因为带复位的触发器比不带复位的触发器更复杂,反应也更慢。

2、同步复位?
2.1同步复位的实现方式
同步复位的前提是,复位信号只会在时钟的有效边沿去影响或者回复flip-flop。reset可以作为组合逻辑的一部分送给FF的D端。这种情况下,编码方式必须是if/else优先级的方式,而且reset只能放在if条件下,其他组合逻辑放到else逻辑下。

module sync_reset(
	input clk,
	input rst_n,
	input d,
	output reg q
);
always @ (posedge clk) begin
	if(!rst_n) begin
		q <= 1'b0;
	end
	else begin
		q <= d;
	end
end

endmodule

如果没有严格遵循这种方式,会有两个问题:
(1)一些仿真器中,基于逻辑方程,逻辑可能阻止复位到触发器。复位的一个主要目的,就是仿真的时候将电路置于一个已知的确定状态。
(2)由于复位树的高扇出,复位信号可能是一个相对于时钟周期的“延迟到达信号”,尽管复位将从复位缓冲区树中进行缓冲,,但还是必须对复位少做逻辑。

上述代码的电路图如下:

下面的例子是一个同步复位的,带进位的计数器。

module ctr8sr(
	input clk,
	input rst_n,
	input ld,
	input [7:0] d,
	output reg co,
	output reg [7:0] q
);

always @ (posedge clk) begin
	if(!rst_n) begin
		{co,q} <= 9'b0;
	end
	else if(load) begin
		{co,q} <= d;
	end
	else begin
		{co,q} <= q + 1'b1;
	end
end


同步复位还有一个问题就是,综合工具不能很好的把reset信号和其他信号区分开,可能综合成另外的电路,如下所示:

上面这两个图是相同的,唯一的区别是图2是reset信号被提到了MUX之前,通过rst_n拉低,可以强制MUX的两个分支的输入为0,但是如果ld是未知的,并且MUX模型是悲观的,则会保持未知不会被复位。这是只是仿真过程中出现的问题,实际电路可以工作争取并将其重置为0.

Synopsys提供编译指令sync_set_reset,该指令时告诉综合工具给定低信号是同步reset,合成工具将这个信号拉到尽可能接近触发器,防止这种初始化问题的发生;

//synopsys sync_set_reset “rst_n”
这个命令只会影响综合,不会影响逻辑行为,,推荐在同步复位每个模块都加上这个信号。

也可以在读取RTL之前将合成变量hdlin_ff_always_sync_set_reset设置为-true,这样就可以得到相同的结果,而不需要在代码本事执行任何指令。

2.2同步复位的优点
(1)不同复位一般能够确保电路100%是用不的,因为电路都是由同步时钟触发。
(2)同步复位会综合成更小的触发器,特别当reset生成逻辑作为触发器D输入,这种情况下组合逻辑电路的数量变多,总的门电路节省不是很显著。
(3)同步复位确保复位只发生在时钟有效边沿,对于小的复位毛刺来说,时钟就像滤波器。
(4)当复位信号是由内部电路产生的,此时复位信号就有可能有毛刺,时钟就可以过滤毛刺。即同步复位收到复位信号的毛刺影响小。
(5)通过使用同步置位和预先确定的时钟数量作为复位过程的一部分,可以在复位缓冲区树中,使用触发器,来帮助将缓冲树的时序保持在一个时钟周期以内。

2.3同步复位的缺点
(1)使用同步复位可能使综合工具无法分辨复位信号和其他控制信号,导致进行复位的控制逻辑远离触发器(也就是说,并不是所有的ASIC库都有内置的同步复位逻辑,综合工具可能把复位逻辑综合到触发器自身之外)。如上图所示。

(2)同步复位需要一个脉冲延伸其来保证复位脉冲足够宽,能够被有效时钟沿采集到,特别是在多时钟设计中。如果复位信号是以短脉冲的方式出现是,时钟沿就有可能错失这个复位信号,导致复位脉冲丢失,同步复位电路没有起到作用。
复位电路之深入理解_第4张图片
解决方法:一方面,可以采样脉冲捕捉电路,另一方面,可以将复位信号进行脉冲扩展,维持足够长的时间。

(3)同步复位可能有组合逻辑延时,当复位逻辑距离触发器比较远时,这个时候就不能把触发器当做即时响应复位信号的触发器,这个时候就有了复位信号偏移问题。

(4)在内部组合逻辑的产生复位信号的设计中,推荐使用同步复位。这是优缺点,因为这样产生复位信号的组合逻辑一方面在仿真的时候容易出现x态,另一方面在实际电路中,这样的复位信号容易被多个信号影响。

(5)同步复位电路必须要有一个时钟来复位。如果用门控时钟来省电,没有时钟的生活就不能复位。门控时钟的同步复位可能无效,在使用门控时钟的时候,复位信号依赖与时钟,在复位信号发出的时候,时钟可能就关闭了,这会导致实际的电路没有被复位。
复位电路之深入理解_第5张图片
如果使用的上升沿触发的触发器,就会发生和直接门控一样的问题出现毛刺。如果使用下降沿触发的触发器代替电平敏感的锁存器,在时钟的下降沿捕获使能输入。这样与门的使能输入会保持稳定,直到时钟的下一个下降沿,因此解决了毛刺问题。。但是会带来三个问题:
①:触发器通常由两个锁存器组成。因此,Flip-Flop-basedICG相比Latch-based ICG面积增加了一倍。
②:Flip-Flop-based ICG相比Latch-based ICG增加了功耗
③:Flip-Flop-based ICG在时钟下降沿捕获使能输入,必须在半个时钟周期内完成。而使用锁存器,能够占用整个时钟周期(time borrow),因为Latch在有效电平是一直能够传播数据的,触发器只能在边沿传播数据。

(6)总线设计中的同步复位问题: 在总线控制中,系统上电复位的时候,要求不同芯片之间的总线工作在合理的状态上(比如处于高阻态或者输出);上电之后,由于系统的时钟可能仍未正常工作,同步复位可能无效,这个时候各个模块就可能不会把总线接口设置为特定的状态,(当多个模块同时输出数据到总线上时)就可能导致电平冲突。

解决办法:为了防止芯片上电时内部总线出现竞争,一是采用异步上电复位。
另一种方法是使用复位信号直接撤销是三态使能的电路:
复位电路之深入理解_第6张图片
复位信号一方面控制了复位逻辑,另一方面控制了三态的使能端。这种技术简化了复位-高阻这条路径的时序分析。

3、异步复位?
3.1 异步复位的实现
异步复位触发器则是在设计触发器的时候加入了一个复位引脚,也就是说复位逻辑集成在触发器里面。(一般情况下)低电平的复位信号到达触发器的复位端时,触发器进入复位状态,直到复位信号撤离。电路图以及RTL代码如下:

module async_rst(
	input clk,
	input rst_n,
	input d,
	output reg q
);
always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		q <= 1'b0;
	end
	else begin
		q <= d;
	end
end

endmodule

在这里插入图片描述
关于异步复位的综合约束,推荐将输入reset设置为:
set_ideal_network + false path

3.2 异步复位的优点
(1)vendor库里面有异步复位FF,这样datapath就十分干净,不用把reset与数据做逻辑,这样复位路径上就不会有额外的延时,也不会受外部信号的干扰。复位信号一直连接到触发器的复位端口,而不是像同步复位那样需要经过一个复位控制逻辑。

module ctr8ar(
	input clk,
	input rst_n,
	input ld,
	input [7:0] d,
	output reg co,
	output reg [7:0] q
);

always @ (posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		{co,q} <= 9'b0;
	end
	else if(ld) begin
		{co,ld} <= d; 
	end
	else begin
		{co,ld} <= q + 1'b1;
	end
end

endmodule

复位电路之深入理解_第7张图片
(2)与时钟没有关系,不管时钟上升沿有没有到来,只要复位信号一有效,触发器就会复位,也就是基本上做到了实时性,由于与时钟没有关系,因此也可以用在门控时钟里面。

(3)异步复位不需要加入综合指令,综合工具就能自动识别。

3.3 异步复位的缺点
(1)异步重置的最大问题是它们是异步的,在复位阶段和复位撤离都是异步的。复位阶段不是问题,复位撤离才是大问题。如果在触发器的活动时钟边缘或附近释放异步复位,则触发器的输出可能变为亚稳态,这样电路的复位亚稳态可能会丢失,复位撤离会失败。
①:复位恢复时间(reset recovery time)违例
②:复位撤离(reset removal)发生在不同的触发器的不同时钟周期
复位恢复时间:解除复位信号时,复位边沿(当然是从有效变成无效的跳变时刻,通常是0—>1那个时间点)与下一个有效时钟沿之间的这段书剑。对应建立时间。

复位撤离时间:撤离复位信号,复位边沿与上一个有效时钟沿之间的这段时间。对应保持时间。

异步复位的复位信号必须满足一定的恢复时间和撤离时间,否则就无法确定时钟沿是否起作用了。即判断不了是复位了还是没有复位。D触发器如果不复位,那么输出就是输入的数据。

不满足复位恢复时间或者撤离时间,可能会导致亚稳态问题。因为如果输出本身就是复位后的值,即使当前时钟沿不能判断是否复位,输出也是复位值,这时钟就不会产生亚稳态,因为已经是亚稳态了。

不满足复位恢复时间或者撤离时间可能会导致不同FF复位状态不一致的问题。复位信号和时钟信号一样,通过复位网络到达各个触发器。复位网络具有非常大的扇出和负载,到达不同的触发器存在不同的延时,不满足复位恢复或者撤离时间的情况下,就有可能在不同的触发器的时钟周期内进行解复位。

(2)具体问题具体分析:
①:复位撤离问题
复位恢复时间指撤离一个复位信号时,复位信号从有效跳变为无效的时刻与下一个有效时钟沿之间的这段时间。
复位撤离时间指撤离一个复位信号时,复位信号从有效跳变为无效的时刻上一个有效时钟沿之间的这段时间。
复位电路之深入理解_第8张图片

上图中,rst_n1是要求的复位恢复时间,rst_n2满足复位恢复时间,rst_n3复位恢复时间不满足
复位电路之深入理解_第9张图片
上图中,rst_n1是要求撤离时间,rst_n2满足复位撤离时间,rst_n3复位撤离时间不满足

由上图可知,想让某个时钟沿起作用(也就是采数据),应该在恢复时间之前让异步控制信号变无效;如果想让某个时钟沿不起作用(即这个时钟沿依旧复位),应该在撤离时间之后使控制信号变无效。异步复位信号的恢复和撤离时间需要大于一定的时间。如果异步信号在这两种情况之间(撤离),那么就没法确定时钟沿是否起作用,即判断不出是复位还是不复位。(不复位即D触发器采样输入端的数据)

由于异步复位信号与系统时钟毫关系,复位可以随时施加,也可以随时撤离。在施加的时候复位信号不存在任何问题,复位和时间没关系,但是在撤离复位信号的情况下,主要有两个问题:
(1)当异步复位信号在撤离时刻在是有效沿附近时,就有可能导致恢复时间或撤离时间不足,即这个时候违背了复位恢复时间或撤离时间,这时可能导致触发器的输出端为亚稳态。
复位电路之深入理解_第10张图片
但是并不是所有情况都会产生亚稳态,当复位值和此时的输出相同时,就不会产亚稳态。
在这里插入图片描述

这是因为复位信号翻转的时候,如果复位信号判断是低电平,输出就是低电平。如果判断复位信号是高平,输出信号就等于对输入信号的采样值。图里面输入信号就是低电平,不管复位不复位,输出一直是低电平,没有亚稳态。

(2)复位状态不一致问题
复位信号和时钟信号一样,复位通过复位网络可以到达各个触发器。一方面,复位网络具有非常大的扇出和复杂,到达不同的触发器存在不同的延时,也就是存在复位偏移,因此撤离异步复位的时刻也不一样的;另一方面,由于时钟网络也存在时钟偏移。这个时候异步复位可能再不同的触发器的不同时钟周期内进行撤离,也就是时候异步复位的信号不一致。
复位电路之深入理解_第11张图片
撤离问题的解决方法是:异步复位同步释放。

4、异步复位同步释放?
异步复位同步释放电路也称为复位同步器,这个方法是将外部输入的异步信号进行处理,产生另外一个适合用于后面电路的复位信号,这个处理后的复位信号能够异步复位电路中的触发器,不会存在撤离问题(因为经过了同步);这个异步复位同步释放的处理电路和RTL代码如下所示:

在这里插入图片描述

module async_reset(
	input clk,
	input asyrst_n,
	output reg rst_n
);
reg rff1;
always @ (posedge clk or negedge asyrst_n) begin
	if(!asyrst_n) begin
		{rst_n,rff1} <= 2'b0;
	end
	else begin
		{rst_n,rff1} <= {rff1,1'b1};
	end
end

endmodule

为什么两级触发器不会出现亚稳态呢?第一级FF的输入是1,输出的reset值是0,而reset又是异步的,如果reset刚好在clock边沿附加,就会出现亚稳态。
加上第二级FF就不会出现亚稳态,因为第二级的FF的输入比第一个FF延时了一个周期,这样第一个FF在撤离复位的时候,即使有亚稳态们也只是影响下一个周期Q1的输出,下一个周期Q1可能是0也可能是1,但是当前Q1还是为低,因为这时第一个FF还是复位状态,这样第二个FF当前周期的输入是0,复位输出也是0,所以能不能复位成功都不会改变输出为0,即当前周期不会产亚稳态。下一个周的Q1输出虽然也可能是0或者1,但是已经稳定,所以第二个FF输出也是稳定的值。

复位电路之深入理解_第12张图片
分为以下三种情况:
第一级撤离没问题,第二级撤离出现在时钟的有效附近,即第二级的D触发器的撤离时间不满足恢复时间或者撤离时间,时序图如下:
复位电路之深入理解_第13张图片
这里的AB指的是两种情况,由图看,无论是触发器判断此刻是复位还是不复位,输出都是一样的,也就是说,输出rst_n不是亚稳态,而是确定的值。

第一级的撤离出现问题,第二级的撤离没问题,这时的时序图如下:
复位电路之深入理解_第14张图片
可以看到,第一级触发器虽然产生了亚稳态,但是由于第二级触发器的存在,亚稳态并没有传播下去,得到的信号依然是干净的,只不过这个复位信号可能延长多一个周期而已。

两级的撤离都不满足复位恢复时间或撤离时间,这时的时序图如下:
复位电路之深入理解_第15张图片

第一级触发器产生了亚稳态,但是由于第二级触发器的存在,亚稳态没有传播下去,虽然第二级触发器的复位信号撤离也在时钟有效沿附近,但是和第一种情况一样,第二级触发器是不会产生亚稳态的,因此即使是极端状态,输出的复位信号也是干净的。

5、异步复位的抖动或毛刺问题?

由于异步复位和时钟无关,任何一个毛刺都可以引起复位,这是一个reset源的问题。复位电路之深入理解_第16张图片

解决方法:使用同步复位,另一个是过滤毛刺了,过滤毛刺和消抖的思路有点像,主要是经过一段时间之后,在经过逻辑门判断产生外部来的是不是真正复位信号,加上过滤毛刺信号部分的同步撤离电路和时序如下所示:复位电路之深入理解_第17张图片
有的库里面包含delay,有的没有;没有的话要手动增加delay或者插buffer,同时增加约束让delay不被综合掉。

6、复位树
复位树和时钟树一样,reset的负载和clock的负载数量一般相当,不管是同步复位还是异步复位,对复位树都有时序要求。
复位电路之深入理解_第18张图片
时钟分支树和重置分布树之间的一个重要的区别是时钟树需要紧密平衡分布重置之间的偏差,与时钟信号不同,只要与复位信号相关的延迟足够短,允许在一个时钟周期内传播所以的复位负载,并仍然满足所以目标寄存器和触发器的恢复时间,那么复位信号之间的偏差就不是关键。

另一个问题是,时钟树与复位树之间的关系,如果能够用分支clock来驱动master reset的触发器是最好,但是大多数情况下,没有足够的时间让时钟脉冲遍历时钟树、时钟复位驱动触发器,然后让复位遍历复位树,所以这些都是在一个时钟周期内完成。

复位电路之深入理解_第19张图片
为了能让reset到达所有逻辑的速度更快,更好的方式是用更早一个clock来驱动reset ff,即用源时钟来驱动。必须进行Post layout timing分析,以保证复位同步器的FF不会出现set/hold违例。通常情况下,两个tree之间详细的时序调整等到layout完成才能进行。电路结构如下图:
复位电路之深入理解_第20张图片

6.1 同步复位树
对同步复位树,一种是通过插入FF实现复位树,这样的好处是,reset不需要在一个时钟周期内到达所有的FF。所以需要几个时钟才能把整个设计复位掉。每个模块都需要包含如下代码:

input reset_raw;
//synopsys sync_set_reset  "reset"
always @ (posedge clk) begin
	reset <= reset_raw;
end

复位电路之深入理解_第21张图片
采用这种技术,同步复位信号可以像其他数据信号一样处理,设计中每个模块的timing分析都容易,复位树的每个阶段都有合理的扇出。

6.2 异步复位树
对异步复位,是通过复位同步器来完成复位树的建立。即每个层级都加上一个异步复位同步器。复位电路之深入理解_第22张图片
异步复位树和同步复位树有点相似,但是异步复位同步器是两级的触发器。这种异步复位树,复位时可以所有的FF都同时复位,但是撤离复位必须要几个周期才能完成。

这种结构的问题是,不同层级撤离复位的时间点可能是不一样的。如果设计要求整个芯片在同一个周期来撤离复位,那么就需要对复位同步器做出平衡设计,保证到达每个复位终点是同一个时钟。同步时钟树也存在这个问题。

使用这种结构的好处是,不用等到P&R之后才去手动调整timing,完全可以交给综合工具(DC/PT)去插入buffer。

在使用异步重置时,至关重要的是,设计人员要在DC和PT中使用设置为适当设置的适当变量,以确保从复位同步触发器的q-output驱动的异步复位得到缓冲(如果需要的话)和timed。

6.3 复位策略—复位时钟
下面这个电路的扇出特别大:
复位电路之深入理解_第23张图片

下面这种使用多个“并联”的同步释放,分担负载压力:
在这里插入图片描述
这种情况下,第一级的撤离出现问题,第二级的撤离没有问题的时候,亚稳态稳定后的状态可能不一样,导致rst_n的复位不一致,有的复位可能会快/慢一个周期。

最佳的方案也在上面进行了阐述,就是先进行同步释放这会,同步后的复位信号又当做各个部分的异步信号,然后进行同步释放,如下所示:复位电路之深入理解_第24张图片
经过前级的同步释放之后,就不存在亚稳态稳定好导致的输出rst_n不一致的问题了。

7、 多时钟域复位
对于多时钟域的设计,每个时钟域必须有自己单独的复位同步器和分布式复位树。这样才能保证reset能够满足不同时钟域的reset recovery time。如下图所示:
在这里插入图片描述
对于多个多时钟域的撤离复位顺序有两种情况:
(1)大部分多时钟域的设计,撤离复位的顺序并没有特殊要求。即当前时钟域撤离复位的时间点,在另一个时钟域的精确时间点并不重要。通常来说,跨时钟域的设计,本身就会带来延时的不确定性。这种情况单独建立不同时钟域的复位结构就足够了。

(2)有些多时钟设计,复位撤离必须按照顺序进行。这种设计,可以使用优先级的复位结构:
复位电路之深入理解_第25张图片

8、异步复位的DFT
在做DFT的时候,如果异步复位信号不能直接被I/O引脚驱动,就必须将异步复位信号和后面的被驱动电路断开,用来保证DFT扫描和测试能够正确进行。两个同步复位触发器不应该包含在扫描链中,需要手动测试。

你可能感兴趣的:(复位电路之深入理解)