CRG设计之复位

1. 前言

        CRG(Clock and Reset Generation,时钟复位生成模块) 模块扮演着关键角色。这个模块负责为整个系统提供稳定可靠的时钟信号,同时在系统上电或出现故障时生成复位信号,确保各个模块按预期运行。简而言之,CRG模块就像是SoC系统的心脏,提供着整个系统需要的时钟和复位信号。

        出于时钟复位结构规范设计和DFT可控的目的,一般会把相关电路放在一个集中的模块中管理,由专门的设计人员按需求进行设计与维护。对于时钟分频、MUX、切换、DFT测试结构埋入等等,均在模块内部实现。复位类似。

        涉及到的主要技术:自动解复位,复位顺序,复位切频,时钟门控,亚稳态的恢复,异步复位同步释放,毛刺清除的技术细节。不用公司,不同芯片,因为场景不同,对于CRG的要求也不尽相同,但是具体的技术原理大同小异。CRG中主要包含这些东西:

2. 复位基本概念

2.1 复位源

        SOC芯片中的reset源可以分为片外reset源和片内reset源。片外的reset源一般有来自PMIC的power reset,来自系统板上的pad reset,jtag reset,如果有pcie可能还有PErst等。片内的reset源有watchdog timeout reset,software reset及其他硬件机制产生的reset等。一个模块的reset可能由几种或者全部reset源控制。

        复位的作用:使电路(主要是触发器)进入一个能稳定操作的确定状态,主要表现为:

  • 使电路从确定的初始状态下开始运行
  • 修复系统,实现故障自愈,使电路从错误状态回到可以控制的确定状态。说到错误处理需要说明的是,不是说MCU通过复位寄存器给出复位信号后,相应的子模块便马上复位,子模块收到复位信号后,有的直接复位,有的需要延时复位。延时的原因可能是本模块立即复位会造成其他模块出错,或者有些机密数据需要清除,也可能是该模块中有需要保护的数据,在复位前需要将其存储到flash或备份ram中,再复位等等。

        复位源:

        1、冷复位:冷复位是和电源电压相关的复位,比如硬复位,上电复位,欠压复位;
        上电复位:指的是芯片上电后,电压监测电路(POR)检测到电源电压VDD上升到CMOS逻辑可以运动的电压,就会产生一个复位脉冲,这个复位脉冲就会引起芯片系统的全局复位。在POR复位信号给出后,此时提供时钟的晶振或者OSC开始提供时钟,但是这时的时钟其实并不稳定,所以还需要等待一定时长,等待时钟和电压足够稳定再对系统复位。也就是说,其实POR信号是对计时模块先复位,计时一定时长后,比如STM32F1芯片就先计时4096个机器周期,再对PLL或者某些对时钟依赖不强的IP复位,比如FLASH等,等到PLL稳定后再对一些功能IP和MCU复位,MCU复位后还要完成初始化配置,可见上电复位代价确实很高。

        欠压复位:指已经完成上电的芯片中,低电压检测器在电压尚未跌落到不能维持工作之前,预先提供警告信号或复位信号。需要说明的是,软复位的复位信号一旦给出,子模块不一定马上复位,同样的硬复位也是有一个过程的。
        2、热复位:主要是无需掉电的复位,例如:看门狗复位,软复位,按键复位。
        软复位:通过MCU对复位源寄存器写0/1值来控制某个模块或某个系统的复位,这种复位方式用来错误处理。
        看门狗复位:看门狗复位是看门狗电路在程序跑飞后给出复位信号引发的复位,看门狗有两根信号线

  • 一根由MCU发出的喂狗信号,这个信号的作用是让定时器清零,重新开始计数。
  • 看门狗发出的复位信号,当系统出现干扰没有对看门狗进行清零,此时看门狗就会溢出产生复位信号。

        复位控制:系统、应用环境决定何时复位

2.2 复位结构

3. 复位类型

