同步电路与异步电路
1. 同步电路的定义:即电路中的所有受时钟控制的单元,全部由一个统一的全局时钟控制
2. 同步电路的优缺点
优点
- 在同步设计中,EDA工具可以保证电路系统的时序收敛,有效避免了电路设计中竞争冒险现象。
- 由于触发器只有在时钟边沿才改变取值,很大程度地减少了整个电路受毛刺和噪声影响地可能。
缺点
- 时钟抖动(clock Jitter)
- 时钟树综合(时钟网络),需要加入大量地延迟单元,使得电路地面积和功耗大大增加。
- 时钟偏移(clock skew)
3. 异步电路的定义:电路中的数据传输可以在任何时候发生,电路中没有一个全局的或局部的控制时钟
4. 异步电路的优缺点
优点
- 模块化特性突出,运行相对独立
- 对信号延迟不敏感
- 没有时钟偏斜的问题
- 有潜在的高性能特性
- 好的电磁兼容性
- 具有低功耗特性
缺点
- 设计复杂
- 缺少相应的EDA工具的支持
- 在大规模集成电路设计中应避免采用异步电路设计
5. 时钟域
同一个时钟域
- 两个时钟都是来自同一个PLL,这些时钟的相位和倍数都是可控的,因此他们之间是同一个时钟
不同的时钟域
- 两个时钟是来自不同的PLL,即使他们频率相同,也是异步时钟。因为他们之间的相位关系是无法控制的
6. 同步电路与异步电路如何选择?
同步电路
- 在一个理想的全局时钟控制下,只要电路的各个功能环节都实现了时序收敛,整个电路就可以可靠工作了。
- 由于EDA工具的广泛支持,采用同步电路设计的方法是ASIC和SoC设计的基本要求
异步电路
- 在大规模的ASIC和SoC芯片中,都采用了全局异步,局部同步的方法
亚稳态
亚稳态概念及原理
亚稳态是指触发器无法在某个规定时间段内达到一个可确认的状态。
原理:当一个数据刚好处于数据翻转过程中,既不是1也不是0,此时触发器就进入了亚稳态。在该状态下无法预测该FF的输出电平(图中T_met),也无法预测输出何时才能稳定在某个正确的电平上.
- 在T_met期间,触发器输出一些中间级电平,或者可能处于振荡状态,并且这种无用的输出电平可以沿信号通道上的各个触发器级联式传播下去
- 亚稳态不能从根本上消除,但可以通过一定措施降低对电路的影响
亚稳态一般采用故障间隔平均时间来衡量:
MTBF越大,亚稳态对电路产生的影响越小
如果在时钟频率 $f_{clk}$ 和数据变化率 $f_{data}$ 固定的情况下,要增大MTBF,设计者要做的只能是增大Tmet的值。
Tmet:指正常没有亚稳态情况下,寄存器输出信号从源寄存器到目的寄存器的建立时间余量
Tmet = T_cycle – T_setup+ T_skew – T_co – T_data
- 设置时钟网络延时参数也很大程度上由器件决定
- T_su和T_co由器件本身的工艺和工作环境有关
- T_skew = T_clk1 - T_clk2
设计者要做的只能是减少T_data时间,如图所示,只需要不在两个寄存器间添加任何逻辑而已,进而获得较大的MTBF
双锁存器法
单锁存器的问题:
一个信号在过渡到另一个时钟域时,如果仅仅用一个触发器将其锁存,那么用 b_clk 进行采样的结果将可能是亚稳态。这也是信号在跨时钟域时应该注意的问题。
为了避免上述的亚稳态问题,就应当使参数MTBF尽可能的大,通常采用的方法就是双锁存器级联(用DFF将信号连续锁存两次)。最后得到的结果就可以消除亚稳态。
实际就是打两拍的操作,但是为什么打两拍能够消除亚稳态呢?
因为这个操作实际上就是保证在现在时钟域下的Tmet能够满足要求。打两拍之后采样时钟周期时间和Tco时间是一样的,所以保证了Tmet尽可能的小。
双锁存器法的优缺点
- 优点:结构简单,易于实现
缺点:
- 增加了两级触发器的延时。在高性能计算中,两个时钟周期消耗对系统性能有消极的影响,若电路中时钟较多,则跨时钟域会浪费很多个时钟周期。
- 当快时钟域转到慢时钟域时,易造成慢时钟采样丢失(还没来得及采样,数据就变化了)。
- 常用于慢时钟域转到快时钟域
适用条件:
结论
- 两级触发器已经将MTBF变得足够大;
- 三级或者更多级虽然能将亚稳态出现概率降得更低,但是影响电路效率
单比特信号跨时钟域如何传输
边沿检测同步器(慢到快)
基本功能
- 边沿检测同步器电路如图所示,通常用于慢时钟域向快时钟域同步,可以检测输入信号的上升沿,也可以检测它的下降沿。
功能分析
- step1:input = 电路中的Data信号,是clk1慢时钟域的一个脉冲
- step2:脉冲经过clk2两级同步后,A引脚的波形如图橙色区域所示
- step3:B引脚的波形比A引脚的波形晚一个时钟周期,如图浅蓝色区域所示
- step4:逻辑门对AB信号进行逻辑运算,得到了最终的信号output
总结: 对比input和output,这个电路成功地将慢时钟域下一个时钟周期宽地脉冲,搬移并缩小为快时钟域下一个时钟周期地脉冲
边沿检测同步器适用条件
- 输入数据的宽度必须比一个接受时钟周期加上一个同步触发器的hold时间要长,最安全的就是两个同步周期宽度。使得慢时钟域的脉冲足够保持到被快时钟的同步器拿到
代码:
1 | module synzer_ed( |
2 | input clk1, |
3 | input clk2, |
4 | input data_in, // signal that before synchronized |
5 | output data_out // signal that after synchronized |
6 | ); // edge detecting synchronizer |
7 | |
8 | reg a; // DFF in the old clk domain |
9 | reg b; // the first DFF in the new clk domain |
10 | reg c; // the second DFF in the new clk domain |
11 | reg d; // the third DFF in the new clk domain |
12 | |
13 | always @(posedge clk1) begin //a |
14 | a <= data_in; |
15 | end |
16 | always @(posedge clk2) begin |
17 | b <= a; |
18 | c <= b; |
19 | d <= c; |
20 | end |
21 | assign data_out = c && (~d); //上升沿 |
22 | //assign data_out = d && (~c); //下降沿 |
23 | //assign data_out = d ^ c; //双边沿 |
24 | endmodule |
脉冲同步器(快到慢)
脉冲同步器的输入信号是一个单时钟宽度脉冲,它触发原时钟域中的一个翻转电路。每当翻转电路接收到一个脉冲时,它就会在高低电平间进行转换,然后通过电平同步器到达异或门的一个输入端,而另一个信号经过一个时钟周期的延迟进入异或门的另一端,翻转电路每转换一次状态,这个同步器的输出端就产生一个单时钟宽度的脉冲。
基本功能
- 从某个时钟域取出一个单时钟宽度脉冲,然后再新的时钟域中建立另一个单时钟宽度脉冲。
功能分析
step1: 由于快时钟的时钟频率比慢时钟高,慢时钟域采样快时钟的脉冲很可能会采不到。通过toggle电路将快时钟域前后间隔较多个周期的两个有效脉冲进行了有效的标定,形成图中toggle波形
step2: 在慢时钟域clk2通过同步电路将这个toggle信号进行同步,形成引脚A的波形XOR(A)
step3:通过触发器将同步电路输出信号再次经过一个触发器,使得B引脚的波形比A引脚的波形晚一个时钟周期,如图XOR(B)所示
step4:逻辑门对AB信号进行逻辑运算,得到了慢时钟域下两个有效的单周期脉冲output
脉冲同步器限制
- 输入脉冲之间的最小间隔必须等于两个同步器时钟周期,也就是间隔 ≥ 慢时钟域的两个周期
- 如果输入脉冲互相过近,则新时钟域中的输出脉冲也紧密相邻,结果是输出脉冲宽度比一个时钟周期宽。
- 输入脉冲大于两个同步器周期时,并且输入脉冲相邻太近,同步器就不能检测到每个脉冲。
代码:
1 | module PULSE_SYNC |
2 | ( |
3 | input src_clk , //source clock |
4 | input src_rst_n , //source clock reset (0: reset) |
5 | input src_pulse , //source clock pulse in |
6 | input dst_clk , //destination clock |
7 | input dst_rst_n , //destination clock reset (0:reset) |
8 | output dst_pulse //destination pulse out |
9 | ); |
10 | |
11 | //INTER DECLARATION |
12 | reg src_state ; |
13 | reg state_dly1 ; |
14 | reg state_dly2 ; |
15 | reg dst_state ; |
16 | wire dst_pulse ; |
17 | |
18 | //--========================MODULE SOURCE CODE==========================-- |
19 | |
20 | always @(posedge src_clk or negedge src_rst_n) |
21 | begin |
22 | if(src_rst_n == 1'b0) |
23 | src_state <= 1'b0 ; |
24 | else if (src_pulse) |
25 | src_state <= ~src_state ; |
26 | end |
27 | |
28 | always @(posedge dst_clk or negedge dst_rst_n) |
29 | begin |
30 | if(dst_rst_n == 1'b0) |
31 | begin |
32 | state_dly1 <= 1'b0 ; |
33 | state_dly2 <= 1'b0 ; |
34 | dst_state <= 1'b0 ; |
35 | end |
36 | else |
37 | begin |
38 | state_dly1 <= src_state ; |
39 | state_dly2 <= state_dly1; |
40 | dst_state <= state_dly2; |
41 | end |
42 | end |
43 | |
44 | assign dst_pulse = dst_state ^ state_dly2 ; |
45 | endmodule |
三种同步器比较
结绳法传输(对时钟关系没有要求)
相对于上述两种同步器法对两个时钟域之间的关系要求很严格,而“结绳法”适合任何时钟域的过渡
1. 结绳法原理
- 将快时钟信号的脉冲周期延长,等到慢时钟同步 采样后再“解绳”,还原为原来的脉冲周期宽度。
2. 结绳法分类
1)利用脉冲的边沿做时钟,可以将脉冲无限延长,直到可以采集到数据,然后复位,要考虑产生数据的频率。
- 数据作为Din_clkA,即当数据有上升沿(0->1)时,寄存器1的输出将会稳定在高电平,此时等待ClkB采样;
- 当ClkB完成采样后,寄存器4会输出高电平,若此时Din_clkA为低电平,那么即可完成复位,开始下一 次采样等待。
存在的问题:
当数据来临(即上升沿)时,ClkB域需要等待3个ClkB才会在寄存器4输出并完成输入端的复位,所以Din_ClkA如果变化较快,即持续时间短于3个ClkB,那么这时Din_ClkA的变化将无法被采样到,并且此时Din_ClkA 必须是低电平才能完成异步复位。
在慢时钟采样快时钟的时候,结绳法适合采样数据较少(即脉冲间隔较大)的控制信号。即脉冲间隔Ta>3Tb;即等待3个clkB时钟后,完成复位,才允许下一个输入脉冲
2)利用脉冲的电平做异步复位, 置位信号。关键点就是什么时候结绳结束(采集到了数据就要让对方回到初始状态)
3)利用握手协议
step1: 结绳(翻转)电路_快将快时钟域的信号进行结绳
step2: 经过了慢时钟域的两级同步器,将信号送入了慢时钟域的解绳电路中,最终得到慢时钟域下单周期的脉冲信号
step3: 对这两个单周期的脉冲信号进行结绳
step4:经过同步电路_快,送入解绳电路_快中
step5: 解绳后,快时钟域就能得到慢时钟域给回来的响应信号rsp。此时快时钟域就知道慢时钟域已经收到了刚才发生的信号
3. 结绳法小结
- 结绳法可以解决快时钟域向慢时钟域过渡的问题,且其适用的范围很广。
- 结绳法实现较为复杂,特别是其效率不高,在对设计性能要求较高的场合 应该慎用。
采样中“快到慢”与“慢到快”在考虑问题时有什么区别?
慢到快:只需要考虑亚稳态问题。
快到慢:除亚稳态问题外,还需考虑慢时钟的采样速率问题。因为 根据采样定理,采样频率低于信号最高频率2倍的时候,是无法完整采样的
多比特指示信号跨时钟域传输
多个控制信号跨时钟域,仅仅通过简单的同步器同步有可能是不安全的
以下示例中,b_load
和b_en
同步至a_clk
时钟域,如果这两个信号有一个小的skew,将导致在a_clk
时钟域中两个信号并不是在同一时刻起作用,与在b_clk
中的逻辑关系不同。
解决方法
将b_load
和b_en
信号在b_clk
时钟域中合并成一个信号b_lden
,然后同步至a_clk
中。
如果不能合并呢?向如译码信号
解决思路
在这种情况下,建议加入另一个控制信号,确保bdec[0]、bec[1]稳定时采。 例如在bdec[0]、bec[1]稳定输出后一到两个周期b_clk
域输出一个en
信号,通知a_clk
域此时可以采bdec[0]、bec[1]信号,这样可确保正确采样。
多比特数据流跨时钟域传输
数据流和指示信号的区别
- 前者大多具有连续性,即背靠背传输
- 数据流要求信号具有较快的传输速度
多bit数据流跨时钟域传输解决方法
FIFO:先进先出的储存结构,它与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据,其数据地址由内部读写指针自动加 1 完成,不能像普通存储器那样可以由地址线决定读取或写入某个指定的地址。
关于FIFO的详细介绍可以参考文章深入理解FIFO以及同步FIFO和异步FIFO的verilog实现代码 | ZhouHaojie的博客 (grenze.cn)
关于FIFO需要理清以下的几个问题:
FIFO深度
如何通过理论分析设置合理的FIFO深度?
例题引出:
问题分析:
分析清楚数据轻载和重载时数据的传输任务,即FIFO在重载的时候满足要求,则在轻载的时候肯定可以胜任
假设写入时为最坏的情况(背靠背burst),即在160×(1/100) 微秒内写入160个数据,以下是写入160个burst数据的时间计算方法:
在这段时间内读出的数据量为:
深度值 depth=burst时间内写入的数据长度 - 读出的数据长度
计算FIFO深度的一般化方法
将问一般化为:写时钟频率:WCLK,读时钟频率:RCLK,写时每B个时钟周期内会有 A个数据写入FIFO,读时每Y个时钟周期内会有 X个数据读出FIFO。
- 其中$\frac{burst_length}{wclk}$表示这个burst的持续时间, $rclk\times \frac{X}{Y}$表示读的实际速度,两者的乘积自然就是这段时间读出的数据量
- burst_length表示这段时间写入的数据量。
- 写入和读出两者之差为FIFO中残留的数据,这个也就是理论上的 FIFO的最小深度。
读写指针
为什么需要用格雷码做读写指针?
由于异步FIFO是工作在两个不同的时钟域中,读地址在某一时刻可能会从0111->1000转变,所有位都翻转了,读到的值可能时0000~1111中的任一一个值,这个不确定的读地址值会导致空满状态判断错误。
格雷码的特点是相邻的2个数值之间只会有一位发生变化,其余各位都相同。引用格雷码之后,相邻数值只有1位发生翻转,1位翻转所引起的亚稳态的概率远远要小于几位同时翻转所引起的概率。因此,格雷码能很好的亚稳态出现的概率。
什么情况下,需要用格雷码来进行读写指针编码?什么时候不可以用格雷码?
当深度为2次幂的时候,刚好格雷码满足消除亚稳态的需求。
在非2次幂深度情况下,格雷码已经不再适用,此时的解决方法通常有
① 若深度为偶数,可采用最接近的2次幂的格雷码编码,在此基础上修改;
② 深度为一般数值时,可自行设计一种逻辑电路,或者查找表,以实现指针每次只跳变一次的功能;
③ 以上方法通常在设计层面较为复杂,若无特定需求,可将FIFO深度设置为2次幂,浪费一些存储空间,来化简控制电路的复杂度
例题:
亚稳态相关
FIFO中的亚稳态是否能够真正消除?
亚稳态不能从根本上消除,但可以通过采取一定的措施 使其对电路造成的影响降低。
既然亚稳态无法消除,那为什么FIFO还能正常工作?
考虑如果指针为格雷码,失效的后果:
地址同步出错,但是只有一位出错,也就是地址没有跳变,但是用这个错误的写地址去做空判断不会出错, 最多是让空标志在FIFO不是真正空的时候产生,而不会出现读空的情形。
格雷码保证的是同步后的读写地址即使在出错的情形下依然能够保证 FIFO功能的正确性,当然同步后的读写地址出错总是存在的。
两拍同步或者多拍同步的差异?
打两拍能够极大的降低亚稳态传播的概率 。在低频情况下,STA不需要分析这里的异步时序,因为寄存器都可以在一拍内将亚稳态消除,恢复到正常0/1态。在高频情况下,就不一定能消除,尤其在28nm工艺以下,需要检查两级触发器的延迟,保证延迟低,提高系统MTBF。
打多拍能够将亚稳态出现的概率进一步降低。
空满标志的判断是否有漏洞?
判断空满机制
- rptr同步两个“wclk”周期后,在wclk时钟域与wptr进行比较,生成full信号
- wptr同步两个“rclk”周期后,在rclk时钟域与rptr进行比较,生成empty信号
空满机制分析
假设读写时钟频率接近:
- 上图rptr同步两个”wclk”后,在wclk时钟域与wptr进行比较,比较相同,符合条件,生成full信号。
- 但在rptr和wptr进行比较时, rptr已经更新为5。当FIFO认为自己满的时候,读地址又从里面读走了两个数据,即FIFO并没有真正的满
结论:
- 对于full信号的生成机制,同步后的读地址一定是小于或者等于当前的读地址,所以此时判断FIFO为满不一定是真满,这样更保守;
- Empty信号的机制同样成立,“空”时,不一定是真“空”
总结:
异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,此机制保证了FIFO在空满极限情况下,依然留有余量,存在一定的冗余空间,以防写满溢出,读空多读的情况。
如何对FIFO进行逻辑综合静态时序分析?
从电路结构上分析,FIFO主要包括memory、 写时钟域电路、读时钟域电路、跨时钟域同步器这几个部分。在逻辑综合阶段,这几部分都需要单独处理。
- Memory 需要例化memory compiler 生成的库文件。
- 写时钟域电路、 读时钟域电路要分别定义不同的时钟。
- 低频情况下,跨时钟域同步器需要设置 wclk 和 rclk 之间的 false path。
- 高频情况下,尤其在 28nm工艺以下,需要检查两级触发器的延 迟,保证延迟低。
- P&R时,要注意将两级同步器放置在一起,不要被工具自动分开。
复位电路
逻辑电路的任何一个寄存器、存储器结构和其他逻辑单元都必须要附加复位逻辑电路,以保证电路能够从错误状态中恢复,可靠地工作。
复位电路的功能:
仿真的时候使电路进入初始状态或者其他预知状态;
对于综合实现的真实电路,通过复位使电路进入初始状态或者其他预知状态。
通常来说,时序电路是一个双稳态电路,上电之后必须要有一个初始态,才可以正常运行。组合逻辑电路,没有存储功能,不需要复位信号。
同步复位电路
同步复位是指当复位信号发生变化时,并不立即生效,只有当有效时钟沿采样到已变化的复位信号后,才对所有寄存器复位。
1 | module d_ff( |
2 | input clk, |
3 | input rstn, |
4 | input d, |
5 | output q |
6 | ); |
7 | always @(posedge clk) begin |
8 | if(!rstn) |
9 | q <= 0; |
10 | else |
11 | q <= d; |
12 | end |
13 | endmodule |
同步复位的优点:
- 因为它只有在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的毛刺。
- 可以使所设计的系统成为100%的同步时序电路,这便大大有利于时序分析,而且综合出来的fmax一般较高。
- 有利于仿真器的仿真。
同步复位缺点:
- 大多数逻辑器件的目标库内的DFF都只有异步复位端口,采用同步复位时,综合器就会在寄存器的数据输入端口插入组合逻辑,占用更多的逻辑资源。
- 同步复位依赖于时钟,如果电路中的时钟信号出现问题,无法完成复位。
- 对复位信号的脉冲宽度有要求,必须大于指定的时钟周期,由于线路上的延迟,可能需要多个时钟周期的复位脉冲宽度,且很难保证复位信号到达各个寄存器的时序。
同步复位实现结构示意图
同步复位信号的持续时间应该大于最慢的时钟周期。
异步复位电路
异步复位是指当复位信号有效沿到达时,无论时钟沿是否有效,都会立即对目标(如寄存器、 RAM 等)复位。
1 | module d_ff( |
2 | input clk, |
3 | input rstn, |
4 | input d, |
5 | output q |
6 | ); |
7 | always @(posedge clk or negedge rstn) begin |
8 | if(!rstn) |
9 | q <= 0; |
10 | else |
11 | q <= d; |
12 | end |
13 | endmodule |
异步复位的优点
- 大多数目标器件库的dff都有异步复位端口,因此采用异步复位可以节省资源.
- 设计相对简单。
- 异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR。
异步复位的缺点
- 在复位信号释放的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态。
- 复位信号容易受到毛刺的影响。
推荐的复位电路-异步复位,同步释放
异步复位:复位信号可以直接不受时钟信号影响,在任意时刻只要是低电平就能复位,即复位信号不需要和时钟同步。
同步释放:让复位信号取消的时候,必须跟时钟信号同步,即刚好跟时钟同沿。
简单异步复位,同步释放的代码及电路图
1 | module sync_async_reset ( |
2 | input clk, |
3 | input rst_i, |
4 | input data_a, |
5 | input data_b, |
6 | output out_a, |
7 | output out_b |
8 | ); |
9 | |
10 | reg d1, d2; |
11 | reg d3, d4; |
12 | assign out_a = d3; |
13 | assign out_b = d4; |
14 | assign rst_o = d2; |
15 | |
16 | always @ (posedge clock, negedge rst_i) begin |
17 | if (!rst_i) begin |
18 | d1 <= 1'b0; |
19 | end |
20 | else begin |
21 | d1 <= 1'b1; |
22 | end |
23 | end |
24 | |
25 | always @(posedge clock, negedge rst_i) begin |
26 | if(!rst_i) begin |
27 | d2 <= 1'b0; |
28 | end |
29 | else begin |
30 | d2 <= d1; |
31 | end |
32 | end |
33 | |
34 | always @ (posedge clock, negedge rst_o) begin |
35 | if (!rst_o) begin |
36 | d3 <= 1'b0; |
37 | d4 <= 1'b0; |
38 | end |
39 | else begin |
40 | d3 <= data_a; |
41 | d4 <= data_b; |
42 | end |
43 | end |
44 | endmodule |
异步复位,同步释放的优点
- 避免复位信号释放的时候造成亚稳态问题
- 快速复位:只要复位信号一有效,电路就处于复位状态。
- 有效捕捉复位:即使是短脉宽复位也不会丢失
- 有明确的复位撤销行为:复位的撤离是同步信号,因此有良好的的撤离时序和足够的恢复时间。
两级触发器上的复位响应
情况一:后级寄存器无法满足恢复时间要求
前一级寄存器的复位信号满足恢复时间的要求,复位能够正常进行撤离。
后一级寄存器违反了寄存器的要求。无论复位有没有正常的撤离,在T1时刻,后一级寄存器仍然会保持复位电平,也就是低电平。T2时刻后一级触发器的复位已经完全被撤除,d1完成复位撤离后的高电平能够被正常地传递。
情况二:前级寄存器无法满足恢复时间要求
T1时刻,前一级寄存器未被复位,后一级寄存器仍输出前一级地复位输出信号,即保持输出复位有效信号低电平。
T2时刻,由于前一级地输出有可能使1或0,因此后一级寄存器会输出清晰的高电平或者低电平。
若后一级寄存器在T2依旧输出复位电平,即rst_o为0,那么在T3时刻,电路输出的复位电平一定会撤离,也就是rst_o为高。
情况三:复位的捕捉
图中,即使异步复位信号是周期比时钟周期短的脉冲,在一个时钟周期内产生了异步复位。这种电路还是能够正确捕捉到这样的复位信号。
如图中,由于d2将a锁存了一个周期,最后输出一个比时钟周期长的复位信号rst_o。
思考:上电复位时或者门控时钟电路里,当电路中没有正常工作的时钟时,异步复位及同步撤离电路是否可以正常工作?
复位不依赖于输出,但是复位输出信号,需要依赖于时钟才能撤离
复位网络
在一个设计中,无论是同步复位还是异步复位,其扇出数量往往仅次于时钟网络。复位网络通常会被布线在全局网络上,在布线的时候需要控制各个路径的时钟偏移保持在大致相等的水平上,使复位能“同时”撤离。
树形拓扑的复位网络:
1、有缺陷的复位网络
两个复位信号在撤离时可能会存在一个周期的偏差, 在实际电路系统中,可能会导致时序错乱。
2、正确的复位分发技术
首先用两级同步器,对异步复位进行同步,得到了根复位信号之后,再对其用复位同步电路进行分发。由于同步后的根复位信号不会带来亚稳态问题,再分发过程中,再次适用两级寄存器对跟复位信号进行同步和分发,是很安全的。
分发后的各个子复位网络是各自独立的,并且扇出的数量比根复位网络要小很多。
布线时,子复位网络需要一一进行约束和时序分析