
在電源關斷模塊有可能要求register對關斷前的數據進行鎖存或者在電源打開后要求對鎖存的數據進行恢復,這就需要特殊的單元Retention Register。
retention reg有兩組寄存器,Main Register和shadow寄存器,其中shadow寄存器使用的是always on的電源;
它有兩個電源,一個用于模塊電源未關斷時的工作用電,一個用于模塊電源關斷時的用電。它還有兩個控制信號save和restore,用于控制是否鎖存數據或者恢復數據;

如上圖所示,這個寄存器需要有兩個電源,一個是常開的VDD_BACKUP,給shadow寄存器用,另一個是可以關斷的VDD,給Main Register用。
在需要保留狀態時,使能SAVE信號,Main Register的值就被保留到shadow寄存器中,然后即使VDD關閉了,shadow寄存器的值也會保留。當模塊/IP再次上電,通過使能RESTORE信號,就可以把shadow寄存器的值寫回Main Register中;

對于可以關斷的Power Domain,如下圖Block1內的PD1,在關斷電源之后,內部數據全部丟失,如果想在斷電后仍然保存這些數據有幾種方式:

與前面的各種低功耗Cell一樣,Retention Register內部的Shadow Register也是Always On Cell,必須有Always On的供電源。Shadow Register連接到always-on電源上以保證其能夠正常工作。由于是Always On的,所以為了實現低功耗的目標,內部的器件多用高閾值的MOS管來實現以降低Power Down模式下的Leakage Power。
Retention Register內除了Shadow Register之外,其余的器件均使用可以關斷的電源,為了高性能以及快速恢復數據,Main Register可能還會使用低閾值的管子。
Retention Register與常規的寄存器相比,面積更大,一般要比普通寄存器面積大約20%,如果設計的魯棒性好一些,甚至會大超過50%。?但是與其他方案相比,上電后數據恢復的速度非常快,且操作也簡單。因此,使用retention register需要特別注意它帶來的額外的面積和功耗。當需要斷電保存的數據過多時,retention cell帶來的功耗可能會使整體的low power效果打折扣。
在低功耗設計中retention register,這個寄存器其實包含兩個寄存器,一個叫shadow register的寄存器用always on電源,用于寄存器值的恢復,那么為什么不直接一個普通的寄存器用always on電源呢?這樣不是可以省下一個寄存器嗎?
理論上說可以用普通的register來做,但是實際中需要考慮ISO,僅僅clock,data,reset就需要3個isolation cell。功耗比較高,另外對timing也有影響。
而retention register內部就考慮了這些,只要保證進ret的信號是always on就可以,而且進出ret的速度都非常慢,所以對timing 不會有影響。
retention registers指的是什么寄存器?它與一般的寄存器有什么不同,主要的功能是什么?
retention reg有兩組寄存器,其中一個是shadow寄存器使用的是always on的電源。當power down之前,把主reg的值load到shadow reg,當power up之后,從shadow reg把值load到主reg。因為shadow寄存器只是用來存儲數據,所以可以做得比較小,功耗比較低。
使用retention registers會增加額外的leakage,需要配合系統的省電方案使用,同時也會增加額外的面積;
retention registers看起來多了一個shadow寄存器,似乎費電更多才是,那怎么做到省電的呢?
關鍵就在于,retention registers中的shadow寄存器只消耗很少的電來保存信息,從而使得主寄存器可以完全掉電,從而省電;
retention registers中主從寄存器兩者的區別?
主寄存器面積大,工作電壓高,采用的晶體管閾值電壓也低,工作電流大,這樣可以保證該寄存器在正常工作時速度快,負載能力強。
從shadow寄存器,面積相對小一些,采用閾值電壓高的晶體管,其驅動電壓也會更低。因此,消耗的電量很少。
retention registers的lib描述指定了控制數據保存和恢復的電源引腳和輸入信號。
指定了哪些電源引腳是正常的并且可以掉電,哪些是用于在掉電期間保持數據的常開引腳。
cell(RETENTION_DFF)?{?
retention_cell:"ret_dff";?
area?:?1.0;?
...?
pg_pin(VDDB)?{?
voltage_name?:?VDDB;?
pg_type?:?backup_power;?
}?
...?
pin(RETN)?{?
direction?:?input;?
capacitance?:?1.0;?
nextstate_type?:?data?;?
related_power_pin?:VDDB;?
related_ground_pin:VSSG;?
retention_pin?(save_restore,?"1"?);?
}?
pin(Q)?{?
power_down_function:"!VDD+VSS";?
related_power_pin?:?VDD?;?
related_ground_pin?:?VSS;?
direction?:?output;?
...