3.1 同步复位

        复位信号在时钟有效沿到来时生效。同步复位由于需要时钟才能工作,并且复位信号需要保持1个clock cycle以上,由于这些缺点,在如今的soc设计中用的已经比较少了。

优点:

  • 同步复位会综合成更小的触发器,特别当reset生成逻辑电路作为触发器D输入,但是这种情况下组合逻辑电路的数量变多,所以总的门电路节省不是那么显著。
  • 同步复位确保电路100%是同步的,综合得到的时钟频率较高。
  • 同步复位确保复位只发生在时钟有效边沿,对小的复位毛刺来说,时钟就像滤波器。
  • 在一些设计中,复位必须由内部条件产生。同步复位能过滤时钟间逻辑等式的毛刺。
  • 通过使用同步重置和预先确定的时钟数量作为复位过程的一部分。可以在复位缓冲区树中使用触发器,来帮助将缓冲树的时序保持在一个时钟周期以内。

缺点:

  • 不是所有的库都有自带同步reset的FF, 但是可以通过把reset当作数据输入来解决;
  • 同步复位需要一个脉冲延伸器保证复位脉冲足够宽能,够被有效时钟沿采集到;特别是在多时钟设计中;
  • 同步复位电路必须要有一个时钟来复位。如果用门控时钟来省电,那么没有时钟的时候就不能复位;
  • 如果电路中有三态总线,那么上电时必须用异步复位,如果用同步复位,reset必须能够复位三态信号的enable信号。

3.1.1 同步复位问题

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

        解决方法:一方面这个只是综合工具的问题,一般综合工具会自动识别在敏感列表里面又在条件表达式信号中的第一个信号为复位信号;另一方面,可以在RTL代码编写的时候,加入相关的综合指令,让综合的时候把复位逻辑靠近触发器。

        问题2:由于同步复位需要在时钟沿的触发下才能起作用,复位信号是以短脉冲的方式出现时,时钟沿就有可能错失这个复位信号,导致复位脉冲丢失,同步复位电路没有起到作用。

        解决办法:一方面,可以采用脉冲捕捉电路。另一方面,可以将复位信号进行脉冲扩展,维持足够长的时间,这个可以通过一个小的计数器实现。

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

  解决方法:使用内置的同步复位触发器;综合的时候加入相关的综合指令,这个和问题1类似。

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

  解决方法:不建议使用内部产生的复位信号;使用异步复位。

门控时钟的同步复位可能无效:

  问题5:使用门控时钟的时候,由于复位信号依赖于时钟,在复位信号发出的时候,时钟可能关闭了,这个时候就会导致实际的电路没有被复位,如下图所示:

  解决方法:只能使用异步复位,并在时钟恢复前移除异步复位。

        问题6:总线设计中的同步复位问题:

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

  解决办法:为了防止芯片上电时内部总线出现竞争,有一下两种解决办法,一种是采用异步上电复位,如下图所示:

  这个时候使用了异步复位,使能信号oe输出0,也就是有了初始的状态。

    另一种方法是使用复位信号能直接撤销三态使能的电路,如下所示: 

        从电路图中可以看到复位信号一方面控制了复位逻辑,另一方面控制了三态的使能端;这种技术简化了复位-高阻这个条路径的时序分析。

3.2 异步复位

        不依赖时钟,立即生效。纯异步复位很容易出现recovery time和removal time的违例,从而产生亚稳态的传播。异步复位触发器则是在设计触发器的时候加入了一个复位引脚,也就是说复位逻辑集成在触发器里面。(一般情况下)低电平的复位信号到达触发器的复位端时,触发器进入复位状态,直到复位信号撤离。

        优点:

  • vendor库里面有异步复位FF, 这样datapath就十分干净。不用把reset与数据做逻辑,这样复位路径上就不会有额外的延时,也不会受外部信号的干扰。
  • 电路reset和时钟无关,不管有没有时钟,都可以reset。好处是可以实时复位,也可以加在门控时钟里面。门控时钟是低功耗设计的重要方法。
  • 异步复位不需要加入综合指令,综合工具就能自动识别。

        缺点:

  • 在复位信号释放(reset)的时候容易出现问题。具体来说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态;
  • 复位信号容易受到毛刺影响。

        异步复位的最大问题是它们是异步的,在复位阶段和解复位阶段(复位撤离)都是异步的。复位阶段不是问题,解复位才是问题。如果在触发器的活动时钟边缘或附近释放异步复位,则触发器的输出可能变为亚稳态,这样电路的复位状态可能会丢失,解复位失败。

