EDA 项目区与工作流规范(行业惯例 vs 本集群现状)¶
主题:共享存储目录如何组织、Cadence 工具在什么目录启动、
cds.lib归谁——以及本集群现状与行业标准的差距 文档性质:只读梳理与规范说明(A 类),不含任何系统变更 依据:2026-09-27 本集群实测取证 + EDA 行业通行做法 触发:用户rain01在/projects根执行cp /pdk/templates/.cdsinit ./报Permission denied
0. 一句话结论¶
目录拆分(/home、/projects、/tools、/pdk、$SCRATCH)完全符合行业标准;
与行业不一致的是工作习惯——"家目录当工作区、cds.lib 放家目录"是个人学习/小团队惯性,
设计公司里工作区是项目目录,cds.lib 归项目。
/projects 根不可写不是缺陷,而是项目区权限模型在正常生效。
1. 环境事实(本集群实测,2026-09-27)¶
1.1 目录与权限¶
| 路径 | 权限(实测) | 说明 |
|---|---|---|
/projects |
drwxr-xr-x root:root |
管理区容器,仅 root 可写(用户 cp 失败的根因) |
/projects/design |
drwxrwsr-x root:design |
setgid,design 组成员可写 |
/projects/cad |
drwxrwsr-x root:cad |
同上(CAD 职能组) |
/projects/dv |
drwxrwsr-x root:dv |
验证职能组 |
/projects/custom |
drwxrwsr-x root:custom |
定制职能组 |
/projects/layout |
drwxrwsr-x root:layout |
版图职能组 |
/projects/pnr |
drwxrwsr-x root:pnr |
布局布线职能组 |
/projects/signoff |
drwxrwsr-x root:signoff |
签核职能组 |
/projects/sre |
drwxrwsr-x root:sre |
平台/运维职能组 |
/pdk |
NFS ro(六台) |
PDK 只读共享 |
/tools |
NFS ro(六台) |
工具只读共享 |
实测命令与过滤:
stat -c '%A %U:%G %n' /data/nfs/projects /data/nfs/projects/*
ssh root@192.168.31.28 'findmnt -rno TARGET,SOURCE /home /projects /tools /pdk'
1.2 用户与职能组的对应关系(实测)¶
| 用户 | uid | 主组(gid) | 对应职能目录 |
|---|---|---|---|
rain01 |
2001 | design(2000) |
/projects/design |
cloud01 |
3001 | dv(3000) |
/projects/dv |
cy01 |
4001 | custom(4000) |
/projects/custom |
david01 |
5001 | layout(5000) |
/projects/layout |
lws01 |
6001 | cad(6000) |
/projects/cad |
cq01 |
6101 | sre(6100) |
/projects/sre |
ldapadmin |
9001 | sre(6100) |
/projects/sre |
实测命令:
ssh root@192.168.31.28 'id rain01' # uid=2001(rain01) gid=2000(design) groups=2000(design)
ls -ld /data/nfs/home/* # 家目录 uid:gid 与职能组一一对应
含义:rain01 的"自己人目录"是 /projects/design,不是 /projects。
其余用户同理——每个职能组成员只在自己的职能目录内有写权限,跨职能目录写会被拒(这是刻意的隔离)。
1.3 与集成相关的既有事实¶
- IC617 modulefile 设
CDS_LOAD_ENV=CWD→ Virtuoso 只从当前工作目录读.cdsinit/cds.lib。 CDK_DIR(NCSU CDK 根)由 IC617 modulefile 下发:/pdk/ncsu-cdk-1.6.0.beta。- 站点模板在
/pdk/templates/{.cdsinit,cds.lib}(只读),供用户复制使用。 /projects/*各职能目录当前为空(骨架已建、项目尚未开始)。
2. 问题定性:为什么 /projects 根不可写是正常的¶
/projects 是项目区的容器,不是工作区。行业里它通常 root:root 755:
- 防误建:避免在职能目录之外冒出散落目录,事后无法归类;
- 便于配额与审计:配额、备份策略、生命周期按项目/职能分配,容器层不承担;
- 职责分离:项目目录由 CAD/平台团队按流程创建并授权,而不是谁都能建。
因此报错 Permission denied 表示权限模型工作正常,需要做的是把文件放到正确的位置,
而不是把 /projects 开放写权限。
3. EDA 行业的分层模型¶
| 层 | 路径 | 维护者 | 用户权限 | 生命周期 |
|---|---|---|---|---|
| 工具安装 | /tools(如 Virtuoso/MMSIM/ASSURA/Calibre) |
CAD 管理员 | 只读 | 版本化,随升级更替 |
| PDK / IP | /pdk |
CAD 管理员 | 只读 | 版本锁定,只引用不复制 |
| 配置模板 | /pdk/templates |
CAD 管理员 | 只读 | 随站点规范更新 |
| 项目工作区 | /projects/<职能或项目>/<项目或用户>/ |
项目组 | setgid + 组写 | 项目周期 |
| 个人配置 | $HOME |
用户本人 | 700 | 随人,通常有小配额 |
| 临时/大数据 | $SCRATCH |
用户 | 独占 | 有清理策略,不保证留存 |
三条硬规则:
- 工具与 PDK 只读:用户永远不写
/tools、/pdk; - PDK 只引用不复制:
cds.lib里用SOFTINCLUDE/DEFINE指向/pdk,复制会造成版本漂移, 且各项目的"用的是哪个 PDK 版本"将无法追溯; - 需要留存的东西不进
$SCRATCH:仿真波形、临时提取放$SCRATCH,库与配置放项目区。
4. Cadence 配置的三层加载(行业标准做法)¶
| 层 | 位置 | 谁维护 | 典型内容 |
|---|---|---|---|
| site | $CDS_INST_DIR/tools/dfII/local/.cdsinit(工具树内) |
CAD 管理员 | 站点级 Skill 加载(如 Calibre Skill 界面、PDK 定制)、统一路径 |
| project | 项目目录下的 .cdsinit + cds.lib |
项目负责人 | 本项目用哪些库、锁定哪个 PDK 版本、项目级 Skill |
| user | $HOME/.cdsinit、$HOME/.cdsenv |
用户本人 | 个人偏好:bindkey、字体/颜色、窗口布局、个人脚本 |
CDS_LOAD_ENV 决定 Cadence 从哪里加载这些文件:
- 本集群实测取值为
CWD(只读当前工作目录)——这也是为什么"在哪个目录启动 Virtuoso"很关键; - 行业里常见设为
CWD HOME之类多层组合(工作目录优先、家目录兜底), 语义与分隔符随 Cadence 版本略有差异,落地前须在本版本实测确认,不要照抄。
cds.lib 本身的语法要点(本项目模板已按此实现):
-- 注释符是「--」(不是「;;」;用错会让被注释的语句仍被执行)
SOFTINCLUDE $CDK_DIR/cdssetup/cds.lib -- 软包含:文件缺失不报错
-- INCLUDE /path/to/other/cds.lib -- 硬包含:文件缺失即报错
-- DEFINE myLib /projects/design/rain01/proj1/design/myLib
5. 行业里的真实日常¶
- 登录 →
cd到项目目录 → 启动 Virtuoso。 由于CDS_LOAD_ENV=CWD,工作目录决定加载哪个项目的cds.lib;不少公司提供 wrapper (如run_virtuoso)把"设环境 +cd+ 启动"一步做完。 cds.lib属于项目,随项目进版本管理。库级版本管理在行业里是标配: Cadence Design Management (DM)、Cliosoft SOS、IC Manage(库级签出/版本), 文本类资产也有用 git / Perforce 的。裸目录共享只适合单人。$HOME只放个人偏好与个人脚本,不放设计库、不放项目cds.lib、不放仿真数据。 家目录通常有配额(常见数百 MB 到数 GB 量级,各公司不同),且备份策略只覆盖配置类小文件。- 交付物有明确归属:签核结果、release 快照归项目的
signoff/、release/, 不由个人保管;个人目录里的东西原则上"可丢弃"。
6. 典型项目区目录结构(行业惯例)¶
/projects/<项目名>/
├── cdssetup/ # 项目级配置:cds.lib、.cdsinit、cdsenv(进版本管理)
├── design/ # 设计库(schematic / symbol / 各 library)
├── verif/ (或 dv/) # 验证环境、测试用例、回归脚本
├── layout/ # 版图
├── pnr/ # 布局布线(数字流程)
├── signoff/ # DRC / LVS / PEX / STA 结果
├── release/ # tapeout 交付快照(只读归档)
└── docs/ # 项目文档
本集群的骨架是按职能切的一层(/projects/<职能>/),项目与用户在职能目录下再分层,
即 /projects/<职能>/<项目或用户>/...——职能化与项目化只是切法不同,都属行业常见组织方式。
6.1 三个容易混的概念:用户名 / 家目录 / 项目区目录¶
三者常被当成一回事,实测对照如下(2026-09-27,以 rain01 为例):
| 概念 | 本集群取值 | 性质 |
|---|---|---|
| 用户名(账号) | rain01 |
LDAP 身份,唯一,用于登录 |
| 家目录 | /home/rain01 |
账号的一个属性(LDAP 的 homeDirectory 字段),建账号即确立 |
| 项目区个人目录 | /projects/design/rain01/ |
人为命名惯例,需自行创建;不建也合法 |
实证(一行即可看出家目录是账号属性):
ssh root@192.168.31.28 'getent passwd rain01'
# rain01:*:2001:2000:rain01:/home/rain01:/bin/csh
# └uid┘└gid┘ └注释┘ └homeDirectory┘ └shell┘
同名 ≠ 同物,二者在四个维度上完全不同:
| 维度 | 家目录 /home/rain01 |
项目区 /projects/design/rain01/ |
|---|---|---|
| 实测权限 | drwx------ rain01:design(700,同组同事都看不见) |
继承 setgid → rain01:design,组内可见可写 |
| 放什么 | .cdsinit、.cdsenv、.bashrc、个人脚本 |
库、项目 cds.lib、设计数据 |
| 备份 / 配额 | 只备份配置类小文件,通常有小配额 | 按项目策略备份 |
| 生命周期 | 随账号(离职即处理) | 随项目(项目结束归档 / 清理) |
因此"家目录当工作区"在协作上不成立——家目录是 700,同组同事连列目录都不行,
更谈不上签出/合并。要协作,数据必须在项目区。
<用户名> 只是命名建议,不是行业硬性要求。两种常见变体都合规范:
- 按项目切:
/projects/<project>/<block 或 role>/,不设个人目录,作者身份由 DM/版本管理标识; - 按人切(本集群的"职能组 + 个人目录"式):便于小团队各自独立、职责清晰。
两层内容不重叠(家目录只放配置,项目区只放数据),因此不存在"同名目录重复"的问题:
/home/rain01/ ← 家目录:.cdsinit、.cdsenv、个人脚本
/projects/design/rain01/proj1/ ← 项目区:库与项目配置
├── cdssetup/ ← 项目级 cds.lib、.cdsinit
└── design/ ← 自己的 library
7. 本集群现状与行业标准的差距¶
| # | 差距 | 严重度 | 说明 |
|---|---|---|---|
| 1 | 项目区只有空骨架,尚无项目结构 | 低(尚未使用) | /projects/design 等为空;缺 cdssetup/ + 库目录的模板 |
| 2 | cds.lib 被当作"家目录里的个人文件" |
中 | 习惯源于个人学习/教学;标准中它属项目,需版本管理 |
| 3 | 无库版本管理(DM/SOS/git) | 中 | 单人/教学可省略;一旦多人协作必须补,否则无法追溯与回滚 |
目录拆分本身没有问题:/home、/projects、/tools、/pdk、$SCRATCH 五分离正是行业标准布局。
8. 解决方案¶
8.1 立即解决(用户侧,零系统变更)¶
在自己职能组目录下建项目目录,配置与库都放项目里:
# rain01 ∈ design 组 → 落点在 /projects/design 下
mkdir -p /projects/design/rain01/proj1/cdssetup
cd /projects/design/rain01/proj1
cp /pdk/templates/.cdsinit /pdk/templates/cds.lib ./cdssetup/
# 项目级 cds.lib 里定义自己的库(示例)
# DEFINE myLib /projects/design/rain01/proj1/design/myLib
# PDK 用 SOFTINCLUDE 引用,不复制实体
module load cadence; module load virtuoso/IC06.17.700
module load siemens; module load calibre/2015.2_36.27
cd /projects/design/rain01/proj1/cdssetup && virtuoso &
要点:
- setgid 生效:在
/projects/design/下新建的目录自动继承design组,便于组内协作; - 只复制配置、不复制 PDK:模板里的
SOFTINCLUDE $CDK_DIR/cdssetup/cds.lib已指向/pdk; - 仿真大文件放
$SCRATCH,不要写进/projects(会撑爆共享盘配额并拖慢备份)。
8.2 规范增强(管理侧,属变更,需单独确认)¶
| 方案 | 做法 | 收益 | 代价 |
|---|---|---|---|
| A. 站点级零配置(最符合行业惯例) | 把"加载 Calibre Skill 界面 + NCSU CDK"写进 IC617 的 site .cdsinit($CDS_INST_DIR/tools/dfII/local/.cdsinit) |
所有用户、所有目录自动生效,无人需要复制模板 | /tools 需 rw 窗口 + 六台回归;影响面为全体用户 |
| B. 个人级一次配置 | CDS_LOAD_ENV 由 CWD 改为 CWD HOME(多层加载),用户把模板放 $HOME 一次 |
个人所有设计目录生效 | 需实测本版本的多值语法;改 modulefile 影响六台 |
| C. 维持现状 + 规范上墙 | 保留"模板 + 用户复制",但把项目区落点规则写进文档/公告 | 零系统风险 | 每个新用户都会先踩一次 /projects 只读 |
8.3 两条都合规范的路(按你的定位选)¶
路径 1|标准做法(推荐给团队/正式项目)
$HOME 只留 .cdsinit、.cdsenv(个人偏好);cds.lib 放项目 cdssetup/ 并纳入版本管理;
工作流固定为 cd <项目目录> → 启动 Virtuoso。
路径 2|务实中间做法(个人/小团队常见,关键是"指针化")
家目录可以有 cds.lib,但它只是指针,真正的库定义仍在项目里:
-- $HOME/cds.lib —— 仅作转发,不是工作区
INCLUDE /projects/design/rain01/proj1/cdssetup/cds.lib
这样在家目录启动 Virtuoso 也能看到项目全部库(含 PDK),而库数据仍在项目区、PDK 仍只引用。
注意:指针式家目录 cds.lib 一次只指向一个项目;同时做多个项目时必须 cd 到各自项目目录,
否则容易"改了 A 项目却以为在 B 项目"。
8.4 从现状到标准的最小落地步骤¶
- 在
/projects/<自己职能组>/<用户名>/下建项目目录(含cdssetup/、design/); - 项目
cds.lib定义自己的库 +SOFTINCLUDE引用 PDK; $HOME保留个人.cdsinit/.cdsenv,删掉家目录里的设计库;- 形成固定习惯:先
cd项目目录,再起工具; - 多人协作时引入库版本管理(DM / SOS / IC Manage 或 git 管文本)。
9. 常见反模式清单¶
| 反模式 | 后果 | 正确做法 |
|---|---|---|
在 /projects 根建文件/目录 |
被拒(权限模型生效);即便开放也会导致目录失控 | 进自己职能组目录 |
设计库放 $HOME |
无协作、无备份策略、配额爆、离职即丢 | 库放项目区 |
| 复制 PDK 到项目区 | 版本漂移、多人不一致、占空间 | SOFTINCLUDE/DEFINE 只引用 |
往 /tools、/pdk 写文件 |
只读挂载,失败;且影响六台共享资产 | 配置放项目或个人目录 |
仿真波形/临时数据写 /projects |
共享盘膨胀、备份变慢、可能有配额告警 | 写 $SCRATCH(注意会被清理) |
把 cds.lib 当"家目录个人文件"长期维护 |
项目切换混乱、无法追溯 | 归项目 + 版本管理;家目录最多放指针 |
10. 答疑(FAQ)¶
Q1:登录后就在家目录,直接把 cds.lib 放家目录启动 Virtuoso,可以吗?
可以,但要分清两种情形:
① 学习/单项目:可行(等价于把家目录当工作区),但库也随之留在家目录,属"非标准但可接受";
② 正式项目/多人协作:应放项目目录,家目录最多放 INCLUDE 指针(见 8.3 路径 2)。
Q2:/projects 明明是我的集群,为什么我不能写根目录?
/projects 是容器层,按职能/项目授权到子目录(setgid + 组权限),根目录归 root。
这是防误建、便于配额与审计的设计,不是权限配错。
Q3:/projects 与 $SCRATCH 到底怎么分工?
/projects 放需要留存的东西(库、配置、签核结果);$SCRATCH 放可丢弃的大数据
(波形、临时提取、中间文件)。判据一句话:"下周还需要它吗?" 需要就进 /projects。
Q4:我的工作目录到底应该是哪个?
标准答案是项目目录(/projects/<职能>/<项目>/cdssetup 或具体模块目录),
Virtuoso 从该目录启动;$HOME 是"落脚点",不是工作区。
Q5:不做版本管理行不行? 单人可以;一旦两人以上改同一批库,必须有库级版本管理(DM/SOS/IC Manage), 否则互相覆盖且无法回滚——这是行业里区分"能跑"与"可交付"的分水岭。
11. 附:路径速查¶
| 用途 | 路径 |
|---|---|
| 工具(只读) | /tools/cadence/virtuoso/IC617、/tools/cadence/mmsim/MMSIM151、/tools/cadence/assura/ASSURA41、/tools/mentor/calibre/aoi_cal_2015.2_36.27 |
| PDK(只读) | /pdk/{ncsu-cdk-1.6.0.beta,FreePDK45,FreePDK15} |
| 集成模板(只读) | /pdk/templates/{.cdsinit,cds.lib} |
| 模块加载 | module load cadence; module load virtuoso/IC06.17.700;module load siemens; module load calibre/2015.2_36.27 |
| 项目区 | /projects/<职能>/<项目>/(rain01 → /projects/design/) |
| 个人配置 | $HOME/.cdsinit、$HOME/.cdsenv |
| 临时数据 | $SCRATCH |
| 本级集群共享源 | 192.168.31.249:/data/nfs/{home,projects,tools,pdk} |
12. 状态声明¶
- 本文档为只读梳理与规范说明:第 1 章的权限/身份/挂载事实来自 2026-09-27 的只读取证; 第 3–6、9–10 章为 EDA 行业通行做法(行业惯例,非本集群实测结论)。
- 未执行任何系统变更:未改
/projects、/pdk、/tools权限,未建目录,未改 fstab 与 modulefile。 - 第 8.2 章的三个规范增强方案(A/B/C)与 8.4 的落地步骤均待决策,实施前需按变更流程单独确认。
来源:
/home/rain/Documents/eda_tools_ins/Cadence/eda_workspace_standard_20260927/EDA-项目区与工作流规范.md| 最后更新:2026-09-27 22:12(由build/sync.py同步,请勿在站点侧修改)