LPMM阅读笔记——第五章 电源门控设 part2

第五章 电源门控设 part2

5.3 状态保持和恢复方法

当模块掉电时,所有的状态信息都会丢失,如果想要模块在重新上电后能继续掉电之前的工作,则需要对一些关键的状态和信息进行保存,并在上电后恢复,有三种方法可以保存和恢复电源门控模块的内部信息:

• 基于软件读写寄存器的方法;

• 基于扫描的方法,使用扫描链将状态信息存储在芯片外;

• 使用保持寄存器;

使用软件读写寄存器的方法是在模块要掉电的时候,使用始终上电的处理器将被门控模块的寄存器读出来放在memory中,当模块上电后,处理器从memory读出后写回到模块中,该方法有以下几个方面的缺点:

1) 总线交互增加了模块下电和上电所需的时间;

2) 总线冲突使信息保存/恢复所需的时间变得不确定,从而难以确定模块的电源何时可以关闭;

3) 需要在软件中增加额外的保持和恢复驱动;

鉴于软件读写寄存的方法有上述缺点,下面重点关注另外两种方法;

扫描二维码关注公众号,回复: 4333089 查看本文章

5.3.1 使用扫描链保存状态

使用扫描链保存状态的方法是利用测试时的扫描链,在下电时,将下电模块的寄存器像测试时那样,通过扫描链输出到片内/片外的RAM中,在上电过程中,在将RAM中的数据通过扫描链移回到模块内部的寄存器中,由于操作过程中所使用的扫描链是复用测试时的扫描链,所以该方法几乎不会有面积上的额外开销,此外,一旦要掉电模块的状态被扫描链移到memory中后,整个模块可以完全关闭电源,但这样对于设计来说有如下挑战:

1) 从RTL的角度看,扫描链是在综合后才插入的,但是我们希望在RTL阶段就能进行低功耗的功能和控制器的验证;

2) 寄存器的数量以及扫描链的长度需要在初步实现后确定,所以在RTL阶段进行控制器设计时需要对这些内容进行参数化;

3) 为了快速保存和恢复,需要使用多条扫描链,结合memory位宽,一般使用8或者8n条扫描链,要求这些扫描链的长度一致,对于短了的扫描链而言,应该添加额外的寄存器来补齐;

4) 将状态寄存器移出/重新移入也需要消耗很多的能量,即使是使用内部的RAM,扫描链上的寄存器可能会同时翻转,产生较大的动态电流,若使用外部RAM,则在IO上还需要消耗部分能量;

尽管存在上述挑战,在某些情况下,基于扫描链的状态保存还是非常有用的,例如对于长期下电的子系统而言,通过扫描链可以保存和恢复状态,而不需要再上电后从复位状态开始工作,对于功耗的节省来说更加明显;图 1所示是基于4bits扫描链的保存/恢复简图,图中有一条较短的扫描链使用了额外的寄存来补齐了。

图 1 基于扫描链的状态保存

在RTL阶段,可以通过添加一些扫描链的功能模型和控制模型在RTL中实现基于扫描链的低功耗仿真验证,书中给出了一个RTL的扫描链模型示例,代码如下:

`define CPU_SCAN_LEN 257 /* set to implementation length once known */

`ifdef RTL_SLEEP_EMULATE

parameter scan_reg_length = `CPU_SCAN_LEN;

reg [15:0] scanword [0:scan_reg_length-1];

integer i;

/* initialize the scan chain to count pattern, or more draconian X */

initial begin

    for (i=0; i < scan_reg_length; i=i+1) begin

        scanword[i]<=i; // or 16’hXXXX;

    end

end

/* emulate scan shift CPUSI -> CPUSO */

always@(posedge CLK) begin

    if (CPUSE == 1'b1) /* when SCAN ENABLE is active */

    begin

        for (i=1; i < scan_reg_length; i=i+1) begin

            scanword[i]<=scanword[i-1]; 

        end

        scanword[0] <= CPUSI[15:0]; 

    end

end

assign CPUSO [15:0] = scanword[scan_reg_length-1];

`endif

在门级网表release后,就可以使用门级网表进行仿真了,以确保功能、控制、扫描链长度和连接的正确性。

5.3.2 保持寄存器