异步复位撤离问题:

        recovery time:指在时钟有效沿到来之前,复位信号保持高电平的最短时间。即复位信号变到非复位状态的电平必须在clk之前一定的时间到达。满足这个Recovery time,可以确保在时钟有效沿来临时,异步复位信号处于无效状态,从而确保正常的数据采样,类似于同步电路中的setup time。

        remove time:指在时钟有效沿来临之后,异步复位信号需要继续保持有效的最短时间。满足这个最短时间才能确保对寄存器进行正常的复位。,类似于同步电路中的hold time。

        如图所示,rst_n为0表示复位,clk上升沿触发,rst_n从0到1的上升沿与时钟上升沿必须不小于recovery time才能保证寄存器恢复到正常状态。rst_n保持为0经过clk上升沿后仍需要保持一段时间,才能保证寄存器有效复位,防止亚稳态。

        解决办法:异步复位,同步释放

4. 异步复位同步撤离

4.1 为什么需要异步复位,同步撤离

        原因主要是:

  • 如果同步复位,同步释放,需要对复位信号进行同步,对于外部复位来讲容易形成锁死的问题。这是个鸡生蛋蛋生鸡的问题。复位信号用寄存器同步,然后用同步后的信号复位寄存器,我复位我自己?所以同步复位同步释放多用于软复位。
  • 如果异步复位,异步释放,异步的释放操作非常容易导致亚稳态。相当于没有复位
  • 如果同步复位,异步释放,emmm 感觉上一般没有人这么折腾自己。

        所以就剩下了一种办法,异步复位,同步释放。这个较为简单和典型。记住即可。硬复位信号都应该这么产生。

4.2 亚稳态问题

        为了解决异步复位的问题,一种处理方法是在复位信号送入模块前,先经过异步复位同步释放模块,如下图,这样PR工具会自动检查模块中DFF的时序并修正,直到没有recovery和removal的violation。

        异步复位同步释放的reset在clock上升沿释放,并且一个周期内必须到达每个dff,如果模块比较大,reset在一个周期内到达不了每个dff有可能会有风险。可以使用另一种处理方法,通过控制clock的开关,在reset的时候,停掉clock,这样也可以达到同样的效果。等复位完了,再开启模块时钟,再启动模块工作。这种流程可以保证不会出现recovery和removal的问题,因为复位置起撤销时都没有时钟。

4.2.1 方案一

        避免这种情况的一种方法是在具有异步复位的寄存器之后添加几个跟随器寄存器,并在设计中使用这些寄存器的输出。 从动寄存器以消除亚稳性问题的方式使数据与时钟同步。 这些寄存器在设备中可以放置得越近,越能使路由延迟最小,从而减少数据到达时间并增加MTBF。 请注意,重要的是,这些跟随器寄存器本身不要复位,而是通过“刷新”其当前状态或初始状态在几个时钟周期内初始化。 通常,对于没有反馈电路的初始化这样的没有反馈电路的流水线设计,当设计在退出复位后可以等待几个周期再开始操作时,这种复位是可以接受的。
   

        等效的Verilog代码显示在下面的图13中。 请注意,这与同步重置代码有何不同。 现在,复位的有效沿在程序块的灵敏度列表中。 同样重要的是,跟随器寄存器不在第一个程序块的“其他”部分中,因为这将推断出跟随器寄存器上的时钟使能,而复位信号的反相与时钟使能相关。 跟随器寄存器应位于单独的程序块中,如使用非阻塞分配所示。

        约束异步复位很简单。 根据定义,异步复位与其正在复位的寄存器的时钟域具有不确定的关系。 因此,无法对这些复位进行静态时序分析。 通常使用set_false_path语句剪切它们(如图14底部所示)。 由于不知道寄存器中复位与时钟之间的关系,因此无法在TimeQuest中为此路径运行恢复和删除分析。 尝试这样做将不会报告任何路径。 即使没有错误的路径声明切入该路径,也不会报告要恢复和删除的路径。

