3. Xcelium低功耗仿真环境搭建
低功耗仿真的环境搭建,本质上是在普通功能仿真流程上叠加三层信息:UPF电源意图、电源状态控制、以及功耗相关信号的记录。Xcelium通过-upf、-power等编译与运行选项把这三层接进来。环境搭错时,最常见的现象不是报语法错误,而是仿真能跑完却看不到电源状态变化、或者功耗信号全是X。因此本节按“编译选项 → UPF命令行参数 → 电源状态配置 → 波形记录 → 错误排查”的顺序,把每一步的输入、关键参数和判断依据讲清楚。
一、编译与运行选项:把UPF接进仿真
Xcelium的低功耗能力由xrun统一驱动,核心选项分三类。第一类是UPF接入:-upf <file.upf>指定电源意图文件,可多次出现以支持分层UPF;-upf_version 2.1或3.0声明UPF版本,必须与文件内语法一致,否则会在elaboration阶段报版本不匹配。第二类是低功耗仿真开关:-power开启功耗感知仿真,使电源域、电源开关、隔离单元等被真正建模;-power_domain相关选项用于指定默认域行为。第三类是调试与记录:-access +rwc保证信号可读写,-linedebug支持断点,-input指定运行脚本。
一个典型的编译命令如下,注意UPF顺序与设计层次一致:
xrun -64bit -sv -access +rwc \
-upf_version 2.1 \
-upf ./upf/top.upf \
-upf ./upf/cpu_subsys.upf \
-power \
-top tb_top \
-l xrun_lp.log
判断编译是否成功,不能只看“xrun: *E”是否出现,还要在日志中确认UPF file ... loaded、Power domain ... created这类信息。如果UPF被加载但域数量为0,说明create_power_domain的作用范围与设计层次没对上,此时仿真虽能启动,但电源状态不会生效。
二、UPF命令行参数与电源状态配置
UPF文件本身是声明式的,但仿真时还需要通过命令行或控制接口驱动电源状态切换。Xcelium提供-upf_control类选项,也支持在testbench中调用系统任务。实际工程中更常用的是在UPF里定义电源状态表(PST),再在仿真中通过set_power_state或$power_state切换。
电源状态配置的关键是“域—状态—供电”三者对应。例如一个CPU子系统有ON、RET、OFF三个状态,对应供电电压1.0V、0.8V、0V。在UPF中先定义:
create_power_domain PD_CPU -elements {u_cpu}
add_power_state PD_CPU -state {ON} -supply {VDD 1.0}
add_power_state PD_CPU -state {RET} -supply {VDD 0.8}
add_power_state PD_CPU -state {OFF} -supply {VDD 0.0}
仿真运行时,通过-power_state_file或testbench中的$set_power_state("PD_CPU","RET")触发切换。切换后要观察三个量:域内信号是否被隔离为确定值、电源开关控制信号是否翻转、以及功耗信号是否随电压下降而变化。如果切换后信号仍为X,通常是隔离策略未定义或隔离使能信号未连接。
三、波形记录功耗相关信号
低功耗调试最怕“看不到”。默认波形只记录testbench顶层信号,电源域内部的VDD、隔离使能、保持控制往往不在其中。需要在testbench或-input脚本中显式添加记录。推荐用$dumpvars或probe命令,按“供电—控制—状态”三类信号组织:
probe -create tb_top.u_cpu.VDD_CPU -depth all
probe -create tb_top.u_cpu.iso_en -depth all
probe -create tb_top.u_cpu.ret_en -depth all
probe -create tb_top.u_cpu.pwr_switch_ctrl -depth all
probe -create tb_top.pst_state -depth all
记录后要检查波形中VDD是否随状态切换而改变。如果VDD始终为1.0V,说明add_power_state中的supply没有真正驱动到该网络,常见原因是supply net未通过connect_supply_net连接到域端口。另一个高频问题是隔离使能信号在OFF状态下仍为X,导致隔离输出不确定,此时应检查隔离控制信号是否来自always-on域。
四、常见环境错误排查
低功耗环境错误大致分四类,排查时按“先看日志、再看域、再看状态、最后看波形”的顺序。
- UPF版本不匹配:日志出现
UPF version mismatch。解决方法是让-upf_version与文件头upf_version一致,UPF 2.1与3.0在电源状态语法上有差异,不能混用。 - 电源域未创建:日志显示
0 power domains。通常是create_power_domain的-elements路径与elaborate后的层次名不一致,可用-upf_dump导出实际域结构核对。 - 信号全X:域内信号在OFF状态仍为X,说明隔离未生效。检查
set_isolation是否指定了-isolation_signal和-isolation_sense,以及该信号是否在always-on域。 - 功耗无变化:波形中VDD不变、功耗为0。检查
-power是否开启、supply net是否连接、以及PST是否被真正触发。
-l xrun_lp.log保留完整日志,并在日志中搜索UPF、power domain、isolation三个关键词,能快速定位80%以上的环境问题。最后给出一个可复用的环境检查清单,按顺序执行即可覆盖本节全部关键点:编译日志中UPF加载成功且域数量大于0;-power已开启;PST中每个状态都有对应supply值;隔离与保持策略已定义且控制信号来自always-on域;波形中已记录VDD、ISO、RET、PST四类信号;切换状态后VDD与隔离输出符合预期。满足这六项,低功耗仿真环境才算真正搭好。