《硬件架构的艺术》笔记(二)

时钟和复位

2.1 同步设计

2.1.1避免使用行波计数器

        用触发器来驱动其他触发器的时钟输入端,一般会存在问题。由于第个触发器时钟到g的延而使第二个触发器的时钟输入产生偏,而且不能在每个时钟边沿都激活。用这种方式连接两个以上的触发器就会形成如图 2.1所示的行波计数器。注意,由于使用了更多的触发器,会使延迟累积增加,所以不推荐使用这种方式。

 2.1.2 门控时钟

        时钟线上的门控单元会导致时钟偏移并对毛刺敏感,并引入尖峰脉冲作用作用于触发器。含有门控时钟的设计在仿真时可能正常工作,但是在综合时就会出现问题

 2.1.3 双边沿或混合边沿时钟

        两个触发器由两个相位相反的时钟信号控制。这会为使用同步复位和使用插入扫描链困难,同时也会增加确定关键信号的路径的难度。

2.1.4 用触发器驱动另一个触发器的异步复位端 

        在图2.4 中,第二级触发器的输出不仅仅只受时钟边沿的影响,这违反了同步设计原理。此外,该电路还包含第二级触发器时钟和复位之间的潜在竞争条件。
        随后的章节介绍的一些方法可以避免使用上述不推荐的电路。

 2.2 推荐的设计技术

2.2.1 避免在设计中出现组合环路

        组合环路是数字设计中导致不稳定和不可靠的最常见因素。在同步设计中,所有反馈回路都应包含寄存器。组合环路建立了不含寄存器的直接反馈回路,这违背了同步设计原理。
        1、组合逻辑违反了同步设计原则,很容易产生振荡,毛刺和时序违规。
        2、组合逻辑实现的逻辑功能完全依赖于环路上的逻辑门延迟和布线延迟,当延迟发生改         变, 原来的逻辑功能也同样会发生变化,而且改变后的功能很难预测。
        3、组合逻辑会设计软件进入无尽的计算中,为了完成计算,一些EDA工具会将环路割断,而不同的EDA软件对环路割断处理的过程是不尽相同的,这种过程不但使电路的实现偏离了最初的设计意图,而且使电路的实现呈现不确定性。

 解决办法:

        1.  在组合环路中引入一个触发器或寄存器 

        2.  另一个是将寄存器的输出端通过组合逻辑反馈到同一个寄存器的异步端(异步复位)

  2.2.2 避免数字设计中的延迟链

        在用两个或者多个带有扇入和单扇出的连续节点产生延时是,就会形成延时链。通常将反相器链接在一起以增加延时,延时链通常出现在异步设计中,有时候解决其他组合逻辑导致的竞争条件
        1、增加设计对操作环境的敏感性,降低设计的可靠度
        2、增加设计移植到不同器件上的难度
解决方法:在设计中用同步技术取代异步技术

2.2.3 避免使用异步脉冲产生器

        设计通常要求基于某些事件产生脉冲。设计人员有时会使用延时链产生单个脉冲或一系列脉冲。这些技术是纯异步的,应尽可能避免使用。

        1. 将同一个触发信号接到两个输入与门或或门的输入端,但是对其中一个输入端的信号取反或加入延迟链。

assign    b = a & (~a);
assign    b = a | (~a);

脉冲的宽度取决于直接接到门输人端的信号和经过延迟后接到门输入端的信号的相对延迟。这与组合逻辑中由输入端变化引起毛刺的原理是一样的。这种技术通过使用延迟链人为地增加了毛刺宽度。

        2. 寄存器输出经过延迟链后驱动同一个寄存器的异步复位端。该寄存器本质上经过一个确定的延迟后对自身异步复位。

always@(posedge clk or negedge rst_n) begin
	if(!rst_n)
		q<=0;
	else
		q<=1;
end

assign rst_n=~q;

 推荐使用的方法:同步脉冲产生器电路

        1. 触发器输入起始处的同步脉冲产生器(上升沿检测) 

         2. 触发器输入末端的同步脉冲产生器(下降沿检测) 

         在上面的同步脉冲产生器中,脉冲宽度总是与时钟周期宽度相等。该脉冲产生器是可预测的,可以用时序分析进行验证,并易于移植到其他体系结构中,同时独立于具体的工艺。