4.2.2 方案二

        异步复位的最大问题也许又与reset removal有关,由于器件内的寄存器放置和布线,不能保证与复位连接的每个寄存器与时钟的时序关系相同。 这样做的结果是,在给定的时钟周期内,某些寄存器将退出复位状态,而另一些寄存器直到下一个时钟周期才复位。 这可能会对反馈电路造成灾难性影响,其中一个寄存器的下一个输出取决于其他寄存器的当前输出。

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

        实际情况一般不是那么理想的,当不是理想的情况下,也就是说复位信号到达目标寄存器存在时钟偏移,并且复位信号有可能在时钟有效沿附近撤离,这个时候复位器出现的问题就有三种:第一级OK,第二级出现问题;第一级出现问题,第二级OK;两级都出现问题。下面我们就来看看这三种情况下产生的复位信号是什么情况:

        第一级的撤离没有问题,第二级的撤离出现在时钟的有效沿附近,也就是说第二级的D触发器的撤离时间不满足复位恢复时间或者去除时间,这时候的时序图如下所示:      

        我们可以看到无论是触发器判断此刻是复位还是不复位,输出都是一样的,也就是说,输出rst_n不是亚稳态,而是确定的值。

  第一级的撤离出现问题,第二级的撤离没有问题,这时候的时序图如下所示:

        我们可以看到,第一级触发器虽然产生了亚稳态,但是由于第二级触发器的存在,亚稳态并没有传播下去,得到的复位信号依然是干净的,只不过这个复位信号可能延长多一个周期而已(这是因为亚稳态稳定后的可能态引起的)。

  最极端的一种情况是,两级的撤离都不满足复位恢复时间或者去除时间,时序图如下所示:

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

  由此我们可以看到,异步复位的同步撤离能够有效地解决撤离导致的复位恢复时间或者去除时间不足的问题,同时把复位信号同步化,解决了复位撤离偏移的问题。

4.2.3 方案三

        当涉及PLL时钟时,需要特别考虑。 应使用输入reset_n(在这种情况下为反相)而不是同步复位来复位PLL的复位。 另外,优良作法是将PLL的锁定输出用作同步器寄存器的时钟使能。 这样可以防止同步复位在PLL时钟稳定之前消失。

        此原理图的Verilog等效图如图所示。

        请注意,同步器寄存器的程序块现在具有锁定信号的条件,该条件会合成为寄存器的时钟使能。 还要注意靠近底部的PLL实例,第二个程序块的时钟现在是PLL的输出时钟pll_clk。 这些是向电路添加PLL时所需的唯一更改。

        带PLL的时序约束与不带PLL的时序约束类似,不同之处在于,现在必须为PLL输出时钟添加create_Generated_clock语句。

4.3 毛刺问题

        由于异步复位和时钟无关,任何一个毛刺都可以引起复位。这是一个reset源的问题。下面的电路可以过滤毛刺,主要原理是把输入源与上它的延时来消除毛刺

        

        但是这并不是一个很完美的设计,主要原因是delay单元的实现,因为不同温度不同制程下,delay值可能会不同。有的库里面包含Delay宏,有的没有;没有的话就需要手动增加delay或者插buffer,同时增加约束让delay不被综合掉。

        同时rst_n 输入也必须是一个史密斯触发器pad,进一步消除抖动。并不是所有的系统都需要增加防抖,要根据应用范围来判断。

