1. 为什么在 Ubuntu 16.04 上装 ModelSim 值得单独写一篇
Ubuntu 16.04 这个版本在不少实验室和公司的仿真环境里至今还有存量,原因很现实:很多老版本的 FPGA 厂商工具链对 glibc 和系统库的版本有硬性依赖,升级到 18.04 或 20.04 之后反而会出现一堆动态库找不到的问题。ModelSim 作为业界用得最广的仿真器之一,在 Linux 下的安装体验一直算不上友好——官方安装器是 32 位程序,依赖一堆老式图形库,装完之后还有 license 配置、环境变量、库路径这些坑等着你。
我前后在 Ubuntu 16.04 上装过不下十次 ModelSim,从最开始照着零散的帖子一步步试错,到后来整理出一套稳定的流程,中间踩的坑足够写满两页纸。这篇就把整个安装链路拆开讲清楚:每一步为什么这么做、哪些地方最容易翻车、装完之后怎么验证仿真环境真的能用。适合正在用 Ubuntu 16.04 做数字电路仿真、需要本地跑 ModelSim 的开发者,也适合刚接触 Linux EDA 环境搭建的新手。
需要提前说明的是,ModelSim 的安装包和 license 需要你通过正规渠道获取,本文只讲环境配置和安装流程本身,不涉及任何授权文件的获取方式。
2. 安装前的系统环境盘点与依赖补齐
2.1 先确认你的系统到底缺什么
很多人装 ModelSim 失败,根因不在 ModelSim 本身,而在系统缺了 32 位运行库。ModelSim 的安装器install.linux是一个 32 位可执行文件,Ubuntu 16.04 默认只装了 64 位库,直接运行会报No such file or directory——这个报错很有迷惑性,文件明明存在,但系统找不到对应的 32 位解释器。
先做两件事确认现状:
# 确认系统架构 uname -m # 输出 x86_64 说明是 64 位系统 # 确认是否已启用 32 位架构支持 dpkg --print-foreign-architectures # 如果输出里没有 i386,就需要手动添加如果dpkg --print-foreign-architectures没有输出 i386,执行:
sudo dpkg --add-architecture i386 sudo apt-get update这一步是后面所有 32 位依赖能装上的前提。我见过有人跳过这步直接apt-get install32 位库,结果提示找不到包,绕了半天才发现是架构没开。
2.2 一次性把依赖装齐,别挤牙膏
ModelSim 在 Linux 下依赖的库主要分三类:32 位基础 C 库、X11 图形库、以及字体和 Motif 相关的库。与其一个个报错再补,不如一次性装全。下面这条命令是我实测下来覆盖最完整的组合:
sudo apt-get install -y \ libc6:i386 \ libstdc++6:i386 \ libxext6:i386 \ libx11-6:i386 \ libxft2:i386 \ libxau6:i386 \ libxdmcp6:i386 \ libncurses5:i386 \ libsm6:i386 \ libice6:i386 \ libxi6:i386 \ libxt6:i386 \ libxtst6:i386 \ libxrender1:i386 \ libfontconfig1:i386 \ libfreetype6:i386 \ libglib2.0-0:i386 \ libmotif-common \ libxm4:i386这里重点说几个容易被忽略的:
- libncurses5:i386:ModelSim 的命令行界面
vsim依赖它,缺了会在启动时报终端相关的错误。 - libxm4:i386:Motif 库,ModelSim 的图形界面主窗口基于 Motif 构建,这个库缺失会导致 GUI 直接起不来,但命令行模式可能还能跑,容易误判成"装好了"。
- libfreetype6:i386 和 libfontconfig1:i386:字体渲染相关,缺了之后 GUI 里的文字会变成方块或者干脆不显示。
提示:如果你的 apt 源里找不到某个 i386 包,先确认
sudo apt-get update执行过,并且/etc/apt/sources.list里没有把 i386 架构的源注释掉。Ubuntu 16.04 的官方源默认是包含 i386 的。
2.3 关于显卡驱动和远程桌面的一个提醒
ModelSim 的 GUI 对 OpenGL 有一定依赖。如果你是在物理机上直接操作,通常没问题;但如果是通过远程桌面连接,尤其是某些基于软件渲染的远程方案,可能会遇到 GUI 启动后黑屏或者闪退。这种情况下可以先试试用命令行模式跑仿真,确认工具链本身没问题,再单独排查图形环境。
我个人的经验是:如果只是做功能仿真,命令行模式完全够用,而且跑回归测试时更稳定。GUI 主要用于看波形和调试,不是必须的。
3. 安装包解压与安装器启动的完整流程
3.1 目录规划:别装到默认路径
ModelSim 安装器默认会往/opt或者用户主目录下装,但我建议提前规划好一个独立的安装目录,比如/opt/eda/modelsim或者~/tools/modelsim。原因有两个:一是方便后续多版本共存,二是卸载时直接删目录就行,不会污染系统路径。
假设你的安装包放在~/Downloads下,文件名类似modelsim_xxx.run或者是一个压缩包,先解压:
cd ~/Downloads # 如果是 .run 文件 chmod +x modelsim_xxx.run # 如果是压缩包 tar -xvf modelsim_xxx.tar.gz解压后会得到一个包含install.linux的目录。进入该目录:
cd modelsim_xxx ls -l install.linux确认install.linux有可执行权限,没有的话补上:
chmod +x install.linux3.2 启动安装器的正确姿势
直接./install.linux可能会因为终端环境或者权限问题失败。我习惯用下面的方式启动:
./install.linux -i console-i console参数强制使用控制台安装模式,避免安装器尝试启动图形界面。在纯命令行环境或者 SSH 会话里,这个参数能省掉很多麻烦。如果你确实想用图形安装界面,去掉这个参数即可,但要确保DISPLAY环境变量已经正确设置。
安装器启动后,会依次询问安装路径、是否创建桌面快捷方式等信息。安装路径那一步,手动输入你规划好的目录,比如/opt/eda/modelsim。安装过程会持续几分钟,期间会释放大量文件。
3.3 安装完成后先别急着配环境变量
安装结束后,安装器通常会提示你是否要把 ModelSim 的bin目录加入PATH。我的建议是先不要让它自动改你的.bashrc,而是手动配置。原因很简单:自动改的内容往往不够清晰,后续排查问题时你根本不知道哪一行是安装器加的。
先手动验证一下安装结果:
ls /opt/eda/modelsim/bin # 应该能看到 vsim、vlog、vcom、vlib 等可执行文件如果这些文件都在,说明安装本身成功了。接下来才是环境配置。
4. 环境变量与 license 配置的关键细节
4.1 PATH 和 LM_LICENSE_FILE 怎么设才不出错
编辑~/.bashrc,在末尾追加:
# ModelSim environment export PATH=$PATH:/opt/eda/modelsim/bin export LM_LICENSE_FILE=/opt/eda/modelsim/license.dat这里有两个细节值得展开:
第一,PATH 的顺序。如果你系统里同时装了其他 EDA 工具,或者有多个 ModelSim 版本,PATH 的先后顺序决定了调用哪个版本。把 ModelSim 的路径放在$PATH后面还是前面,取决于你的实际需求。我一般放在后面,避免影响系统原有命令。
第二,LM_LICENSE_FILE 的写法。这个变量可以指向一个 license 文件,也可以指向一个 license 服务器端口(格式如27000@hostname)。如果你用的是本地 license 文件,路径一定要写绝对路径,不要用~或者相对路径,因为某些情况下 ModelSim 启动时的工作目录可能不是你预期的位置。
改完之后:
source ~/.bashrc4.2 license 文件放置位置的讲究
license 文件放哪里其实没有硬性规定,但有几个实践上的建议:
- 放在 ModelSim 安装目录下(如
/opt/eda/modelsim/license.dat),好处是集中管理,卸载时一起删掉。 - 如果多人共用一台机器,可以放在
/usr/local/etc/或者专门的 license 目录下,权限设为只读。 - 不要放在有中文路径或者空格的目录下,ModelSim 对这类路径的处理偶尔会出问题。
注意:license 文件里的主机名和 MAC 地址必须和当前机器匹配,否则
vsim启动时会报 license 相关的错误。如果换了网卡或者改了主机名,记得同步更新 license 文件。
4.3 验证环境变量是否生效
配置完成后,开一个新的终端窗口,执行:
which vsim # 应该输出 /opt/eda/modelsim/bin/vsim echo $LM_LICENSE_FILE # 应该输出你设置的路径如果which vsim没有输出,说明 PATH 没生效,检查.bashrc是否被正确 source,或者是不是改错了文件(比如改成了.profile但用的是 bash)。
5. 首次启动的报错排查链路
5.1 最常见的三类报错及应对
第一次运行vsim时,大概率会遇到报错。我把这些年遇到的报错归成三类,按出现频率排序:
| 报错关键词 | 根本原因 | 解决方向 |
|---|---|---|
cannot open shared object file | 缺 32 位动态库 | 用ldd查缺失的库,补装对应 i386 包 |
Unable to checkout a license | license 配置错误 | 检查 LM_LICENSE_FILE 路径和 license 内容 |
Segmentation fault | 图形库或字体问题 | 检查 Motif 和字体库,尝试命令行模式 |
5.2 用 ldd 定位缺失的库
当vsim报cannot open shared object file时,不要猜,直接用ldd查:
ldd /opt/eda/modelsim/bin/vsim | grep "not found"输出里会列出所有找不到的库。比如输出libXm.so.4 => not found,那就说明缺 Motif 库,对应安装libxm4:i386。这个方法比盲目装一堆库高效得多。
有时候ldd本身也会因为 32 位问题报错,这时候可以用file命令先确认二进制文件的架构:
file /opt/eda/modelsim/bin/vsim # 输出里应该包含 ELF 32-bit5.3 license 报错的排查顺序
license 问题最让人头疼,因为报错信息往往很笼统。我的排查顺序是这样的:
- 确认环境变量:
echo $LM_LICENSE_FILE是否指向了正确的文件。 - 确认文件可读:
cat $LM_LICENSE_FILE能不能正常读出内容。 - 确认主机名匹配:
hostname的输出是否和 license 文件里的HOSTNAME字段一致。 - 确认 MAC 地址匹配:
ifconfig或者ip link查看网卡 MAC,和 license 文件里的HOSTID对比。
如果这四步都没问题,但依然报 license 错误,可以试试显式指定 license 文件启动:
vsim -license /opt/eda/modelsim/license.dat5.4 一个容易被忽略的坑:工作目录权限
ModelSim 在启动时会在当前工作目录下创建一些临时文件和work库。如果你在一个没有写权限的目录下运行vsim,会报出各种奇怪的错误,有时候甚至不报错但行为异常。养成习惯:在专门的项目目录下运行仿真,确保当前用户对该目录有读写权限。
mkdir -p ~/sim_projects/test1 cd ~/sim_projects/test1 vsim6. 跑通第一个仿真的验证方法
6.1 用命令行模式做最小验证
GUI 能起来不代表仿真链路没问题。我习惯先用命令行模式跑一个最小测试,确认编译、 elaboration、仿真三个环节都正常。
准备一个最简单的 Verilog 文件test.v:
module test; initial begin $display("ModelSim simulation started successfully."); $finish; end endmodule然后依次执行:
vlib work vlog test.v vsim -c -do "run -all; quit" test如果终端输出ModelSim simulation started successfully.,说明整个工具链是通的。-c参数表示命令行模式,-do后面跟的是启动后自动执行的命令。
6.2 GUI 模式下的波形验证
命令行验证通过后,再启动 GUI:
vsim -do "vlib work; vlog test.v; vsim test"GUI 启动后,在 transcript 窗口应该能看到和命令行模式一样的输出。如果能正常看到窗口、菜单、文字,说明图形环境也没问题。
我建议再做一个带波形输出的测试,确认波形窗口能正常工作:
module test; reg clk; initial clk = 0; always #5 clk = ~clk; initial begin #100 $finish; end endmodule编译仿真后,在 GUI 里把clk信号加到波形窗口,应该能看到一个周期为 10 个时间单位的方波。这一步能验证波形数据库和显示功能都正常。
6.3 环境变量持久化的最后检查
关掉终端,重新开一个,直接运行vsim,确认不需要手动 source 任何脚本就能启动。如果这一步失败,说明环境变量没有持久化,回头检查.bashrc的修改是否保存、是否被其他配置覆盖。
7. 长期使用中的维护经验与常见问题
7.1 系统更新后 ModelSim 突然不能用了
Ubuntu 16.04 虽然已经停止官方支持,但如果你还在接收一些安全更新,偶尔会遇到系统库升级后 ModelSim 启动失败的情况。最常见的是libstdc++6升级后和 ModelSim 自带的库产生冲突。
应对方法:先确认是不是库版本问题,用ldd检查是否有库变成了not found或者版本不匹配。如果是libstdc++6的问题,可以尝试在启动脚本里显式指定库路径:
export LD_LIBRARY_PATH=/opt/eda/modelsim/lib:$LD_LIBRARY_PATH但要注意,LD_LIBRARY_PATH是一把双刃剑,设置不当会影响其他程序。我一般只在启动 ModelSim 的脚本里临时设置,不写进全局.bashrc。
7.2 多版本共存时的切换方法
有些项目需要不同版本的 ModelSim,这时候可以用一个简单的 shell 函数来切换:
modelsim_switch() { local ver=$1 export PATH=$(echo $PATH | tr ':' '\n' | grep -v modelsim | tr '\n' ':') export PATH=/opt/eda/modelsim-$ver/bin:$PATH export LM_LICENSE_FILE=/opt/eda/modelsim-$ver/license.dat echo "Switched to ModelSim $ver" }把这个函数写进.bashrc,之后用modelsim_switch 10.5就能快速切换。核心思路是先把旧的 ModelSim 路径从 PATH 里剔除,再插入新的。
7.3 仿真速度慢的几个调优方向
装好之后如果觉得仿真跑得慢,可以从这几个方向排查:
- 关闭不必要的 GUI 刷新:GUI 模式下波形窗口的实时刷新会拖慢仿真速度,跑长仿真时可以用
-c命令行模式。 - 优化
vsim参数:-novopt在某些版本里能关闭优化,反而加快编译速度,但会影响仿真性能,需要根据实际情况权衡。 - 检查磁盘 I/O:仿真过程中会频繁读写
work库和波形文件,如果项目目录在机械硬盘上,换到 SSD 会有明显提升。 - 内存分配:大型设计的仿真对内存需求较高,确保机器有足够的内存,避免频繁 swap。
7.4 一个关于备份的小建议
ModelSim 的环境配置一旦调通,建议把关键文件备份一下:.bashrc里的环境变量段落、license 文件、以及安装目录下的modelsim.ini。特别是modelsim.ini,里面记录了库映射和编译选项,误删或者改坏之后恢复起来很麻烦。
cp ~/.bashrc ~/.bashrc.bak cp /opt/eda/modelsim/modelsim.ini /opt/eda/modelsim/modelsim.ini.bak我在实际使用中的体会是,Linux 下 EDA 工具的安装,难点从来不在安装本身,而在环境配置和依赖管理。把每一步的意图搞清楚,遇到报错时用ldd、echo、cat这些基础命令去定位,比到处搜帖子试错高效得多。这套流程在 Ubuntu 16.04 上验证过多次,换到其他相近版本的 Linux 发行版,思路也是通用的。