在电源被门控期间,提供状态保存的另一种方法是使用保持寄存器替换标准的寄存器,保持寄存器包含一个影子寄存器,可以在掉电期间保持,并在重新上电的时候恢复,影子寄存器时始终上电的,图 2显示了两种类型的保持寄存器,左边的保持寄存器有两个控制信号,当SAVE信号有效时,状态从主寄存器加载带影子寄存器中,当RESTORE信号有效时,状态从影子寄存器恢复到主寄存器中,SAVE和RESTORE信号对电平敏感的信号;右边的寄存器只有一个RETAIN控制信号,该信号的上升沿时,将主寄存器的值保存到影子寄存器中,在信号的下降沿时,将影子寄存器的内容恢复到主寄存器中,RETAIN信号对边沿敏感。

图 2 保持寄存器

实际上保持寄存器都有一些额外的面积上的开销,通常为20%或更大,一些带有电压峰值保护的保持寄存器在面积上的额外开销甚至大于50%,在具有大量寄存器的设计中这种面积上的增加可能会很大,但这是不可避免的。

5.3.3 带保持寄存器的电源控制器设计

电源控制器必须管理保存/恢复状态的时序,由于影子寄存器比主寄存器慢,所以我们需要确保主寄存器中的值在保存过程中是稳定的,因此,在状态保存时,一般将主寄存器的时钟停掉,保存完成后在下电(疑问:保存寄存器没有反馈信号,如何确定状态保存已经完成?);在上电时,应该先将状态从影子寄存器中恢复到主寄存器中以后再恢复时钟;为避免读写冲突,在保存/恢复时,主寄存器的时钟和复位应停掉。

5.3.4 全部/部分状态保存

对于使用状态保存寄存器策略的设计而言,最关键的一个决策是在断电期间,保存多少状态信息?若全部保存,则可以得到一个最稳健和最易于验证的设计,但某些设计中,不允许有太多太多额外的面积增加,这样的情况下,就只能选择保存部分寄存器值,这样会给设计带来一些挑战,设计需要保证所有没有保留的寄存器在重新上电后不会出现X态,且是可以验证的。

5.4 电源控制器

5.4.1 电源控制序列

不带保存寄存器的下电顺序:

1) 结束总线和外部操作;

2) 停止时钟;

3) 隔离输出信号;

4) 复位模块;

5) 关闭模块电源;

不带保存寄存器的上电顺序:

1) 打开模块电源,使模块重新上电;

2) Release复位;

3) 撤销隔离;

4) 恢复时钟;

图 3所示为不带保存寄存器的电源控制序列。

图 3 不带保持寄存器的电源控制序列

带保存寄存器的下电顺序:

1) 结束总线和外部操作;

2) 停止时钟;

3) 隔离输出信号;

4) 保存状态信息;

5) 复位模块;

6) 关闭模块电源;

不带保存寄存器的上电顺序:

1) 打开模块电源,使模块重新上电;

2) Release复位;

3) 恢复保存的状态信息;

4) 撤销隔离;

5) 恢复时钟;

图 4所示为带保存寄存器的电源控制序列。

 

图 4 带保持寄存器的电源控制序列

5.4.2 电源开关网络和电源控制器的握手

为避免模块在上/下电时产生尖峰电流,电源门控网络在关断/打开过程中都需要一定的延时,控制器需要等到模块上电完成后才能发出下一操作,这样就要求控制器知道电源门控网络是否完成了上/下电动作,基于此,在电源门控网络中增加一个反馈信号来实现控制器和电源门控网络间的握手,图 5所示为电源切换确认序列,在大多数应用中,电源门控网络的ack信号是异步的,其延迟取决于电源门控网络的结构设计,控制器在使用之前应先将ack信号同步到控制器所在的时钟域下。电源门控控制器设计时还需要考虑一种极端的情况,就是电源下电过程还未完成时又需要对模块上电。

图 5 电源切换确认序列

书上这一章后面还有两节分别对电源门控设计的验证和测试做了介绍,这一部分后续我会单独整理,所以在此先略过,下一章会从对架构的角度做一些介绍,包括power domain的划分、层次、多电压域等。

============正文结束===========

扫描下面的二维码,阅读其他章节

猜你喜欢

转载自www.cnblogs.com/ChipView/p/10054283.html