简介:这份《VCS_User_Guide.pdf》是Synopsys官方出品的VCS用户指南,面向从事数字、模拟及混合信号IC设计的验证工程师与在校学习者,帮助其系统掌握Verification Continuum工具的配置与自动化验证流程。资源包内仅含1个PDF文件,大小约11.36MB,内容覆盖仿真器环境搭建、synopsys_sim.setup文件创建、库概念与库名映射、许可证获取、命令行与图形界面配置方法,以及日志查看和调试工具排错等模块,目录层级清晰,便于按章节检索。手册还涉及仿真抢占支持、技术对应的仿真器支持等进阶主题,可作为日常查阅的案头参考。目前已有4335人学习下载,适合需要从入门到进阶理解VCS使用逻辑、补齐配置与排错思路的IC设计从业者。
1. 从一台刚装完系统的仿真机说起:VCS 2021.09 环境搭建到底卡在哪
上周帮一位做数字前端的朋友收拾一台刚重装系统的仿真机,VCS 装是装上了,vcs -ID也能打印版本号,可一跑vcs -full64编译就报 license 拿不到,换vlogan分析 VHDL 又提示库映射找不到。折腾到半夜才发现,问题根本不在工具本身,而是synopsys_sim.setup没建、LM_LICENSE_FILE指错了端口、VCS_HOME还留着上一版路径。这类翻车在 IC 设计验证环境里太常见了——VCS 2021.09 这套仿真环境,装完不等于能用,能编译不等于能跑通,中间隔着 license、setup 文件、库映射、环境变量四道坎。这篇笔记按我实际部署的顺序,从版本选择、环境准备、安装配置到验证排错,一步步走完,新手能照着复现,熟手能对照看参数取舍。
2. 装前把环境列清楚:VCS 2021.09 的版本、依赖与目录规划
2.1 版本选择:为什么锁定 2021.09 而不是随手拿最新包
VCS 的版本号跟发行批次绑定,2021.09 是 2021 年 9 月批次,属于 S 系列发行版。选版本不是越新越好,我一般看三件事:一是设计里用到的 SystemVerilog 特性是否被该版本支持,2021.09 对 IEEE 1800-2017 的主流语法覆盖已经够用,-debug_access系列选项也齐全;二是与 Verdi、Design Compiler 等周边工具的版本对齐,同一批次的工具链联调时数据库格式最稳;三是 license 文件的 feature 版本,老 license 服务器上如果只签了 2020 批次的 feature,装 2021.09 会直接拿不到授权。常见做法是先问清楚 license 里vcs、vcs_runtime、vcsverilog这些 feature 的版本上限,再决定装哪个批次,别装完才发现授权对不上。
版本确认后,安装包通常是一个VCS_2021.09_xxx.tar.gz加一个 installer 目录,解压后先看doc/下有没有third_party_notices.txt,有就说明包是完整的。安装路径我习惯统一放在/opt/synopsys/vcs/2021.09,不要带空格、不要放在家目录下、不要用软链接指来指去,后面VCS_HOME一多,路径混乱是最容易出玄学问题的地方。
2.2 系统依赖与内核参数:装之前先过一遍检查清单
VCS 是 64 位工具,宿主机必须是 x86_64 架构,glibc 版本不能太老。我一般先跑一遍基础检查,把缺的依赖一次补齐,避免装到一半报共享库缺失:
# 确认架构与发行版 uname -m && cat /etc/os-release | head -3 # 检查关键共享库是否存在 ldconfig -p | grep -E "libstdc\+\+|libgcc_s|libpthread|libdl" # 检查磁盘空间,VCS 完整安装通常要 10GB 以上余量 df -h /opt # 检查内存,编译大型设计建议 32GB 起步 free -guname -m输出x86_64才继续;ldconfig -p里如果缺libstdc++,装gcc-c++或对应发行版的兼容包;df -h看的是安装分区,不是根分区,别装到一半空间满了。内存这一项容易被忽略,VCS 编译阶段对内存敏感,16GB 机器跑中等规模设计就会开始换页,编译时间翻几倍,我一般建议仿真机 32GB 起。
另外两个系统层面的设置要提前做:文件句柄数和栈大小。VCS 编译时会打开大量临时文件,默认ulimit -n1024 往往不够:
# 临时生效,验证用 ulimit -n 65536 ulimit -s unlimited # 永久生效写进 /etc/security/limits.conf # * soft nofile 65536 # * hard nofile 65536 # * soft stack unlimitedulimit -n是单进程可打开文件数,编译大设计时临时文件多,太小会报Too many open files;ulimit -s unlimited放开栈大小,避免深层递归或大数组在栈上分配时崩溃。这两条改完要重新登录才生效,别在当前 shell 里改完就以为万事大吉。
2.3 目录规划:安装目录、工作目录、库目录分开放
我习惯把三类目录彻底分开,后面迁移和清理都省事:
| 目录类型 | 示例路径 | 用途 | 是否随项目迁移 |
|---|---|---|---|
| 安装目录 | /opt/synopsys/vcs/2021.09 | 工具本体,只读 | 否 |
| 工作目录 | /home/user/proj/sim | 编译产物、仿真波形 | 是 |
| 库目录 | /home/user/proj/sim/libs | work、rtl等逻辑库映射 | 是 |
安装目录只读,升级时整目录替换;工作目录放simv、csrc、simv.daidir这些编译产物;库目录单独放,是因为synopsys_sim.setup里的库映射要指向它,项目换机器时只拷工作目录和库目录,安装目录不用动。这个分法不是强制的,但混在一起放,后面清编译缓存时容易误删库文件,血泪经验。
3. 安装与授权配置:从解压到 license 跑通
3.1 执行安装:installer 交互项怎么填
安装包解压后进入 installer 目录,执行安装脚本。不同批次的 installer 界面略有差异,但核心交互项就那几个:
# 解压安装包 tar -xzf VCS_2021.09_xxx.tar.gz -C /tmp/vcs_install # 进入 installer 目录执行安装 cd /tmp/vcs_install ./installer -gui # 有图形界面时用 GUI,无界面用 -console无图形界面的服务器用-console走文本交互。安装过程中会依次问:安装类型(完整安装还是仅仿真器)、安装路径、是否安装文档、license 配置方式。安装路径填/opt/synopsys/vcs/2021.09,文档建议一起装,后面查synopsys_sim.setup的字段说明全靠它。license 配置那一步可以先跳过,装完再单独配,避免 installer 里填错还要重来。
安装完成后检查目录结构,关键子目录要对得上:
ls /opt/synopsys/vcs/2021.09 # 应能看到 bin/ linux64/ doc/ etc/ 等目录 ls /opt/synopsys/vcs/2021.09/bin | grep -E "^vcs$|^vlogan$|^vhdlan$"bin/下要有vcs、vlogan、vhdlan三个可执行文件,缺任何一个说明安装不完整,常见原因是安装包解压不完整或中途磁盘满。linux64/是平台相关二进制,etc/放配置文件模板,doc/是手册。
3.2 环境变量:VCS_HOME、PATH、license 三件套
环境变量是 VCS 最容易配错的一环,我一般写进~/.bashrc或项目自己的env.sh,不写系统级/etc/profile,避免影响同机其他工具:
# VCS 安装根目录 export VCS_HOME=/opt/synopsys/vcs/2021.09 # 把 vcs、vlogan、vhdlan 加进 PATH,注意放在原有 PATH 前面 export PATH=$VCS_HOME/bin:$PATH # license 服务器地址,端口按实际 license 服务配置填 export LM_LICENSE_FILE=27000@license-server # 可选:指定 setup 文件搜索路径,多项目共用时有用 export SYNOPSYS_SIM_SETUP=$HOME/proj/sim/synopsys_sim.setupVCS_HOME是工具根目录,很多脚本内部靠它定位etc/和linux64/;PATH里$VCS_HOME/bin必须在前,否则机器上如果装了旧版 VCS,which vcs会指到旧版;LM_LICENSE_FILE的格式是端口@主机,端口默认 27000,实际以 license 服务配置为准,多个 license 源用冒号分隔。SYNOPSYS_SIM_SETUP是可选项,不设的话 VCS 默认在当前目录找synopsys_sim.setup,多项目并行时设上更省心。
配完执行source ~/.bashrc,然后验证:
which vcs vcs -ID echo $LM_LICENSE_FILEwhich vcs应输出$VCS_HOME/bin/vcs;vcs -ID打印版本信息,2021.09 批次会显示对应 build 号;echo确认 license 变量没被其他脚本覆盖。这三条都对了,才进入下一步。
3.3 license 验证:拿不到授权时先查这三处
license 是装完第一个拦路虎。验证方法不是直接跑编译,而是先用工具自带的检查手段:
# 查看 license 服务是否可达 lmutil lmstat -c $LM_LICENSE_FILE -a | head -20 # 如果 lmutil 不在 PATH,用 VCS 自带的 $VCS_HOME/linux64/bin/lmutil lmstat -c $LM_LICENSE_FILE -almstat -a会列出所有 feature 的占用情况,重点看vcs、vcs_runtime、vcsverilog这几个 feature 是否在列表里、是否显示Users of有可用数量。如果报Cannot connect to license server,是网络或端口问题;如果连上了但 feature 不在列表,是 license 文件没签这个 feature 或版本不匹配;如果显示All licenses in use,是并发数被占满,等别人释放或找管理员扩并发。
常见做法是先用lmstat确认服务可达,再跑一个最小编译验证授权链路。别一上来就拿大设计试,报错信息混在一起很难定位。
4. synopsys_sim.setup 与库映射:编译前必须建好的配置文件
4.1 setup 文件的最小可用写法
synopsys_sim.setup是 VCS 的库映射配置文件,没有它,vlogan分析完设计不知道往哪个逻辑库放,vcs编译时也找不到设计单元。最小可用版本长这样:
# synopsys_sim.setup # 逻辑库名 : 物理目录路径 WORK > DEFAULT DEFAULT : ./work # 自定义逻辑库映射到物理目录 rtl_lib : ./libs/rtl tb_lib : ./libs/tbWORK > DEFAULT表示把默认工作库指向DEFAULT,DEFAULT : ./work把DEFAULT映射到当前目录下的work物理目录。后面两行是自定义库,rtl_lib放 RTL 代码分析结果,tb_lib放测试平台。物理目录不需要提前建,VCS 分析时会自动创建,但父目录要有写权限。
这个文件放在工作目录根下,VCS 启动时按「当前目录 →SYNOPSYS_SIM_SETUP指定路径 →$VCS_HOME/etc/synopsys_sim.setup」的顺序查找。我一般每个项目根目录放一份,不依赖全局配置,项目拷走就能跑。
4.2 库映射的三种写法与取舍
库映射有三种常见写法,用途不同:
# 写法一:逻辑库直接映射物理目录 rtl_lib : ./libs/rtl # 写法二:逻辑库映射到另一个逻辑库(别名) rtl_alias : rtl_lib # 写法三:包含其他 setup 文件,多项目共用基础配置 include /shared/config/base_setup写法一最常用,逻辑库名和物理目录一一对应;写法二用于给同一个库起别名,比如团队里有人习惯叫rtl、有人习惯叫rtl_lib,用别名兼容;写法三适合多项目共用一套基础库映射,include进来的文件路径要写绝对路径,相对路径按当前 setup 文件所在目录解析,这点容易踩坑。
取舍上,单项目用写法一就够;多项目共用库时用写法三,但被 include 的文件不要放项目私有配置,否则改一处影响一片。我一般把公共库映射放/shared/config/base_setup,项目自己的 setup 里 include 它,再追加项目私有库。
4.3 用 vlogan 和 vhdlan 验证库映射是否生效
setup 文件建好后,别急着跑完整编译,先用一个最小模块验证库映射链路:
# 建一个最小 Verilog 模块 cat > /tmp/dummy.v <<'EOF' module dummy; initial $display("dummy ok"); endmodule EOF # 用 vlogan 分析到 rtl_lib 库 vlogan -work rtl_lib /tmp/dummy.v # 查看库内容,确认 dummy 已进入 rtl_lib vdir -lib rtl_libvlogan -work rtl_lib指定分析结果放入rtl_lib逻辑库,这个库名必须在synopsys_sim.setup里有映射,否则报Library rtl_lib not found in setup file。vdir -lib rtl_lib列出库内设计单元,能看到dummy就说明映射链路通了。VHDL 流程同理,把vlogan换成vhdlan,-work参数含义一致。
这一步是分水岭:库映射不通,后面所有编译都是白费。我见过太多人跳过这步直接跑大设计,报一堆Cannot find library却不知道从哪查。
5. 避坑与排查:五条装 VCS 时最常翻的车
5.1 现象:vcs -full64报 license 拿不到,但vcs -ID正常
原因:-ID只读本地版本信息,不请求 license;-full64走完整编译流程,第一步就是向 license 服务器申请 feature。两者走的路径不同,所以会出现「版本能看、编译不能跑」。
解决:先lmutil lmstat -c $LM_LICENSE_FILE -a确认服务可达、feature 在列表、并发未占满。如果服务可达但 feature 不在,检查 license 文件签的版本是否覆盖 2021.09;如果显示并发占满,等释放或找管理员。还有一种隐蔽情况:LM_LICENSE_FILE被项目脚本覆盖成旧地址,echo一下确认当前值。
5.2 现象:vlogan报Library work not found in setup file
原因:当前目录没有synopsys_sim.setup,或者文件里没有WORK > DEFAULT和DEFAULT : ./work这两行。VCS 找不到默认工作库映射,分析结果无处可放。
解决:在项目根目录建 setup 文件,至少写WORK > DEFAULT和DEFAULT : ./work两行。如果项目在子目录里跑,确认 setup 文件在 VCS 启动目录下,或者用SYNOPSYS_SIM_SETUP显式指过去。别指望 VCS 自动建,它只会报错不会猜。
5.3 现象:编译到一半报Too many open files
原因:ulimit -n太小,VCS 编译大设计时临时文件句柄数超限。默认 1024 在中等规模设计上就可能不够。
解决:ulimit -n 65536临时放开,永久生效写/etc/security/limits.conf的nofile项,改完重新登录。注意limits.conf对通过 SSH 登录的会话生效,本地终端和 cron 任务可能走不同配置,验证时用ulimit -n确认当前 shell 的实际值。
5.4 现象:换机器后编译报Cannot find design unit xxx
原因:工作目录拷过去了,但synopsys_sim.setup里的库映射写的是绝对路径,新机器上路径不存在;或者库物理目录没一起拷。
解决:setup 文件里库映射尽量用相对路径,相对当前 setup 文件所在目录解析;迁移时把libs/物理目录和 setup 文件一起拷。如果必须用绝对路径,迁移后批量替换路径,别手动一个个改。我一般迁移前先grep -n "/home" synopsys_sim.setup扫一遍绝对路径。
5.5 现象:vcs命令找到的是旧版本
原因:机器上装过多个 VCS 批次,PATH里旧版路径在前,或者VCS_HOME指向旧目录但PATH没同步更新。
解决:which vcs和echo $VCS_HOME对照看,两者应指向同一批次。PATH里$VCS_HOME/bin放最前,VCS_HOME改完PATH要跟着改。项目脚本里如果硬编码了旧路径,grep -rn "vcs/20"扫一遍脚本目录,别只改环境变量就以为切干净了。
6. 装完怎么验证跑通:一个最小设计走完两步流
验证 VCS 2021.09 装没装好,不用拿真实项目试,一个最小设计走完「编译 + 仿真」两步流就够。我习惯用下面这个流程做装机验收,每一步都有明确的通过标准。
先准备最小设计文件和 setup 文件:
mkdir -p /tmp/vcs_check && cd /tmp/vcs_check # 最小 setup 文件 cat > synopsys_sim.setup <<'EOF' WORK > DEFAULT DEFAULT : ./work EOF # 最小设计:一个计数器加一个 initial 打印 cat > counter.v <<'EOF' module counter; reg clk; reg [3:0] cnt; initial begin clk = 0; cnt = 0; $display("sim start"); #10 $display("cnt = %0d", cnt); $finish; end always #5 clk = ~clk; always @(posedge clk) cnt <= cnt + 1; endmodule EOF然后走两步流编译和仿真:
# 第一步:编译,生成 simv 可执行文件 vcs -full64 -sverilog counter.v -o simv # 第二步:运行仿真 ./simv-full64走 64 位完整编译流程,-sverilog开启 SystemVerilog 支持,-o simv指定输出可执行文件名。编译成功的标志是生成simv和simv.daidir目录,终端无 error。运行./simv应输出sim start和cnt = 0,最后打印$finish相关退出信息。
如果编译报 license 错误,回到 5.1 查授权;如果报库映射错误,回到 5.2 查 setup 文件;如果编译通过但运行报共享库缺失,ldd simv | grep "not found"看缺哪个库,补对应依赖包。三步都过了,说明安装、授权、库映射、编译、仿真整条链路通了。
验收通过后,我还会做一件事:把vcs -ID的输出、lmutil lmstat的 feature 列表、最小设计的编译日志各存一份到项目doc/env/下。下次换机器或升级批次,拿这份基线对照,哪一步对不上立刻能定位。从那以后我每次装完 VCS 都强制走一遍这个最小设计验收,不跳过、不省略,因为跳过省下的十分钟,往往要用一晚上排错来还。希望帮到你。
本文还有配套的精品资源,点击获取