9.【UPF】UPF Retention Strategies(UPF留存策略)

张开发
2026/4/18 14:49:21 15 分钟阅读

分享文章

9.【UPF】UPF Retention Strategies(UPF留存策略)
第一步UPF Retention Strategies 分析与知识整理1. 为什么学习Retention Strategies电源门控会丢失所有触发器状态。保持策略通过最小保持电压保留关键状态实现快速唤醒。唤醒延迟从毫秒级完全重新初始化降到微秒级使激进电源门控在响应式系统中可行。2. 你将学到什么状态保持的概念及使用场景使用set_retention定义保持策略指定保持电源和控制信号为关键状态实现选择性保持3. 理解状态保持问题电源门控时所有触发器状态丢失。唤醒后需要软件重新初始化耗时毫秒级。解决方案保持触发器具有双电源主电源VDD_domain正常工作可开关保持电源VDD_RET常开、低电压0.6-0.8V用于状态保存工作流程断电断言保持控制信号 → 保持FF切换到VDD_RET → 关断VDD_domain → 保持单元用VDD_RET维持状态极低漏电上电恢复VDD_domain → 解除保持控制 → 保持FF切回VDD_domain → 状态恢复无需软件初始化唤醒时间微秒级vs 毫秒级无保持4. 何时使用保持场景使用保持理由频繁电源循环是快速唤醒值得保持开销关键状态需保留是重新初始化代价高或不可能长时间睡眠小时可能保持漏电累积可能超过重新初始化成本短时间睡眠1ms是重新初始化开销占主导不频繁断电否罕见唤醒时简单重新初始化更优5. 保持触发器单元标准FF vs 保持FF保持FF额外需要VDD_RET电源和SAVE/RESTORE控制信号面积1.3-1.5倍大30-50%活跃功耗5-10%重要不要对所有FF使用保持仅对关键状态使用。非关键状态可用标准单元以节省面积。6.set_retention语法基本形式set_retention strategy_name -domain domain_name \ -retention_supply_set supply_set_name \ [options]关键参数strategy_name策略名必须-domain应用保持的域必须-retention_supply_set保持电源的供电集必须-retention_condition {expr}布尔表达式控制保持-save_signal {signal sense}保存状态的信号-restore_signal {signal sense}恢复状态的信号-elements {instance_list}指定保留的实例默认所有FF使用变体基本保持域内所有FFset_retention RET_CPU -domain PD_CPU -retention_supply_set SS_CPU_RET -retention_condition {cpu_retention_enable}显式保存/恢复信号set_retention RET_GPU -domain PD_GPU -retention_supply_set SS_GPU_RET -save_signal {gpu_save_state high} -restore_signal {gpu_restore_state high}选择性保持特定实例set_retention RET_CRITICAL -domain PD_CPU -retention_supply_set SS_CPU_RET -retention_condition {retention_en} -elements {cpu_inst/control_regs cpu_inst/status_regs}7. 定义保持供电集保持需要单独的常开保持电源。主电源VDD_CPU可开关保持电源VDD_RET常开0.6V两个供电集SS_CPU_ACTIVE主和SS_CPU_RET保持关联主供电集到域保持供电集在set_retention中引用8. 保持控制信号-retention_condition单信号控制信号1时保持激活使用VDD_RET0时正常使用VDD_CPU-save_signal和-restore_signal显式控制保存和恢复时序用于复杂电源序列信号极性high或low例如-retention_condition {!ret_en_n}表示低有效9. 选择性保持使用-elements指定需要保持的实例不指定则域内所有FF都替换为保持FF。优点面积小、保持漏电低、综合快候选控制寄存器、缓存标签阵列、TLB项、电源管理状态不保留数据路径寄存器ALU操作数、临时变量、可重新计算状态10. 完整保持示例原教程给出了CPU域的完整UPF包括常开TOP域、CPU域主电源保持电源、电源开关、保持策略。并描述了断电和上电序列。11. 保持单元映射map_retention_cell语法map_retention_cell strategy_name -domain domain_name -lib_cells {cell_list}示例map_retention_cell RET_CPU -domain PD_CPU -lib_cells {DFFR_X1 DFFR_X2 DFFR_X4}综合工具将标准D触发器替换为保持变体。12. 保持 vs 重新初始化权衡保持好处快速唤醒、软件复杂度低、响应性好保持成本面积30-50%、常开保持电源非零功耗、额外控制逻辑、设计验证复杂度盈亏分析当唤醒频率 × 节省时间 × 软件代价 保持面积 保持功率 × 睡眠时间 × 唤醒频率时使用保持。13. 常见初学者错误错误1忘记创建保持供电集 → 必须先create_supply_set。错误2保持供电集使用可开关电源 → 必须用常开保持电源。错误3不必要地保持所有FF → 使用选择性保持。14. 实践练习要求为GPU域实现选择性保持主电源0.9V可开关保持电源0.6V常开仅保留配置寄存器和着色器状态控制信号gpu_retention_enable高有效。15. 总结状态保持通过常压低电压电源保留触发器内容实现微秒级唤醒。set_retention定义策略需要保持供电集和控制信号。保持单元面积大30-50%需双电源。选择性保持减少开销。适用于频繁电源循环的域不适用于罕见或极长睡眠。第二步用费曼学习法学习UPF保持策略保持策略Retention就是给芯片的“记忆”配一个UPS不间断电源——主电源断了备用小电池还能记住关键数据一恢复主电就能瞬间醒来。作为验证工程师我的任务是确保这个备用电池保持电源永远有电切换开关控制信号时序正确并且不要给每个寄存器都配电池太浪费。本文用“电脑休眠”的比喻帮你彻底搞懂为什么需要保持保持触发器怎么工作如何用set_retention指定策略以及如何避免“全盘保留”的面积陷阱。我们着重讲什么需要关注什么为什么这样做好处如何学习使用着重讲解保持的本质双电源触发器主电断后由低电压常开电源维持状态。set_retention的三要素保持供电集、控制信号条件或保存/恢复、可选的选择性实例。保持 vs 重新初始化何时用保持何时用重启。选择性保持只保留关键寄存器面积和漏电都省。必须的电源和开关配合保持电源必须常开且电源门控必须与保持控制协调时序。为什么这样做没有保持电源门控后唤醒需要软件重新初始化所有寄存器耗时毫秒级用户体验差手机亮屏慢。有了保持唤醒只需微秒级瞬间恢复。好处快速唤醒微秒 vs 毫秒软件简化无需重新初始化代码允许更频繁的电源门控进一步省电如何学习使用先理解保持触发器结构两个电源引脚一个控制引脚。手写一个简单的保持UPF一个域主电源1.0V保持电源0.6V一个控制信号。用仿真器跑序列断言保持控制 → 关主电 → 等一段时间 → 开主电 → 解除保持控制检查寄存器值是否保留。加入选择性保持指定-elements只保留一部分寄存器观察综合报告里哪些FF被替换为保持单元。分析实际设计找出哪些状态必须保留如配置寄存器、状态机状态哪些可以重新计算如数据缓冲。下面按知识点展开每个部分有通俗解释、代码示例和验证工程师的实战视角。一、保持是什么用“电脑休眠”比喻秒懂通俗解释你正在写文档突然要离开。你可以选择关机完全断电所有未保存数据丢失。回来要重新开机、打开软件、加载文档毫秒到秒级→ 相当于无保持的电源门控。休眠电脑把内存数据存到硬盘然后断电。恢复时从硬盘读回内存比关机快但仍有延迟 → 相当于无保持的电源门控但加了外部存储。睡眠电脑保持内存供电其他大部分断电。一按键盘瞬间恢复 → 这就是保持内存相当于寄存器由低电压小电源维持唤醒快如闪电。在芯片里保持触发器就是那个“睡眠模式下的内存”——用一个小电池保持电源VDD_RET0.6V维持数据主电源VDD_domain1.0V可以完全关断。技术实现保持触发器内部有一个锁存器当控制信号有效时锁存器切换到VDD_RET供电主电源断开后数据不丢。二、set_retention三要素电源、控制、范围要素1保持供电集必须保持触发器需要第二个电源——常开的低电压电源。这个电源必须永远不断电即使域关断。在UPF中用独立的供电集表示。create_supply_net VDD_CPU_RET -domain PD_CPU create_supply_set SS_CPU_RET -function {power VDD_CPU_RET} -function {ground VSS}验证检查VDD_CPU_RET必须来自常开域如PD_TOP并且add_power_state中不能有off状态只能是ON或RETENTION。要素2控制信号告诉触发器何时切换到保持电源。简单方式-retention_condition一个信号高电平表示保持模式低电平表示正常模式。set_retention RET_CPU -domain PD_CPU -retention_supply_set SS_CPU_RET -retention_condition {cpu_retention_enable}精细方式-save_signal/-restore_signal分开控制保存和恢复适合复杂握手。set_retention RET_GPU -domain PD_GPU -retention_supply_set SS_GPU_RET -save_signal {gpu_save high} -restore_signal {gpu_restore high}验证重点控制信号必须来自常开域否则断电后信号丢失无法切换。另外控制信号的时序必须正确断电前先断言保持主电源稳定后再解除。要素3范围选择性保持默认set_retention会替换域内所有触发器为保持触发器面积大增。通过-elements只保留关键寄存器。set_retention RET_CRITICAL -domain PD_CPU \ -retention_supply_set SS_CPU_RET \ -retention_condition {ret_en} \ -elements { cpu_inst/control_regs cpu_inst/status_regs cpu_inst/mmu/tlb_entries }验证检查综合后查看报告确认只有指定的实例被替换为保持FF其他仍是标准FF。如果发现意外替换可能是通配符范围过大。三、保持电源电压0.6V的秘密为什么保持电压通常是0.6V左右因为太低0.5V数据可能丢失保持触发器内部锁存器翻转。太高0.8V漏电显著增加失去省电意义。工艺库会给出最小保持电压V_ret_min通常0.5-0.6V。验证检查确认add_power_state中定义的保持电压如0.6V不低于库的最小保持电压。同时检查保持电源是否独立于主电源——不能把VDD_RET和VDD_CPU短路。四、完整序列断电和上电的正确姿势断电序列以-retention_condition为例软件准备睡眠。断言cpu_retention_enable 1→ 所有保持FF切换到VDD_RET供电。等待几个时钟周期确保切换完成。电源门控cpu_power_enable 0→ VDD_CPU关断。域断电但VDD_RET仍供电保持FF状态不丢。上电序列cpu_power_enable 1→ VDD_CPU恢复。等待电压稳定通常有power_good信号。解除保持cpu_retention_enable 0→ 保持FF切回VDD_CPU。释放复位CPU从之前的状态继续执行无需重新初始化。验证测试写一个仿真用例向保留寄存器写入已知值如0x5A5A。执行断电序列模拟电源关闭可用force使VDD_CPU为0。等待一段时间。执行上电序列读取寄存器检查值是否仍为0x5A5A。如果值改变说明保持失效。常见原因保持控制信号时序错、保持电源在主电断后也断了、或者该寄存器没有被替换为保持FF。五、选择性保持不要给整个房子装UPS假设一个CPU有10万个寄存器但只有1000个是关键的配置寄存器、状态机、TLB其余都是数据路径临时寄存器可以重新计算。如果对所有10万寄存器都使用保持FF面积增加30-50%可能多花几百万门而且保持电源的漏电也会显著增加。正确做法只保留那1000个关键寄存器。其他寄存器断电后丢失没关系软件唤醒后重新初始化即可比如从内存加载配置。如何决定哪些寄存器需要保持必须保留电源管理状态、中断控制器设置、时钟分频系数、已配置的基址寄存器。可以不保留正在处理的算术运算中间值、FIFO中的数据可以从外部重新灌入、缓存数据可以从下一级缓存或内存重新加载。UPF实现set_retention RET_CPU_CORE -domain PD_CPU \ -retention_supply_set SS_CPU_RET \ -retention_condition {core_retention} \ -elements { cpu_top/ctrl_regs cpu_top/status_regs cpu_top/mmu/tlb_valid }验证检查使用report_retention -elements查看哪些实例被保留。同时写测试只保留部分寄存器断电后检查未保留的寄存器是否变为X表示未保持而保留的寄存器值不变。六、保持 vs 重新初始化何时用保持原教程的决策表频繁电源循环每秒多次→ 用保持。关键状态必须保留 → 用保持。长时间睡眠数小时→ 可能不用因为保持电源的微小漏电累计可能超过重新初始化的能耗。不频繁断电 → 不用简单重新初始化更省事。实际例子智能手机的CPU核心在屏幕点亮时可能每秒多次进入空闲再唤醒。用保持非常值得。物联网传感器每隔几分钟采集一次数据中间深度睡眠。如果保持漏电很低nA级也可以保持如果漏电较高不如完全断电后重新初始化。验证建议与系统架构师讨论唤醒频率和可接受的唤醒延迟。如果规格要求唤醒50µs则必须用保持如果允许1ms也许可以不保持。七、保持单元映射map_retention_cellUPF的set_retention是抽象策略。综合时需要知道用库里的哪个具体单元来实现保持功能。map_retention_cell RET_CPU -domain PD_CPU \ -lib_cells {DFFR_X1 DFFR_X2 DFFR_X4}DFFR可能是“D Flip-Flop with Retention”的缩写。X1,X2,X4表示驱动强度工具会根据负载自动选择。验证检查综合后打开网表搜索DFFR确认数量与预期一致。同时检查没有用到不支持保持的库单元。八、常见错误与避坑错误后果正确做法保持供电集使用可开关电源断电后保持电源也断状态丢失保持电源必须来自常开域忘记创建保持供电集就引用工具报错先create_supply_set对所有FF都用保持面积爆炸漏电增加使用-elements选择性保持控制信号来自可关断域断电后控制信号悬空无法恢复控制信号必须来自常开域断电序列中先断主电再断言保持保持未激活主电已断状态丢失先断言保持稳定后再断主电九、完整代码示例GPU域选择性保持原练习要求GPU域主电源0.9V可开关保持电源0.6V常开只保留config_regs和shader_state控制信号gpu_retention_enable高有效。答案带注释# 顶层常开域 create_power_domain PD_TOP -include_scope create_supply_net VDD_TOP -domain PD_TOP create_supply_net VSS -domain PD_TOP create_supply_set SS_TOP -function {power VDD_TOP} -function {ground VSS} associate_supply_set SS_TOP -handle PD_TOP add_power_state VDD_TOP -state {ON 1.2} # GPU域 create_power_domain PD_GPU -elements {gpu_inst} create_supply_net VDD_GPU -domain PD_GPU create_supply_net VDD_GPU_RET -domain PD_GPU create_supply_net VSS -domain PD_GPU # 主供电集 create_supply_set SS_GPU_ACTIVE -function {power VDD_GPU} -function {ground VSS} associate_supply_set SS_GPU_ACTIVE -handle PD_GPU # 保持供电集 create_supply_set SS_GPU_RET -function {power VDD_GPU_RET} -function {ground VSS} # 电源状态 add_power_state VDD_GPU -state {ACTIVE 0.9} -state {OFF off} add_power_state VDD_GPU_RET -state {RETENTION 0.6} # 电源开关假设输入来自VDD_TOP create_power_switch PSW_GPU -domain PD_GPU \ -input_supply_port {in VDD_TOP} \ -output_supply_port {out VDD_GPU} \ -control_port {ctrl gpu_power_enable} \ -on_state {on in {ctrl}} # 保持策略选择性 set_retention RET_GPU -domain PD_GPU \ -retention_supply_set SS_GPU_RET \ -retention_condition {gpu_retention_enable} \ -elements { gpu_inst/config_regs gpu_inst/shader_state } # 映射库单元示例 map_retention_cell RET_GPU -domain PD_GPU \ -lib_cells {RET_FF_X1 RET_FF_X2}验证步骤检查UPF语法check_upf -verbose仿真写测试向config_regs写入值断言gpu_retention_enable关gpu_power_enable等待恢复电源解除保持读回值验证不变。检查shader_state之外的寄存器如gpu_inst/temp_data是否在断电后变为X表示未保持。综合后检查网表只有config_regs和shader_state对应的触发器被替换为RET_FF。十、学习路线图第1天理解保持触发器的双电源概念手写一个单域带保持的UPF用仿真器跑基本序列。第2天加入电源开关练习保持控制信号与电源门控的时序配合。第3天实现选择性保持用-elements只保留几个寄存器对比综合报告的面积差异。第4天分析一个真实IP的UPF找出其保持策略和保留实例列表。第5天编写验证测试覆盖错误序列如先断主电再断言保持检查工具是否报错或仿真出现X。推荐命令report_retention -domain PD_CPU查看保持策略详情。check_mv_design -retention检查保持电源和控制信号的合法性。保持策略是UPF中实现“快速唤醒低漏电”的关键。掌握了它你就能让芯片在睡眠时几乎不耗电醒来时瞬间恢复状态。

更多文章