2.2.4 避免使用锁存器

        在数字设计中,锁存器用来在新的值到来前保持原来信号的值。避免在所有可能的位置使用锁存器,而应用触发器代替。

        如图2.9所示,如果X和Y信号都变为高,因为锁存器由电平触发所以将它们同时开启会使电路产生振荡。

 锁存器危害:锁存器是连通模式的,即在数据输入和输出之间存在直接通路。输入端的毛刺能传递到输出端;锁存器的时序迷糊。

生成锁存器一般情况:

        1.  组合逻辑中不完整的 if esle 语句;

        2. 组合逻辑中 case 语句没有考虑所有情况,或缺少 default;

        3. 组合逻辑中,在 always 语句块的所有执行条件下赋值(如,一个变量没有在 if 语句的所有分支中赋值)。

 2.2.5 避免使用双边沿时钟

        使用双边沿时钟能达到双倍的吞吐率,但会有一系列的问题。

 使用双沿时钟遇到的问题

        1、不对称的时钟占空比会导致违背建立和保持时间;
        2、很难确定关键信号的路径;
        3、插入扫描链要求所有寄存器使用同样的时钟边沿(或者插入多路复用器保证在测试模式下使用单一时钟)。

        图2.13 中是一种使用单个时钟的通常等效流水线逻辑。注意,该同步电路要求的时钟频率事图2.12的两倍。

        在图2.12中,时钟非对称占空比可能导致违背建立和保持时间,而且扫描路径也不能很容易地通过触发器。
        这并不意味着永远不能使用双沿时钟。在对性能/速度要求很高的情况下,并且无法承受使用等效同步电路在 DFT 和验证方面所带来的额外开支时,也可以使用双沿时钟。

双边沿时钟的有点:1. 吞吐率提高;2. 降低功耗;

2.3 时钟方案

2.3.1 内部产生的时钟

        设计者应该尽可能避免在内部产生时钟,因为如果操作不当,它会导致设计功能和时序问题。由于组合逻辑搭建的时钟会产生毛刺,使功能出现问题,比如时钟毛刺会导致计数器误增的情况。而且窄毛刺会违背寄存器的最小脉冲宽度要求。产生内部时钟的组合逻辑也会增加时钟线上的延时,如果时钟偏移大于数据延迟,则违背寄存器的时序要求。                

always @(*)begin
 #50 clk = ~clk;
 end

解决方案:在组合逻辑的输出端增加一个寄存器,用寄存器的输出作为后面的时钟信号,以防止组合逻辑所产生的毛刺。

always@(posedge clk) begin
#50 clk_d <= clk;
end

        用来产生内部时钟的组合逻辑也会增加时钟线上的延迟。在某些情况下,时钟线上的逻辑延迟会导致时钟偏移比两个寄存器之间的数据路径延迟更大。如果时钟偏移大于数据延迟,就会违背寄存器的时序要求,设计的功能也不会正确。

注意: 此时,没有考虑数据通路的延迟。一种减少时钟偏移的方法是将产生的时钟放到 SOC 中高扇出且低偏移值的时钟树上。使用低偏移值时钟树有助于减少信号整体的时钟偏移。

2.3.2 时钟分频

        多数情况设计需要来自主时钟的分频时钟。在设计中要保证大多数时钟来自PLL。使用PLL避免异步时钟分频逻辑引起的许多问题。在对主时钟进行分频时,应该使用同步计数器或者状态机。保证总是由寄存器直接产生分频时钟信号,不要对计数器或状态机的输出进行解码,然后产生时钟信号,会导致毛刺和尖峰脉冲。

2.3.3 行波计数器

        ASIC设计人员常常使用行波计数器对时钟进行幂为2的分频,与其他同步计数方式相比,行波计数器使用的门数更少。行波计数器使用级联寄存器,即每个寄存器的输出引脚连接到下一级寄存器的时钟引脚上(见图2.18)。

         因为计数器在各阶段创建行波时钟,所以这种级联会导致问题。这些行波时钟会对 STA 和综合工具带来麻烦。所以应该尝试避免使用这种结构以减少验证的工作量。
        尽管使用行波计数器存在各种挑战和问题,但是在功耗较高的系统中很适合使用这种计数器,因为这样能大量降低由逻辑或SOC 所引起的峰值功耗

