OpenLava EDA 实战(一):EDA 计算集群搭建与工具接入

OpenLava EDA 实战(一):EDA 计算集群搭建与工具接入

摘要:芯片设计公司的 EDA 工具(VCS、Verdi、Design Compiler 等)对计算资源和 License 有强依赖。本文讲解如何在 OpenLava 集群上搭建 EDA 计算环境,包括:EDA 工具统一安装管理、FlexLM License 服务器配置、用户环境模块(Module)、文件系统规划、以及第一个 VCS 作业的提交。适合刚接触 EDA 集群管理的工程师参考。

适用场景:数字 IC 设计 / 验证团队,需要把 EDA 工具接入 OpenLava 调度系统。


零、读前必看

0.1 适合谁

  • ✅ 负责 EDA 计算集群管理的 IT / CAD 工程师
  • ✅ 想把 EDA 工具从手动跑改成调度系统管理
  • ✅ 有 OpenLava 基础,想知道 EDA 场景怎么用

0.2 你需要准备什么

项目 要求
OpenLava 集群 已搭好,至少 3 个计算节点
共享存储 NFS / NAS / GPFS,存 EDA 工具和设计数据
License 服务器 FlexLM 服务器(或已有的 License Server)
EDA 工具 Synopsys VCS / Verdi、Cadence 等(商业授权)
设计数据 至少一个可跑的测试用例用来验证

一、EDA 集群架构总览

1.1 典型架构

                ┌──────────────────────┐
                │    License Server     │
                │    (FlexLM, 27000)    │
                └──────────┬───────────┘
                           │ License 查询/占用
         ┌─────────────────┼─────────────────┐
         ▼                 ▼                 ▼
  ┌────────────┐   ┌────────────┐   ┌────────────┐
  │  Master    │   │ compute01  │   │ compute02  │
  │  OpenLava  │   │  EDA工具   │   │  EDA工具   │
  │  (调度)    │   │  (共享挂载)│   │  (共享挂载)│
  └──────┬─────┘   └──────┬─────┘   └──────┬─────┘
         │                │                │
         └────────────────┼────────────────┘
                          │ NFS / NAS 共享存储
                          ▼
                ┌──────────────────────┐
                │  共享存储 /data/eda   │
                │  - tools/  (EDA工具)  │
                │  - projects/ (设计)   │
                │  - home/     (家目录) │
                └──────────────────────┘

1.2 核心组件

组件 作用 关键要求
OpenLava Master 作业调度 高可用
计算节点 跑 EDA 工具 CPU/内存充足,工具路径一致
License Server EDA License 管理 稳定、网络可达
共享存储 工具 + 数据 高吞吐、低延迟
Module 环境 工具版本切换 所有节点一致

1.3 EDA 集群的特殊挑战

挑战 说明
License 是稀缺资源 工具按 License 收费,数量有限,需要合理调度
内存占用大 VCS 仿真、DC 综合动不动几十上百 G 内存
IO 密集 仿真波形文件很大,存储性能很重要
工具版本多 不同项目用不同版本 VCS,需要环境隔离
长作业多 全芯片回归跑几天几夜很正常

二、文件系统规划

2.1 目录结构建议

/data/
├── eda/
│   ├── tools/              # EDA 工具安装
│   │   ├── synopsys/
│   │   │   ├── vcs/
│   │   │   │   ├── O-2018.09-SP2/
│   │   │   │   ├── P-2019.06/
│   │   │   │   └── current -> P-2019.06
│   │   │   └── verdi/
│   │   │       └── 2018.09-SP2/
│   │   ├── cadence/
│   │   └── mentor/
│   ├── license/            # License 文件 + 启动脚本
│   └── modulefiles/        # Module 模块文件
├── projects/               # 设计项目数据
│   ├── chipA/
│   └── chipB/
└── home/                   # 用户家目录(NFS 共享)
    ├── user1/
    └── user2/

2.2 存储性能建议

用途 建议存储类型 IOPS / 带宽
EDA 工具 NFS / NAS 中(只读为主)
设计源码 NFS / NAS
仿真波形(fsdb/vpd) 高速存储(GPFS / Lustre / 本地 SSD) 高(写密集)
家目录 NFS 低 - 中
临时文件(/tmp) 本地 SSD
**经验**:仿真阶段的 IO 压力最大。如果波形直接写 NFS,多用户一起跑会把 NFS 打爆。**建议写到本地 SSD,仿真完再归档到共享存储。**

2.3 挂载所有节点

# /etc/fstab 示例
nas01:/data/eda_tools    /data/eda/tools      nfs  ro,vers=3,hard,intr,rsize=32768,wsize=32768  0 0
nas01:/data/eda_license  /data/eda/license    nfs  ro,vers=3,hard,intr  0 0
nas01:/data/projects     /data/projects       nfs  rw,vers=3,hard,intr,rsize=65536,wsize=65536  0 0
nas01:/data/home         /home                nfs  rw,vers=3,hard,intr  0 0

