状态保持和恢复方法
保留寄存器
在电源门控的同时提供状态保留的另一种方法是用保留寄存器替换标准寄存器。保留寄存器包含一个“影子”寄存器,它可以在关机期间保持寄存器状态并在通电时恢复它。与主寄存器不同,影子寄存器始终是通电的。
图5-6显示了两个保留寄存器。在每个情况下,主寄存器-触发器的主和从锁存由开关电源轨“VDD SW”供电。D,CLK和RESETN引脚都在主寄存器上操作,驱动O输出。
此外,还有一个影子寄存器“RET”,用于保存和恢复主寄存器的状态。影子寄存器由常开电压轨上的“VDD”提供电源。
使用图5-6左侧所示的寄存器,当SAVE有效时,主寄存器的状态被加载到影子寄存器中。当断言RESTORE时,影子寄存器的状态将被加载回主寄存器。“SAVE”和“RESTORE”是电平敏感信号。
使用如图5-6右侧所示的寄存器,当RETAIN升高时,主寄存器的状态被加载到影子寄存器中。当RETAIN下降时,影子寄存器的状态被加载回主寄存器。RETAIN是一种边缘敏感信号。
现实世界的保留寄存器都有一些面积开销,通常是20%或更多。一些保留寄存器包含保护带,以尽可能将保留状态寄存器与功率门控晶体管隔离开来以保证可靠性。在这种情况下,面积开销可能高达50%或更多。在具有大量寄存器的设计中,这个面积的影响可能非常大。
不幸的是,如果使用片上保留策略,这种开销是不可避免的。可以考虑通过一些替代方案进行实现,例如只使用低泄漏,高阈值寄存器,并将这些连接到常开电源轨。然后,我们只需在两级寄存器之间对所有高泄漏的组合逻辑进行电源门控。然而,在任何合理大小的块中,复位和时钟网络通常都必须使用高泄漏、低阈值缓冲区树来满足时序要求。这些缓冲树对泄漏的占比很大,所以它们必须是电源门控的。但一旦这些节点被电源门控,时钟和复位输出就会不确定并且破坏寄存器。
除了面积代价,保留寄存器的使用需要一个更复杂的电源控制器。
用于保持的电源控制器设计
作为电源管理控制状态机的一部分,控制器必须管理保存和恢复信号的显式顺序。
影子寄存器可能比主寄存器慢,但是我们需要确保在整个保存操作中主寄存器中的值是稳定的。出于这个原因,大多数设计师设计在执行保存之前就停止了时钟。但是保存操作必须在断电前完成。
在电源恢复和电源门控状态消退之前,不能执行恢复。恢复操作必须在新值加载到主寄存器之前完成。由于这个原因,大多数设计人员直到恢复操作完成后才重新启动时钟。
虽然电源门控控制器在设计上需要谨慎,但在实现过程中可以自动完成标准触发器的保持寄存器的实际替换。类似地,保存/恢复控制信号的连接可以自动连接到保留寄存器。这些控制信号需要作为常开域网络来实现,以避免在电源门控期间的状态丢失,但除此之外,RTL设计可以透明地处理这些信号。
使用保留寄存器的优点之一是它允许保留策略对 RTL 设计者在很大程度上是透明的。在这个角度上看,它密切关联着自动扫描插入和连接的模型。为了使保持状态对RTL设计保持透明,在保存期间时钟和复位都不能被激活。否则,RTL设计必须明确处理保存/恢复行为和时钟/复位行为之间的冲突。
为了最大限度的减少泄漏,时钟和复位树很可能在断电时关闭。为了防止这些浮动信号(模拟中的X)损坏保留寄存器,保留寄存器必须优先于时钟和复位。在设计电源门控控制器时,重要的是了解电源门控库中可变单元的行为,以确保影子寄存器不会因时钟和复位浮动而损坏。
部分状态保留与全状态保留
电源控制的关键架构决策之一是在断电期间保留多少状态。保留块的完整状态—即用保留寄存器替换所有寄存器—提供了最健壮、最容易验证和最透明的电源门控形式。
然而在一些设计中,完全状态保留的面积代价证明了部分状态保留是合理的—只保留部分块的内部状态。但保留部分状态会带来一些重大挑战。
在部分状态保留中,当只保存和恢复架构层次的状态时,我们面临的挑战是如何确保所有非保留寄存器在合法、安全、可验证的状态下运行。
非保留寄存器的候选示例有FIFOs、内存和计数器。将这些模块转换为保留寄存器是相当昂贵的。在某些设计中,可能只需要确保它们达到已知状态就可以了。对于FIFO,这意味着复位FIFO控制器以表明FIFO为空。对于内存,我们可以复位内存控制器,使它认为内存未初始化。我们可以把计数器重置为零。
深度和浅状态的概念在确定非保留寄存器的候选寄存器时可能很有用。浅状态是指直接控制设计逻辑的寄存器—即可以绘制为状态机图的设计部分。深度状态是指状态机使用的寄存器,但它包含大量的辅助数据,如内存、计数器和FIFOs。我们通常不会将这些寄存器绘制为状态机图的一部分。
对于部分保留,一个合理的策略可能是保存和恢复浅状态,并有一个单独的策略来处理深状态。复位深度状态寄存器的控制器是一种可能的策略。
然后问题就变成了在上电时如何验证保留和非保留状态的组合使得设计正确重启。在仿真过程中,我们将所有寄存器(包括深寄存器和浅寄存器)的输出设置为x。这也就是说,除了影子寄存器外我们损坏了所有寄存器。
验证电源门控后正确启动的关键是确保X不传播。即上电顺序完成后,电路中除内存内容外没有X。并且内存中的X不能传播,也不能影响电路的功能。
仔细和有选择地使用复位可以解决这个问题。但是我们需要确保我们只复位了非保留寄存器,这样我们就不会干扰保留寄存器的恢复功能。
因此,对于保留和非保留存储有单独的复位信号变得很重要。然后我们可以在电源门控后构建上电序列以恢复保留状态并初始化所有非保留寄存器。
因此,用于部分保持的电源控制器必须驱动独立的(命名的)复位到子系统的适当部分。需要进行一些严格的功能测试,以确保没有可能导致死锁的非法状态组合。
系统级问题和保留
一个更微妙的复杂性来自于与时钟门控的潜在交互,这是在设计流程中进一步实现的。需要仔细管理构成时钟门控使能项的所有状态位:保留或重新初始化为安全且可重启的条件。通过这种方式,可以干净地重新生成时钟门控单元中透明锁存器的内容——无需为时钟门控单元添加保留。
同样,使用时钟的上升和下降两条沿也可能是一个真正的问题。在下电顺序中,时钟在“0”状态停止,这使得时钟门控锁存;当电源和状态恢复时,形成时钟门控控制的项通过锁存器传播,恢复正确的值到时钟门控寄存器的输入。
如果时钟上升沿和下降沿在同一设计中使用,那么当停止时钟时,所有的时钟都会被时钟门控锁死。因此,我们将无法正确地恢复所有数据。
保留寄存器也让扫描测试变得更加复杂。为了进行扫描测试,我们需要强制保留寄存器进入正常的工作模式。因此,当我们进入扫描模式(对于电源门控块)时,我们需要设置电源控制器,以便保存和恢复都是不工作的。当我们进入电源控制器本身的扫描模式时,我们需要放松这个约束,这样扫描可以用来测试保存和恢复信号的生成。
状态保留的建议与陷阱
建议:
如果实现了部分保留,则为设计的保留和非保留的存储部分提供单独的复位。这允许对上电复位和恢复/重新初始化操作进行干净的验证。
在实现部分保留时,要确保状态机和顺序程序不依赖于非保留状态,以避免依赖状态的死锁或无效状态条件。(如果必须使用非保留状态测试许多保留状态值,则要验证的状态空间可能非常大)。
如果专用保留寄存器的面积影响太大,则可选择复用扫描链。尽管在生成测试结构后需要谨慎地将其清晰地映射到网表实现上,但这可以在 RTL 编码的控制状态机中相对清晰地进行管理。
在扫描测试中,保留寄存器控制必须是可控的和可观察的。
陷阱:
不良涌入电流管理或保留电源噪声有可能损坏保留寄存器,导致重新启动时的不安全/无效状态。在RTL电源控制(和物理实现)中必须非常小心,以确保电源被安全地重新应用。
部分保留需要更严格的复位和恢复验证,以确保在保留/恢复状态和重新初始化的非保留状态之间不会出现死锁情况。
时钟门控使能建议在他们的整个扇入状态上使用保持寄存器保存状态,以确保“下一个状态”行为顺序正确。
基于扫描的保存和恢复方法很可能使用系统总线对数据进行交互。这个总线通常可以有等待状态,因此需要小心确保扫描保存/还原控制器能够支持等待状态而不丢失任何数据。
在生产测试期间,未能测试保留寄存器实际保留的数据可能导致故障。