跳转至

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:

  1. 防误建:避免在职能目录之外冒出散落目录,事后无法归类;
  2. 便于配额与审计:配额、备份策略、生命周期按项目/职能分配,容器层不承担;
  3. 职责分离:项目目录由 CAD/平台团队按流程创建并授权,而不是谁都能建。

因此报错 Permission denied 表示权限模型工作正常,需要做的是把文件放到正确的位置, 而不是把 /projects 开放写权限。


3. EDA 行业的分层模型

层 路径 维护者 用户权限 生命周期
工具安装 /tools(如 Virtuoso/MMSIM/ASSURA/Calibre) CAD 管理员 只读 版本化,随升级更替
PDK / IP /pdk CAD 管理员 只读 版本锁定,只引用不复制
配置模板 /pdk/templates CAD 管理员 只读 随站点规范更新
项目工作区 /projects/<职能或项目>/<项目或用户>/ 项目组 setgid + 组写 项目周期
个人配置 $HOME 用户本人 700 随人,通常有小配额
临时/大数据 $SCRATCH 用户 独占 有清理策略,不保证留存

三条硬规则:

  1. 工具与 PDK 只读:用户永远不写 /tools、/pdk;
  2. PDK 只引用不复制:cds.lib 里用 SOFTINCLUDE/DEFINE 指向 /pdk,复制会造成版本漂移, 且各项目的"用的是哪个 PDK 版本"将无法追溯;
  3. 需要留存的东西不进 $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. 行业里的真实日常

  1. 登录 → cd 到项目目录 → 启动 Virtuoso。 由于 CDS_LOAD_ENV=CWD,工作目录决定加载哪个项目的 cds.lib;不少公司提供 wrapper (如 run_virtuoso)把"设环境 + cd + 启动"一步做完。
  2. cds.lib 属于项目,随项目进版本管理。库级版本管理在行业里是标配: Cadence Design Management (DM)、Cliosoft SOS、IC Manage(库级签出/版本), 文本类资产也有用 git / Perforce 的。裸目录共享只适合单人。
  3. $HOME 只放个人偏好与个人脚本,不放设计库、不放项目 cds.lib、不放仿真数据。 家目录通常有配额(常见数百 MB 到数 GB 量级,各公司不同),且备份策略只覆盖配置类小文件。
  4. 交付物有明确归属:签核结果、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 从现状到标准的最小落地步骤

  1. 在 /projects/<自己职能组>/<用户名>/ 下建项目目录(含 cdssetup/、design/);
  2. 项目 cds.lib 定义自己的库 + SOFTINCLUDE 引用 PDK;
  3. $HOME 保留个人 .cdsinit/.cdsenv,删掉家目录里的设计库;
  4. 形成固定习惯:先 cd 项目目录,再起工具;
  5. 多人协作时引入库版本管理(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 同步,请勿在站点侧修改)