所有计算节点统一挂载,保证路径一致。

三、FlexLM License 服务器配置

3.1 License 文件结构

Synopsys 的 License 文件(synopsys.dat)大致长这样:

SERVER lic_server01 001122334455 27000
VENDOR snpslmd /data/eda/tools/synopsys/scl/2019.06/linux64/bin/snpslmd
USE_SERVER

INCREMENT VCS_MX snpslmd 2018.09 31-dec-2025 5 ...
INCREMENT Verdi3 snpslmd 2018.09 31-dec-2025 5 ...
INCREMENT Design-Compiler snpslmd 2018.09 31-dec-2025 3 ...
含义
SERVER License 服务器主机名 + MAC + 端口
VENDOR 厂商 daemon 路径
INCREMENT 具体 License 功能 + 版本 + 过期 + 数量

3.2 启动 License 服务

# 1. 安装 FlexLM / SCL
# Synopsys 用 SCL(Synopsys Common Licensing)
cd /data/eda/tools/synopsys/scl/2019.06/linux64/bin

# 2. 启动
./lmgrd -c /data/eda/license/synopsys.dat -l /data/eda/license/logs/synopsys.log

# 3. 查看状态
./lmstat -c 27000@lic_server01
./lmstat -a -c 27000@lic_server01 | head -50

3.3 设置开机自启

# /etc/systemd/system/flexlm-synopsys.service
[Unit]
Description=FlexLM Synopsys License Server
After=network.target

[Service]
Type=forking
User=eda
ExecStart=/data/eda/tools/synopsys/scl/2019.06/linux64/bin/lmgrd \
          -c /data/eda/license/synopsys.dat \
          -l /data/eda/license/logs/synopsys.log
ExecStop=/data/eda/tools/synopsys/scl/2019.06/linux64/bin/lmdown \
          -c /data/eda/license/synopsys.dat -q
Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable flexlm-synopsys
systemctl start flexlm-synopsys

3.4 客户端环境变量

所有计算节点设置 License 服务器地址:

# /etc/profile.d/eda_license.sh
export SNPSLMD_LICENSE_FILE=27000@lic_server01
export LM_LICENSE_FILE=27000@lic_server01:5280@lic_server01  # 多个厂商用冒号分隔
**注意**:不同厂商 License 用不同的端口。把所有 License 服务器地址都加到 `LM_LICENSE_FILE` 环境变量里。

3.5 验证 License 可用

# 在任意计算节点执行
lmstat -a -c 27000@lic_server01 | grep -E "^Users of|Total"
# Users of VCS_MX:  (Total of 5 licenses issued;  Total of 2 licenses in use)
# Users of Verdi3:  (Total of 5 licenses issued;  Total of 1 license in use)

四、Module 环境管理

EDA 工具版本多,用 Environment Modules(也叫 module)统一管理版本切换。

4.1 安装 Module

# CentOS
yum install -y environment-modules

# Ubuntu
# apt install -y environment-modules

4.2 Module 文件示例

# /data/eda/modulefiles/synopsys/vcs/O-2018.09-SP2
#%Module1.0
proc ModulesHelp { } {
    puts stderr "Synopsys VCS O-2018.09-SP2"
}

module-whatis "Synopsys VCS O-2018.09-SP2"

# 前置依赖(需要先加载 SCL)
prereq synopsys/scl/2019.06

# 设置环境变量
setenv VCS_HOME   /data/eda/tools/synopsys/vcs/O-2018.09-SP2
setenv VERDI_HOME /data/eda/tools/synopsys/verdi/Verdi_O-2018.09-SP2

# PATH
prepend-path PATH            /data/eda/tools/synopsys/vcs/O-2018.09-SP2/bin
prepend-path PATH            /data/eda/tools/synopsys/verdi/Verdi_O-2018.09-SP2/bin

# License(可选,也可以在全局设)
setenv SNPSLMD_LICENSE_FILE 27000@lic_server01
# /data/eda/modulefiles/synopsys/scl/2019.06
#%Module1.0
setenv SCL_HOME /data/eda/tools/synopsys/scl/2019.06
prepend-path PATH /data/eda/tools/synopsys/scl/2019.06/linux64/bin

4.3 配置 MODULEPATH

# /etc/profile.d/modulepath.sh
export MODULEPATH=/data/eda/modulefiles/synopsys:/data/eda/modulefiles/cadence:$MODULEPATH

4.4 使用 Module

# 查看可用模块
module avail

# 加载模块
module load synopsys/scl/2019.06
module load synopsys/vcs/O-2018.09-SP2

# 查看已加载
module list

# 卸载
module unload synopsys/vcs/O-2018.09-SP2

# 切换版本
module swap synopsys/vcs/O-2018.09-SP2 synopsys/vcs/P-2019.06
**关键**:用户提交作业时在脚本里 `module load` 对应版本,确保作业跑在正确的工具版本上。

五、EDA 工具接入 OpenLava

