本文适用于如下软件版本:
- 写作时间点的Gentoo Linux
- Quartus Prime Lite 18.1
在写作时间点,Quartus Prime的最新版本为20.1.如果你被允许使用新于本文的Quartus版本,建议优先使用新版本以减少兼容性问题.
如果你使用ArchLinux,可以尝试AUR中的相关包,无需手动安装,详见参考文献.
如果你不知道怎么在Quartus中创建一个工程,也不知道ModelSim是什么,那么你需要的不只是这份文档.本文的目的仅仅是教你如何在较新的Linux系统上使Quartus Prime Lite 18.1+ModelSim正常运行.
以下主要分为四个部分:下载安装、Quartus(本体)、ModelSim、USB Blaster.
下载安装
软件可以直接从Download Center for FPGAs下载到(需注册).直接下载Quartus-lite-18.1.0.625-linux.tar
即可.
如果点击“I Agree”后没有自动开始下载,可以使用浏览器的“审查元素”截获产生的网络请求的响应内容.得到的链接无需登录,可以直接用wget
等工具下载.这里不放出.
在网页上的“Updates”选项卡下可以下载到18.1.1.646版本的更新,只有安装完软件本体后才能装上.本文对应的是更新过的版本,但应该对未更新的版本也有效(未测试).
下载完成后解压并执行setup.sh
.在“Select Components”这一步注意不要选择“ModelSim - Intel FPGA Edition”(非Starter Edition),否则安装完后启动Quartus时会要求你提供许可.
Quartus
安装完Quartus,桌面上应该会多出一个Quartus图标.但如果你使用的是Gentoo等软件版本较新的发行版,大概率是无法直接通过图标启动Quartus的.如果你试图使用命令行启动Quartus,你会得到如下的结果:
1 | ./quartus |
这提示我们缺少libpng-1.2
.因此只需要把它装上即可:
- 对于Gentoo,安装
libpng-compat:1.2
. - 对于其他发行版,安装
libpng12
或其他名字类似的包.
这应该已经足够让Quartus跑起来了.
ModelSim
启动ModelSim才是困难的部分.
设置路径
这一步非常重要.
首先创建一个工程和相应的Test Bench.打开Tools→Options,在General→EDA Tool Options下找到ModelSim-Altera这一项.把原本的目录换成:
1 | <安装目录>/intelFPGA_lite/18.1/modelsim_ase/bin |
为了确认,你填写的路径下应该有一个符号链接vsim
,指向../vco
.
(为什么不使用默认的modelsim_ase/linuxaloem
?因为这个目录下是裸的二进制文件,我们接下来在脚本中配置的环境变量对它们无效.)
当你想单独启动ModelSim的时候,你也应该直接执行符号链接vsim
.(但在你完成下面的步骤之前,你应该是没有办法做到这件事情的.)
安装32位库
现在试试Tools→Run Simulation Tool→RTL Simulation,不出所料应该会弹出一个错误提示:
Nativelink Error
Can’t launch ModelSim-Altera Simulation software(中略)Check the NativeLink log file(中略)for detailed error messages
出现这个错误的原因是你安装的ModelSim是32位版本,而系统中没有安装所有它需要的32位库.你可以在Install dependencies中找到一个完整的列表,此处引用如下:
Let us first install the native versions of the required packages:
expat
fontconfig
freetype2
xorg-fonts-type1
glibc
gtk2
libcanberra
libpng
libpng12
libice
libsm
util-linux
ncurses
tcl
tcllib
AURzlib
libx11
libxau
libxdmcp
libxext
libxft
libxrender
libxt
libxtst
ld-lsb
.
And the multilib versions:lib32-expat
lib32-fontconfig
lib32-freetype2
lib32-glibc
lib32-gtk2
lib32-libcanberra
lib32-libpng
lib32-libpng12
lib32-libice
lib32-libsm
lib32-util-linux
lib32-ncurses
lib32-zlib
lib32-libx11
lib32-libxau
lib32-libxdmcp
lib32-libxext
lib32-libxft
lib32-libxrender
lib32-libxt
lib32-libxtst
.
You are now ready to install and launch Quartus Prime.
注意这些包名都是Arch Linux的,在其他发行版上可能有类似但不同的名字.在Gentoo上一部分包被称作xxx-compat
,比如在我的机器上唯一缺少的库是libncurses.so.5
,属于ncurses-compat:5.9
.注意lib32
前缀对应到USE flagabi_x86_32
.
如果不确定,可以用下面的命令找出ModelSim需要但系统中缺少的库:
1 | cd <安装目录>/intelFPGA_lite/18.1/modelsim_ase/linuxaloem |
如果所有依赖都已经安装完毕,上述命令应该没有任何输出.
修改vco
安装了这么多包,胜利就在眼前了……?好像并不是这样.
再次执行RTL Simulation,尽管主窗口下半部分的Messages中显示Successfully launched NativeLink simulation
,但除此之外什么也没有发生.
接下来我们需要许多命令行操作.请打开终端并切换到你刚刚在EDA Tool Options→ModelSim-Altera下填写的路径:
1 | cd <安装目录>/intelFPGA_lite/18.1/modelsim_ase/bin |
现在执行vsim
:
1 | ./vsim |
原来,vsim
指向的vco
是一个Shell脚本,其中对当前内核版本做了判断.对于未知的内核版本,它会从../linux_rh60
这个不存在的位置寻找相应的二进制文件!现在修改这个脚本,让它找到正确的目录../linux
,注意需要先对它加上写权限:
1 | chmod u+w ../vco |
现在执行./vsim
,应该不会报找不到./../linux_rh60/vsim
的错误了——取而代之的是下面这个错误:
1 | (前略) |
解决方案见下一节.
FreeType和Fontconfig
ArchWiki上已经提供了对该错误的解决方案.简而言之,这是FreeType版本过新引起的错误.然而对于较新的发行版,官方源中已经难以找到相应版本的库了.如果你使用其他发行版,可能可以从一些存档网站找到旧版的包;而如果你使用Gentoo,那么你需要手动下载freetype-2.4.12.tar.bz2并编译——注意你需要的是32位库.
A Guide on Getting ModelSim to Work on Linux提供了此处的详细步骤(稍有改动):
1 | cd ~/Downloads |
然后回到<安装目录>/intelFPGA_lite/18.1/modelsim_ase
,执行:
1 | mkdir lib32 |
接下来,你需要让ModelSim使用你刚刚编译的FreeType库.而且因为这个库版本太老,我们不希望把它直接安装在系统中.打开../vco
,找到这一行:
1 | dir=`dirname $arg0` |
在后面添加一行:
1 | export LD_LIBRARY_PATH=${dir}/lib32 |
重新运行./vsim
……等一下,怎么还是报错?
1 | ./vsim |
这其实是因为Fontconfig与FreeType的版本不匹配(可以使用GDB跟踪发现).万能的ArchWiki上又提供了解决方案:使用fontconfig-2.12.6
.
取得旧版本fontconfig的方法与上面大致相同.如果你直接编译,可以使用以下命令:
1 | mkdir image |
则安装产生的目录结构位于./image
.
如果你使用Gentoo,也可以让Portage帮你编译:
1 | cd /var/db/repos/gentoo/media-libs/fontconfig |
这会把旧版的fontconfig
安装到/tmp/portage/media-libs/fontconfig-2.12.6/image
这个目录中.其中usr/lib
下的才是32位库,可以用file
命令确认:
1 | file libfontconfig.so.1.10.1 |
接下来把所有的32位so
文件转移到lib32
下,再一次启动vsim
.
如果你成功了——别急,先试试RTL Simulation.如果也没有问题,恭喜,你不需要看下去了;上面编译Fontconfig的目录也可以删掉了.
如果没有成功——请不要删除上面得到的image
目录.它对我们还有用处.
修改fonts.conf
网上大多数资料顶多只告诉你降级fontconfig这一步.但很不幸,我做完上述步骤(实际上不包括更改ModelSim-Altera所在路径这一步)后还是卡住了:
1 | ./vsim |
然后终端就……没有反应了.没有输出,vsim
也不会自己结束,只能C-z
然后kill %1
.
启发我的是放置N分钟后ModelSim的GUI突然成功显示这件事.类似的现象我在另一个软件上也遇到过:Telegram starts slow on Linux · Issue #4240 · telegramdesktop/tdesktop,而当时的情况跟现在如出一辙:软件使用了(bundle了)比系统版本更低的fontconfig!而之所以ModelSim需要花费这么长的时间来启动,想必是因为它需要时间来重新缓存所有的字体.
具体排查过程略过,最后的解决方案是从刚刚的image
目录(即旧版fontconfig
安装的目录)找到etc/fonts.conf
,把它复制到~/.fonts.conf.legacy
,然后编辑复制得到的文件.
一方面我们不需要它缓存太多字体.ModelSim在我的机器上只用到Courier
和unifont
这两个字体,因此可以删去原有的
1 | <dir>/usr/share/fonts</dir> |
等行,换成
1 | <dir>/usr/share/fonts/unifont</dir> |
如果有其他需要缓存的字体目录,也可以在这里加入.
另一方面,我们不希望让旧版、新版Fontconfig的字体缓存混在一起,因此我们创建一个新的缓存目录:
1 | mkdir ~/.cache/fontconfig-old |
然后再次编辑~/.fonts.conf.legacy
,去掉原来的缓存设置:
1 | <cachedir>/tmp/fontconfig-2.12.6/image/var/cache/fontconfig</cachedir> |
然后加上
1 | <cachedir>~/.cache/fontconfig-old</cachedir> |
保存!
接下来再编辑vco
(如果一开始没有更改ModelSim-Altera工具的路径,就会产生命令行中执行./vsim
可以调出GUI,但无法由Quartus启动ModelSim的现象),在我们曾经编辑过的export LD_LIBRARY_PATH=${dir}/lib32
这一行下面,添加一行
1 | export FONTCONFIG_FILE="${HOME}/.fonts.conf.legacy" |
这样,我们的ModelSim不但使用了正确的旧版32位fontconfig-2.12.6
,还使用了适合这个旧版Fontconfig的配置文件.还有什么理由阻止ModelSim的启动呢?
现在再分别试试./vsim
和RTL Simulation
吧!如果依然失败……
要不,出去买张彩票?
USB Blaster
这一部分不需要很多特别的设置,以下内容来自ArchWiki:
编辑/etc/udev/rules.d/51-altera-usb-blaster.rules
,添加:
1 | SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666" |
然后重新加载udev rules:
1 | udevadm control --reload |
如果依然无法检测到设备,请参考USB Blaster not working.
Troubleshooting
Failed to obtain lock: couldn't open "/home/<USER>/.modelsim_lock": file already exists
用ps
找出所有vsim
相关进程并kill
掉,然后删除该文件即可.
ModelSim字体太小
这是小问题.在Tools→Edit Preferences→Fonts中换用大号字体即可.注意应用设置后的实际显示大小可能比预览的要小.