第二章 环境搭建与工具链:Linux环境准备、EDA工具安装与License配置、Makefile流程管理基础

说实话,很多刚入行的朋友觉得芯片设计就是写写代码、跑跑流程。但以我十五年的经验来看,环境搭建才是第一道坎。搞不定这个,后面全是白搭。

我记得刚入行那会儿,带我的老工程师扔给我一台服务器,说「把环境配好」。我对着屏幕愣了半天——Linux不熟、EDA没装过、License更是听都没听过。折腾了整整一周才跑通第一个综合。嗯,今天我就把这些坑帮你填上。

2.1 Linux环境准备

做数字后端,Linux是躲不开的。我个人习惯用Red Hat Enterprise Linux或者CentOS,稳定第一。Ubuntu也能用,但有些EDA工具对它的支持没那么好。

注意:千万别在生产环境用最新的Linux发行版。EDA工具对新内核的兼容性往往滞后半年到一年。我见过有人用Ubuntu 22.04装ICC2,折腾三天最后发现是内核版本不匹配。

你需要准备的基础环境包括:

  • 操作系统:RHEL 7.x 或 CentOS 7.x(推荐)
  • 磁盘空间:至少500GB,建议1TB以上。一个28nm的项目,光数据就能吃掉200GB
  • 内存:32GB起步,64GB算标配。做顶层Floorplan时,16GB机器直接卡死
  • CPU:16核以上,主频越高越好。后端工具对单核性能很敏感

装完系统后,有几个基础包必须装上:

# 基础开发工具
yum groupinstall -y "Development Tools"
yum install -y glibc.i686 libstdc++.i686

# 图形界面依赖(EDA工具需要)
yum install -y libXext libXft libXrender libXrandr libXfixes

# 网络与时间同步
yum install -y ntp
systemctl enable ntpd
systemctl start ntpd

这里有个小技巧——一定要关掉SELinux。我当年第一次装Synopsys工具,License死活起不来,查了两天才发现是SELinux在捣鬼。

# 临时关闭
setenforce 0

# 永久关闭(改完重启)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2.2 EDA工具安装与License配置

后端流程主要用两大阵营的工具:Synopsys和Cadence。我个人的经验是,两者各有千秋,但实际项目中往往混着用。

流程环节 Synopsys工具 Cadence工具
逻辑综合 Design Compiler (DC) Genus
布局布线 IC Compiler II (ICC2) Innovus
时序分析 PrimeTime (PT) Tempus
物理验证 ICV PVS / Assura

安装步骤其实大同小异。以Synopsys的ICC2为例:

# 1. 解压安装包
tar -xzvf ICC2_v2020.12.tar.gz -C /tools/synopsys/

# 2. 设置安装目录
cd /tools/synopsys/ICC2_v2020.12
./installer -gui

# 3. 按提示选择安装路径,一般放在 /tools/synopsys/ICC2/
我的习惯:把工具统一装在 /tools 下,按厂商分目录。比如 /tools/synopsys/、/tools/cadence/。这样环境变量好管理,备份也方便。

装完工具,最头疼的就是License。说白了,License就是个授权文件,告诉工具你能用哪些功能、用多久。

配置License的步骤:

  1. 获取MAC地址:ifconfigip link 查看
  2. 生成License文件:把MAC地址发给厂商,拿到 .lic 文件
  3. 启动License服务:用 lmgrd 启动
# 设置环境变量
export SNPSLMD_LICENSE_FILE=27000@localhost
export LM_LICENSE_FILE=27000@localhost

# 启动License服务(建议加到rc.local里开机自启)
/tools/synopsys/scl/2020.12/linux64/bin/lmgrd \
  -c /tools/synopsys/license/synopsys.lic \
  -l /var/log/synopsys_license.log
我曾经踩过的坑:License文件里的hostname必须和服务器实际hostname一致。有一次我改了服务器名字忘了更新License,结果所有工具都报「License checkout failed」。排查了整整一下午,最后发现是hostname不匹配。