5.1 第一个 VCS 作业

#!/bin/bash
#BSUB -J vcs_compile
#BSUB -q normal
#BSUB -n 4
#BSUB -R "rusage[mem=8192] span[hosts=1]"
#BSUB -o vcs_compile.log
#BSUB -e vcs_compile.err
#BSUB -W 2:00

# 加载环境
source /etc/profile.d/modules.sh
module load synopsys/scl/2019.06
module load synopsys/vcs/O-2018.09-SP2

# 切换到工作目录
cd /data/projects/chipA/verif/top

echo "=== 开始 VCS 编译 ==="
echo "Job ID: $LSB_JOBID"
echo "Host: $(hostname)"
echo "VCS version: $(vcs -v 2>&1 | head -1)"

# 编译
vcs -full64 -f filelist.f -top tb_top \
    -debug_access+all \
    -o simv \
    -j4 2>&1

exit_code=$?
echo "=== VCS 编译结束,退出码: $exit_code ==="
exit $exit_code

提交:

bsub < vcs_compile.sh

5.2 跑仿真

#!/bin/bash
#BSUB -J vcs_sim
#BSUB -q normal
#BSUB -n 2
#BSUB -R "rusage[mem=16384] span[hosts=1]"
#BSUB -o sim.log
#BSUB -e sim.err
#BSUB -W 8:00

source /etc/profile.d/modules.sh
module load synopsys/scl/2019.06
module load synopsys/vcs/O-2018.09-SP2

cd /data/projects/chipA/verif/top

echo "=== 开始仿真 ==="
echo "TestCase: $TESTCASE"
echo "Start time: $(date)"

# 跑仿真
./simv +TESTNAME=$TESTCASE +UVM_VERBOSITY=LOW \
      -fsdb -fgp -ntb_opts uvm 2>&1

exit_code=$?
echo "End time: $(date)"
echo "Exit code: $exit_code"
exit $exit_code

提交:

bsub -env "TESTCASE=test_smoke" < vcs_sim.sh

5.3 查看作业运行情况

# 看实时输出
bpeek -f <jobid>

# 看 License 占用
lmstat -a | grep -A5 "Users of VCS_MX"

六、用户使用规范建议

6.1 提交脚本模板

给团队一个标准模板,统一规范:

#!/bin/bash
# ======================================
# EDA Job Template v1.0
# ======================================
#BSUB -J <job_name>
#BSUB -q <queue>
#BSUB -n <num_slots>
#BSUB -R "rusage[mem=<mem_mb>] span[hosts=1]"
#BSUB -W <wall_time>
#BSUB -o %J.out
#BSUB -e %J.err
#BSUB -u <your_email>

# === 环境加载 ===
source /etc/profile.d/modules.sh
module load synopsys/scl/2019.06
module load synopsys/vcs/O-2018.09-SP2

# === 工作目录 ===
cd $LS_SUBCWD || cd /data/projects/...

# === 运行 ===
echo "Start: $(date)"
echo "Host: $(hostname)"
echo "JobID: $LSB_JOBID"

# 你的命令
<your_command_here>

echo "End: $(date)"

6.2 常见错误行为

❌ 不推荐 ✅ 推荐 原因
直接在登录节点跑仿真 用 bsub 提交到计算节点 登录节点扛不住
-n 16 -R "mem=4096" 实际只用 2 核 按需申请资源 浪费槽位,挤占他人
波形写 NFS 共享目录 写本地 /tmp,跑完归档 NFS 性能瓶颈
不设运行上限 -W 设置合理时限 挂起的作业占资源
不写输出文件 -o -e 记录日志 出问题没法查

七、计算节点环境检查清单

新节点上线前,逐项验证:

  • [ ] NFS 挂载正确(工具/项目/家目录)
  • [ ] Module 命令可用
  • [ ] module load 各工具版本正常
  • [ ] which vcs / which verdi 路径正确
  • [ ] lmstat -a 能查到 License
  • [ ] vcs -v 能输出版本信息
  • [ ] 标准测试用例能跑通
  • [ ] bhosts 里节点状态是 ok
  • [ ] 提交一个测试作业能正常 RUN 并 DONE
  • [ ] 本地 /tmp 空间足够(建议 ≥ 100G)

八、写在最后

EDA 集群搭建的核心是"一致性"

  • 所有计算节点的工具路径一致
  • 所有节点的环境变量一致
  • 所有节点能访问 License 服务器
  • 所有节点能访问共享存储

做到这几点,EDA 工具接入 OpenLava 就水到渠成了。

下一篇我们深入讲 License 调度管理:怎么把 FlexLM 的 License 数量作为 OpenLava 的可消耗资源,让调度器根据 License 余量自动调度,避免出现"License 不够导致作业启动失败"的尴尬。


你的 EDA 集群用哪些工具?最头疼的问题是什么? 评论区聊聊。

OpenLava #EDA #VCS #FlexLM #License #芯片设计 #运维 #Module

发表回复

后才能评论