5. 复位树

        复位树和时钟树一样应该引起重视,因为典型的数字电路中,reset的负载和clock的负载数量一般是相当的。不管是同步复位还是异步复位,对复位树都是有时序要求的。一个典型的复位树如下图所示:

        时钟分布树和复位分布树之间的一个重要区别是时钟树需要紧密平衡分布重置之间的偏差(skew)。与时钟信号不同,只要与复位信号相关的延迟足够短,允许在一个时钟周期内传播所有复位负载,并且仍然满足所有目标寄存器和触发器的恢复时间,那么复位信号之间的偏差(skew)就不是关键。

        另外一个需要考虑的问题是,时钟树和复位树之间的关系。到底用那个时钟来驱动复位树的FF呢?如果能够用分支clock来驱动master reset的FF那最好了,但是在大多数情况下,没有足够的时间让时钟脉冲遍历时钟树、时钟复位驱动触发器,然后让复位遍历复位树,所有这些都在一个时钟周期内完成。这种情况如下图所示:

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

5.1 同步复位树

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

        同步复位时钟树如下所示:

        采用这种技术,同步复位信号可以像其他数据信号一样处理,设计中每个模块的timing分析都很容易,复位树的每个阶段都有合理的扇出。

5.2 异步复位树

        对异步复位,是通过复位同步器来完成复位树的建立。即每个层级都加上一个异步复位同步器。如下图所示:

        异步复位树和同步复位树有点相似,但是这里的异步复位同步器是两级的FF。这种异步复位树,复位时可以所有的FF都同时复位,但是解复位必须要几个cycle才能完成。

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

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

        在使用异步复位时,至关重要的是,设计人员要在DC和PT中使用设置的适当变量,以确保从复位同步触发器的Q-output驱动的异步复位得到缓冲(如果需要的话)和timed。DC和PT都可以并且将时间按照本地时钟进行异步复位输入,如果设置了以下变量:

        这些设置应该是Synopsys的默认设置(只要确保它们是环境设置)。正确设置这些标志和使用分布式复位同步器后,就可以不用类似时钟树去构建缓冲复位树了。

5.3 多时钟域复位

        对于多时钟域的设计,每个时钟域必须有自己单独的复位同步器和分布式复位树。这样才能保证reset能满足不用时钟域的reset recovery time。如下图所示:

        对于多个时钟域的解复位顺序有两种情况:

        1)大部分多时钟域的设计,解复位的顺序并没有特殊要求。即当前时钟域解复位的时间点,在另一个时钟域的精确时间点并不重要。通常来说,跨时钟域的设计,本身就会带来延时的不确定行。这种情况下,上面的单独建立不同时钟域的复位结构就足够了。

        2) 有些多时钟设计,复位解除必须按顺序进行。这种设计,可以使用优先级的复位结构如下所示:

        这种结构,除了最高优先级的同步器输入是 tied 1, 其他的输入都是上一优先级的输出。复位顺序绝对SOC芯片里的重中之重。复位顺序错了会造成比较严重的问题。

  • 第一步是外部RESET或者watchdog产生RESET。
  • 第二步是RSTGEN接受上面两个reset, 简单处理产生always on domain reset (AON RST),这个always on rst会复位watchdog, RTC, PMU等所有位于系统外设组内的部件。
  • 第三四步均在PMU执行。先复位外设,再复位核心。

        经过4个步骤,芯片可以顺利复位。此处需要注意的是外部RESET pin经过特殊设计(其实就是加个电容电阻)可以实现上电出个复位信号的效果,既POWER ON RESET。

5.4 RSTGEN的设计

        RSTGEN的设计还是比较简单的。EXT和watchdog的输入做一个或。然后把信号拉长一些(RESET STRETCHER)做个异步复位同步释放就得到了常开时钟域的RESET。如果比较鲁棒的设计的话还要对外部的RESET加个施密特触发器,防止对芯片的意外RESET。

5.5 异步复位的DFT

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值