2.3 环境变量配置

每次打开终端都要敲一堆 export 太麻烦了。我习惯把这些写到 .bashrc 或 .cshrc 里。

# ~/.bashrc 中添加

# Synopsys工具
export SYNOPSYS=/tools/synopsys
export DC_HOME=$SYNOPSYS/DC/2020.12
export ICC2_HOME=$SYNOPSYS/ICC2/2020.12
export PT_HOME=$SYNOPSYS/PT/2020.12

export PATH=$DC_HOME/bin:$ICC2_HOME/bin:$PT_HOME/bin:$PATH

# Cadence工具
export CADENCE=/tools/cadence
export INNOVUS_HOME=$CADENCE/Innovus/21.10

export PATH=$INNOVUS_HOME/bin:$PATH

# License
export SNPSLMD_LICENSE_FILE=27000@localhost
export CDS_LIC_FILE=5280@localhost

这里有个细节——不同工具的License端口不要冲突。Synopsys默认用27000,Cadence用5280。如果你有多个License服务,端口号要分开。

2.4 Makefile流程管理基础

后端流程步骤多、脚本杂。用手动敲命令的方式管理,迟早会出乱子。我强烈建议用Makefile来管理整个流程。

为什么用Makefile?说白了就三点:

  • 自动化:一条命令跑完整个流程
  • 增量更新:只重新运行有变化的部分
  • 可复现:别人拿到你的Makefile,能一模一样跑出结果

一个典型的后端流程Makefile长这样:

# Makefile for Digital Backend Flow

# 变量定义
DESIGN = top
TECH_LIB = /libs/tsmc28nm
CLOCK_PERIOD = 1.0

# 目标定义
all: syn floorplace cts route sta

# 逻辑综合
syn:
	dc_shell -f scripts/syn.tcl -log logs/syn.log

# 布局与布局规划
floorplace: syn
	icc2_shell -f scripts/floorplan.tcl -log logs/floorplan.log

# 时钟树综合
cts: floorplace
	icc2_shell -f scripts/cts.tcl -log logs/cts.log

# 布线
route: cts
	icc2_shell -f scripts/route.tcl -log logs/route.log

# 静态时序分析
sta: route
	pt_shell -f scripts/sta.tcl -log logs/sta.log

# 清理
clean:
	rm -rf work/ logs/ *.log

.PHONY: all syn floorplace cts route sta clean
我的建议:每个步骤之间用依赖关系串起来。比如 floorplace: syn 表示做Floorplan之前必须先跑完综合。这样Make会自动判断哪些步骤需要重新执行。

使用方式很简单:

# 跑完整流程
make all

# 只跑综合和布局
make syn floorplace

# 重新跑CTS(会先检查依赖是否最新)
make cts

# 清理中间文件
make clean

你想想看,如果项目有30个模块,每个模块都要跑5个步骤。手动敲命令得敲150次,还容易敲错。用Makefile,一条 make all 搞定。

2.5 避坑指南与个人经验

最后分享几个我这些年总结的经验:

  • 磁盘空间要留够:有一次跑完PR,发现磁盘满了,结果最后一步的GDS没写完整。流片回来才发现有个模块是空的...嗯,从那以后我每周都检查磁盘使用率。
  • 版本管理要做好:工具版本、库文件版本、脚本版本,全部用Git管理。别问我为什么——当你发现三个月前的脚本跑不出结果时,你会感谢我的。
  • 日志文件要保留:每个步骤的log都按日期命名,比如 syn_20241001.log。出了问题,第一件事就是翻日志。
  • 多核并行要谨慎:不是核数越多越好。我试过用64核跑Placement,结果内存带宽成了瓶颈,反而比32核还慢。一般建议用物理核数的50%-75%。

环境搭建这一步,看起来琐碎,但基础打好了,后面的流程才能走得顺。说白了,这就是芯片设计的「地基工程」。地基不稳,楼盖得再高也是白搭。

下一章,我们开始真正动手——从RTL综合开始,一步步把代码变成版图。