2.3.4 多路时钟

        时钟多路器用于同一个逻辑功能具有不同的时钟。

 如果能满足下面的标准,时钟多路操作就是可接受的:
        1. 在初始化配置后,时钟多路逻辑就不再改变。
        2. 在测试时,设计会绕过功能时钟多路逻辑而选择普通时钟。

        3.  在时钟切换时,寄存器始终处于复位状态。
        4. 在时钟切换时产生的短暂错误响应没有负面影响。
        如果设计中时钟切换很频繁,并且不在复位时切换,设计也不能容忍芯片中出现短暂的错误响应,就必须使用同步设计以确保寄存器没有违背时序,时钟信号上不出现毛刺同时没有竞争条件或其他麻烦。

2.3.5 同步时钟使能和门控时钟

        门控时钟使用使能信号开关时钟,实现对某些门控电路的控制。

         门控时钟是减少功耗的有力手段。在时钟被门控关闭后,该时钟网络和其中的寄存器都会停止翻转,因此它们的功耗减少。然而,由于门控时钟并不是同步设计方案的一部分,因此会显著增加设计时间和验证的工作量。门控时钟会增加时钟偏移并对毛刺敏感,所以能导致设计失败。
        通过使用同步的时钟使能,可以纯同步方式关闭时钟域。然而,在使用同步时钟使能方案时,时钟树一直保持翻转而且每个触发器的内部电路保持活跃(虽然触发器输出值没有改变),这样无法降低功耗。同步时钟使能技术如图2.21所示。

         由于时钟网络仍然在不停翻转,因此同步时钟使能的时钟方案不能像门控时钟那样从源头减少功耗,但是通过使某些寄存器失效,可以实现与门控时钟同样的功能。如图 2.21 所示,根据使能信号,每个触发器数据输入端前面的多路器要么载人新的数据,要么复制寄存器的输出。

2.4  门控时钟方法学

        在传统的同步设计风格中,系统时钟连接到每个寄存器的时钟端。这使得功耗主要由三个部分组成。
1)在每个时钟沿变化的组合逻辑所产生的功耗 (由于触发器驱动这些组合逻辑)。
2)由触发器产生的功耗 (即使在触发器的输入和内部状态未变化该功仍然存在。
3)设计中时钟产
        对时钟路径进行门控能大幅降低触发器的功耗。门控时钟可以存在于时钟树的根部、末端,或两者之间的任何位置。
        由于时钟树几乎消耗了整个芯片功耗的50%,因此最好始终在根部产生或关闭时钟,以使整个时钟树都关闭,而不是沿时钟树在末端才关闭时钟。

        图2.22 是一个带门控时钟的三位计数器。
除了把门控时钟器件插入时钟网络中,该电路与传统的实现方式是相同的,这样只有在 INC 输人为高电平时才由时钟驱动触发器。当INC 输人为低电平时,触发器无时钟输入,因此保持原来的值。这样就节省了触发器前面的3个多路器,这3个多路器按图221 所示的方式在由同步时钟使能实现门控时插入。当实现大的寄存器块时,这会节省大量的面积。

 2.4.1 不含锁存器的门控时钟电路

        不含锁存器的门控时钟使用一个简单的“与”门或“或”门实现(取决于发器使用哪个边沿),如图2.23 所示。
        为了避免过早截断时钟脉冲或误产生多个时钟脉冲(或时钟上的毛刺),正确的操作强制要求使能信号从时钟活跃沿(上升沿)起到时钟不活跃沿(下降沿) 止一直保持常量。
        图2.24 说明了未满足上述要求而使产生的时钟过早被截断的情况这种限制使得在基于单时钟触发器的设计中不适合使用不含锁存器的门控时钟。

 2.4.2 基于锁存器的门控时钟电路

        基于锁存器的门控时钟风格向设计中加人了一个电平敏感的锁存器以在时钟活跃沿和不活跃沿之间保持使能信号不变,这样就无须依靠门控电路本身来满足这一要求了,如图2.25所示。

         由于锁存器能捕捉到使能信号并使它保持到产生完整的时钟脉冲,因此使能信号只需要在时钟上升沿附近保持稳定即可。
        使用这种技术,每次只需要改变门的一个输入端来打开或关闭时钟就能保证电路的输出不含任何毛刺或尖峰脉冲了。

        为了保证较高的生产缺陷覆盖率,有必要保证在使用扫描方法学时门控时钟电路是完全可控和可观察的。加入控制信号,使得设计中所有触发器不管使能值是多少都能被时钟驱动,这样就能使扫描链按正常方式移动扫描数据了。
        该信号可以在锁存器前先与使能信号进行一次或操作,并可将该信号连接到指示进入扫描测试中的测试模式信号上,或连接到只在扫描移位时有效的扫描使能信号上。
        修改后的电路如图2.26 所示。大多数ASIC生产商都提供“门控时钟单元”作为标准单元库的一部分。

