VCS自带的UPF低功耗仿真demo,我踩了这些坑才跑通(附完整Makefile修改)
2026/5/7 10:38:37 网站建设 项目流程

VCS UPF低功耗仿真实战:从Demo调试到波形分析全流程解析

刚接触VCS自带的UPF低功耗仿真Demo时,本以为能快速上手,结果却遭遇了各种"坑"。本文将分享我从环境搭建到波形分析的全过程,特别是那些官方文档没提到的细节问题。如果你也准备学习UPF验证,这些经验或许能帮你少走弯路。

1. 环境准备与Demo结构解析

VCS安装包中自带的UPF低功耗仿真Demo位于$VCS_HOME/doc/examples/NLP/MVSIM_NATIVE_DEMO目录下。这个Demo的设计非常典型,包含了完整的低功耗验证环境:

MVSIM_NATIVE_DEMO/ ├── LP/ # 基础低功耗仿真环境 ├── LP_DVE/ # 配合DVE工具的配置 ├── LP_LPA/ # 低功耗分析专用配置 ├── REF/ # 无UPF的参考仿真 ├── RTL/ # 设计代码 └── UPF/ # UPF功耗描述文件

关键目录说明

  • LP目录是最基础的仿真环境,包含Makefile和测试平台
  • RTL存放设计代码,包括32位加法器、寄存器堆等模块
  • UPF目录下的ChipTop.upf定义了电源域和电源开关

提示:建议先将整个Demo目录复制到自己的工作区,避免直接修改VCS安装目录下的文件。

2. 首次运行遇到的三大坑

2.1 路径问题与软链接解决方案

进入LP目录直接执行make命令,首先会遇到文件找不到的错误:

Error: Cannot open file 'UPF/ChipTop.upf' Error: Cannot open RTL module file

这是因为Makefile中指定的相对路径是基于Demo根目录的,而我们现在是在LP子目录下执行。解决方法很简单:

ln -s ../RTL RTL ln -s ../UPF UPF

创建这两个软链接后,编译时就能正确找到RTL和UPF文件了。

2.2 32/64位兼容性问题

解决了路径问题后,下一个报错更让人困惑:

g++: /soft/eda/vcs/linux/lib/ctype-stubs_32.a: No such file or directory

这是因为VCS默认尝试使用32位库,而现代Linux系统大多只安装64位库。解决方法是在Makefilevcs命令后添加-full64选项:

comp: vcs -full64 tb_ChipTop.v -f filelist -sverilog ...

2.3 波形记录配置技巧

低功耗仿真中,观察电源状态变化至关重要。需要在测试平台中添加FSDB波形记录:

initial begin if($test$plusargs("DUMP_FSDB")) begin $fsdbDumpfile("test.fsdb"); $fsdbDumpvars("+all"); end end

同时修改Makefile:

  • 编译时添加-fsdb选项
  • 运行时添加+DUMP_FSDB参数
  • simv前添加./确保正确执行
comp: vcs -full64 -fsdb tb_ChipTop.v ... run: ./simv +DUMP_FSDB -l run.log

3. Makefile优化与Verdi集成

经过上述修改后,完整的Makefile应该如下所示:

all: clean comp run clean: \rm -rf csrc* simv* vc_hdrs.h vcs_command.log ucli.key mvsim_native_reports lp_fsm.config dump.txt comp.log run.log comp: vcs -full64 -fsdb tb_ChipTop.v -f filelist -sverilog -upf UPF/ChipTop.upf -power_top ChipTop +define+UPF -l comp.log run: ./simv +DUMP_FSDB -l run.log verdi: verdi tb_ChipTop.v -f filelist -sverilog -upf UPF/ChipTop.upf -power_top ChipTop +define+UPF -ssf test.fsdb &

新增的verdi目标可以一键启动Verdi并加载仿真波形和UPF文件。注意最后的&让Verdi在后台运行,不影响终端使用。

4. UPF分析与功耗验证实战

4.1 UPF文件结构解析

Demo中的ChipTop.upf定义了一个典型的双电压域设计:

create_power_domain PD_TOP -include_scope create_power_domain PD_SUB -elements {u_SubSystem} create_supply_port VDD -domain PD_TOP create_supply_net VDD -domain PD_TOP -reuse create_supply_net VDD -domain PD_SUB -reuse create_power_switch SW_SUB \ -domain PD_TOP \ -output_supply_port {VOUT VDD} \ -input_supply_port {VIN VDD} \ -control_port {CTRL pwr_ctrl} \ -on_state {ON VIN !CTRL} \ -off_state {OFF {} CTRL}

4.2 Verdi中的功耗分析流程

  1. 导入UPF文件

    • 在Verdi中选择 File → Import CPF/UPF Files
    • 可以同时导入多个UPF文件进行对比分析
  2. 查看电源域状态

    • 打开 Hierarchical Power Domain 窗口
    • 这里可以查看各电源域的开关状态和层级关系
  3. 功耗映射分析

    • 选择 Power → New Power Map → Full Power Map
    • 可视化显示电源网络和开关的连接关系

常见问题排查表

现象可能原因解决方案
电源域显示不全UPF文件未正确加载检查UPF路径和语法
开关状态异常控制信号未正确连接检查测试平台的pwr_ctrl信号
波形中无功耗信息未启用功耗仿真确保Makefile中有+define+UPF

5. 进阶调试技巧

5.1 多场景对比分析

Demo中提供了四种配置环境:

  • LP:基础低功耗仿真
  • LP_DVE:配合DVE工具
  • LP_LPA:低功耗分析专用
  • REF:无UPF的参考设计

建议分别运行这些场景,对比波形差异,特别关注:

  • 电源开关切换时的仿真延迟
  • 不同电源域的信号隔离效果
  • 状态保持寄存器的行为

5.2 代码覆盖率收集

在低功耗验证中,需要特别关注电源相关代码的覆盖率。可以在Makefile中添加:

comp: vcs -full64 -fsdb -cm line+cond+fsm+tgl ... run: ./simv +DUMP_FSDB -cm line+cond+fsm+tgl ...

完成后使用urg工具生成覆盖率报告:

urg -dir simv.vdb -report coverage_report

5.3 功耗感知的断言检查

在UPF仿真中,可以添加特定断言来验证功耗行为:

// 检查电源开关关闭时信号是否保持 always @(negedge pwr_ctrl) begin assert_final_off: assert final ( $stable(u_SubSystem.reg1) && $stable(u_SubSystem.reg2) ) else $error("Registers not retained when power off"); end

6. 性能优化建议

随着设计规模增大,UPF仿真速度会显著下降。以下是一些优化技巧:

编译选项优化组合

选项作用适用场景
-partition分区编译大型SoC设计
-fastpower快速功耗仿真早期功能验证
-poweropt功耗优化电源网络复杂的设计

运行时内存管理

comp: vcs -full64 -fsdb +memopt ... run: ./simv +DUMP_FSDB +ntb_opt=large_memory ...

在实际项目中,第一次成功运行UPF Demo后,我花了三天时间才理解清楚各个电源域之间的相互作用关系。建议新手在波形调试时,重点关注电源控制信号的时序和各个电源域的状态转换,这是理解低功耗设计的关键。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询