第二章:PrimePower环境搭建
好,咱们正式开始动手了。
这一章,我带你把PrimePower的环境搭起来。说白了,就是让工具能跑、能认你的库、能读你的网表。这三件事做不好,后面全是白搭。
我在项目里见过太多人,一上来就急着跑仿真,结果环境没配好,报错一堆,白白浪费几天时间。咱们别走那个弯路。
2.1 工具安装与License配置
PrimePower的安装,其实和大多数Synopsys工具差不多。但我还是想啰嗦几句关键点。
2.1.1 安装流程
我个人习惯,先把安装包解压到一个干净的目录。比如:
/tools/synopsys/primepower/R-2020.12-SP1
然后运行安装脚本。嗯,这里要注意:一定要用bash,别用csh。我吃过这个亏,csh下环境变量设置容易出幺蛾子。
安装完成后,设置环境变量。我一般这么写:
setenv PRIMEPOWER_HOME /tools/synopsys/primepower/R-2020.12-SP1
setenv PATH ${PRIMEPOWER_HOME}/bin:${PATH}
你想想看,如果PATH没加对,工具都找不到,后面还分析个啥?
2.1.2 License配置
License这块,是很多人的噩梦。我简单说下要点。
首先,你得有一个有效的license文件。通常放在:
/tools/synopsys/license/synopsys.dat
然后设置环境变量:
setenv SNPSLMD_LICENSE_FILE 27000@license_server
# 或者直接指向文件
setenv SNPSLMD_LICENSE_FILE /tools/synopsys/license/synopsys.dat
验证license是否生效,可以跑个简单的命令:
lmstat -a -c 27000@license_server
看到PrimePower相关的feature是“IN USE”或“AVAILABLE”,就说明配好了。
2.2 工艺库(.lib)的准备与检查
工艺库,说白了就是芯片的“性格说明书”。PrimePower要靠它知道每个标准单元消耗多少功耗。
2.2.1 .lib文件长什么样
一个典型的.lib文件,开头是这样的:
library (my_library) {
delay_model : "table_lookup";
revision : "1.0";
date : "2024-01-15";
...
cell (AND2X1) {
area : 5.6;
pin (A) {
direction : input;
capacitance : 0.002;
}
pin (Y) {
direction : output;
function : "A & B";
timing () {
...
}
power () {
...
}
}
}
}
这里最关键的是power()部分。PrimePower会从这里读取内部功耗和开关功耗的数据。
2.2.2 检查.lib的完整性
我建议你拿到.lib后,先做三件事:
- 检查功耗信息是否完整——用文本编辑器打开,搜索“power”关键字。如果发现某些cell没有power()描述,那这个库就不能直接用。
- 确认电压和温度条件——在.lib文件头部,会有类似这样的描述:
operating_conditions (typical) {
process : 1.0;
temperature : 25;
voltage : 1.8;
}
你要确保这个条件和你实际分析的场景一致。比如你芯片跑在1.2V,但库是1.8V的,那功耗分析结果肯定不准。
- 检查是否有非线性功耗模型——现在先进工艺的.lib里,功耗往往不是简单的线性关系。PrimePower支持查表模型,你得确认库里有这些表。
read_lib my_library.libreport_lib -power这样能快速看到库的功耗信息是否完整。
2.3 设计网表(Verilog)的导入要求
网表,就是你的芯片设计。PrimePower要读它,才能知道哪些cell连在一起,功耗怎么算。
2.3.1 网表格式要求
PrimePower支持两种网表格式:
- Verilog网表(.v文件)——最常见
- SPICE网表(.sp文件)——精度更高,但速度慢
我个人建议,初期用Verilog网表就够了。等到了后期需要精确分析时,再考虑SPICE。
2.3.2 网表导入的注意事项
嗯,这里有几个坑,我一个个说。
第一,网表必须展平(flatten)。PrimePower不喜欢层次化设计。你最好先跑一下:
current_design top
flatten design
第二,确保所有标准单元都在.lib里。我曾经遇到一个项目,网表里用了一个叫“AND3X2”的cell,但.lib里只有“AND2X1”和“AND3X1”。结果PrimePower直接报错,说找不到这个cell。排查了半天,原来是综合时用了不同的库版本。
第三,网表里不能有未连接的端口。比如:
AND2X1 U1 (.A(net1), .B(net2), .Y()); // Y没连,不行!
这种悬空端口,PrimePower会警告,甚至可能影响功耗计算。
2.3.3 导入命令示例
在PrimePower里,导入网表的命令很简单:
read_verilog my_design.v
current_design top
link
跑完link后,看看有没有报错。如果有“Unresolved reference”之类的信息,说明有cell没找到。这时候,你得检查是不是漏了某个.lib文件。
report_cell -all看看所有cell是不是都正确映射到了库里的标准单元。
2.4 环境验证:跑一个简单的测试
环境搭好后,我建议你跑一个最简单的测试,验证一切正常。
比如,创建一个test.v文件,里面就一个反相器:
module test (input A, output Y);
INVX1 U1 (.A(A), .Y(Y));
endmodule
然后在PrimePower里:
read_verilog test.v
current_design test
link
read_lib my_library.lib
report_power
如果能正常输出功耗报告,恭喜你,环境搭好了!
2.5 本章小结
这一章,咱们把PrimePower的三大基础打好了:
- 工具安装与License——装好、配好、验证好
- 工艺库准备——检查功耗信息、电压条件、模型完整性
- 网表导入——展平、映射、无悬空端口
下一章,咱们就要开始真正的功耗分析了。到时候,我会教你如何设置仿真激励、如何解读功耗报告。准备好了吗?
公众号:蓝海资料掘金营,微信deep3321