2.4.3 门控信号

        对设计的特殊部分使用门控信号能提高能效。与门控时钟的概念相似,门控信号减少了与时钟无关信号的变化。最常见的例子是解码器使能。
        在地址解码机制中,地址信号会在所有目标模块解码器中变化。解码器输人端的切换行为会导致大量的门翻转。可以用使能或选择信号阻止切换行为的传播,但是可能会使逻辑变成稍为复杂 (见图 2.27)

 2.4.4 重组数据路径以减少转换传播

        某些数据路径中的元件,如解码器或比较器,以及“毛刺的”逻辑会显著增加功耗。由较迟到达的信号或偏移所引起的毛刺,可以穿过其他数据通路器件和逻辑到达寄存器。因为信号变化引起了逻辑电平的翻转,所以这种传播消耗了更多的能量。为了减少这种损耗,设计者需要重新编写HDL代码以尽可能地缩短传播路径的长度。图2.28 举例说明了两种优先级多路器的实现方式,这里“毛刺的”和“稳定的”条件有不同的排序方式。

 2.5 复位信号的设计策略

        复位最基本的目的是使 SoC 进人一个能进行稳定操作的确定状态。这可以避免 SoC 在上电后进行入随机状态而死机。一旦 SoC 生产出来,是否需要对 SoC 使用复位就由系统、SoC 的应用环境及 SoC 的自身的设计方式来决定。好的设计指南会在系统没有明确要求的情况下为 SoC 中的每个触发器都提供复位信号。在某些情况下,当流水线的寄存器(移位寄存器触发器) 在高速应用中使用时,应该去掉某些存器的复位信号以使设计达到更高性能。

2.5.1 用同步复位进行设计

        同步复位的复位信号只有在时钟的有效沿到来时才能影响或者复位触发器的状态。
        由于复位树的高扇出,复位相对于时钟周期可能是一个“迟到的信号”。即使复位信号经过了复位缓冲树的缓冲,也要尽可能减少其到达本地逻辑前穿过的逻辑数量。

module load_syn_dff (clk, in , out, load, rst_n);
input    clk,in,load,rest_n;
output    out;

always@(posedge clk) begin
	if(!rst_n)
		out<=1'b0;    //sync reset
	else if(load)
		out<=in;      //sync
end

 使用同步复位会出现一个问题是综合工具无法分辨复位信号和其他信号的区别,可能会产生以下电路结构:

同步复位的优点:
(1)确保电路同步
(2)会综合为更小的触发器
(3)同步复位确保复位只发生在有效时钟沿,时钟可以作为过滤毛刺的方法。

同步复位的缺点:
(1)同步复位可能需要一个脉冲展宽器,以保证复位信号出现在时钟有效沿处,增加了逻辑器件
(2)如果复位由 SoC 的组合逻辑产生或复位必定经过多级组合逻辑就会存在潜在的问题。在仿真过程中,根据复位的产生方式或在功能模块上的使用方式,复位信号可能标记为 X。问题并不是得到了一个什么样的复位信号,而是该复位信号是否可以容易地被外部引脚控制。
(3)如果使用门控时钟,在复位信号发出时,时钟可能关闭(只能使用异步复位)

        如果ASIC/FPGA 有内部三态总线,就迫切需要时钟来产生复位动作为了阻止芯片上电时内部三态总线出现竞争,芯片应当有图 2.32 所示的异步上电复位。

         可以使用同步复位信号;但是也必须使用复位信号直接撤销三态使能(见图2.33)。这种同步技术的优点是能简化复位 -高阻这路径的时序分析。

 2.5.2 使用异步复位进行设计

        异步复位触发器在设计时加入一个复位引脚,当触发器复位端触发复位信号,进入复位状态。     

always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		out<=1'b0;    
	else if(load)
		out<=in;
end

异步复位的优点:
(1)使用异步复位的最大好处在于只要生产方提供的库中有带有异步复位的触发器,就能保证数据路径上是干净的。对于数据路径时序已经很紧的设计,无法承担由于加人同步复位带来的额外单元门和额外线路延迟。而使用异步复位,设计人员就能保证没有任何复位信号加在数据路径上(见图2.35)。
(2)异步复位最明显的优势电路是不管有没有时钟都能复位。综合工具能自动推断出异步复位而不必加入任何综合参数。

异步复位的缺点:
(1)异步复位不管产生或撤销复位信号,都是一个异步过程。加入异步复位在触发器时钟有效沿附近释放,输出就会进入亚稳态
(2)复位电路源头存在毛刺问题而引发的伪复位。

2.5.3 带异步复位和异步置位的触发器

always @(posedge clk or negedge rst_n or negedge set_n)begin 
    if(~rst_n)
        out <= 1'b0;    //async reset
    else if(~set_n)
        out <= 1'b1;    //async set
    else 
        our <= in;
end 

2.5.4 移除异步复位的问题

        移除系统中的异步复位会使芯片进入不稳定的未知状态。 在使用同步复位时,复位信号的前沿和尾沿必须远离时钟的有效边沿。

       两个潜在问题:

        (1) 违背复位恢复时间。复位恢复时间指复位撤销后和时钟再一次置高之间的时间。违背复位恢复时间会使寄存器数据输出端出现数据完整性或亚稳态问题。
        (2) 复位移除会在不同时序元件的不同时钟周期内发生。当复位移除与时钟上升沿异步时,在复位信号和/或时钟信号上不同的传播延迟会导致某些寄存器或触发器提前退出复位状态。

 2.5.5 复位同步器

        针对移除异步复位的问题,采用异步复位同步释放:

// 将复位信号与时钟脉冲同步需要两个触发器 //
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
		begin 
			reg1<=0;
			reg2<=0;
		end
	else
		begin
			reg1<=1;
			reg2<=reg1;
		end
	end

2.5.6 过滤复位毛刺

        异步复位对毛刺很迷干,这就意味着任何满足触发器最小复位脉冲宽度的额输入都能引发的输入都能硬气触发器复位。

过滤复位毛刺的方法 :
(1)复位输入引脚必须是施密特触发器
(2)采用延迟复位信号与复位信号做或门,过滤掉毛刺信号

 2.6 控制时钟偏移

        整个芯片中时钟信号到达时间的差异称为时钟偏移。时序必须满足寄存器建立和保持时间的要求是基本的设计原则。数据传播延迟和时钟偏移都用于与之相关的计算。对于同一时钟边沿偏移较大的寄存器,如果顺序相邻,那么在向其提供时钟时,就会有违背时序的潜在风险,甚至使功能失效。这是 ASIC 设计失败最主要的原因。
        图2.42是两个顺序相邻触发器时钟偏移的例子。

                                                            Tskew=Tci-Tcj

 2.6.1 短路径问题

        时钟偏移中的短路径问题与触发器的保持时间违背很相似。在两个相邻触发器之间的数据传播延迟比时钟偏移还短时,就会出现该问题 图2.43中的电路图和时序图可以说明短路径问题。
        由于同一个时钟沿到达第二个触发器比新数据要慢,因此第二个触发器在与第一个触发器同样的边沿处,切换为与第一个触发器同样的值。这会使 U2 在与U1 同一个边沿处移位同样的数据,最终导致功能错误。

 2.6.2 时钟偏移和短路径分析

 2.6.3 使时钟偏移最小化

        将时钟偏移减至最小值是解决短路径问题的最好方式。将设计中的时钟偏移保持在触发器的最小延迟之下能提高设计对所有短路径问题的健壮性。

(1)在数据路径上加入延迟

        如图2.44所示,通过在数路径上增加延(Trdq1)而最使整个数据路径的延迟大于时钟偏移,可以消除短路径问题。在数据路径中插入的延迟必须足够大以保证数据路径延迟一定能大于时钟偏移。

 (2) 时钟反转 (在发送寄存器接受时钟沿前,时钟会先驱动接受触发器读入发送值)

 (3)交替相位时钟

(1)交替使用时钟沿:为时钟偏移提供半个时钟周期的余量。
(2)交替使用时钟相位:相邻触发器组有同一时钟的两个不同相位驱动。
(3)行波时钟:只有当上一个触发器输出翻转,下一个触发器发挥被时钟驱动,避免了数据传播延迟比时钟偏移还短时。

 (4) 平衡线路长度

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值