0%

Quartus折腾记

某门课程需要用到Quartus和ModelSim,虽然官方友好地提供了Linux版本,但让旧版的软件在最新的系统上跑起来也需要一番工夫.

本文适用于如下软件版本:

  • 写作时间点的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
2
$ ./quartus
quartus: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory

这提示我们缺少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 tcllibAUR zlib 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
2
cd <安装目录>/intelFPGA_lite/18.1/modelsim_ase/linuxaloem
find . -executable -exec ldd {} + 2> /dev/null | grep 'not found'

如果所有依赖都已经安装完毕,上述命令应该没有任何输出.

修改vco

安装了这么多包,胜利就在眼前了……?好像并不是这样.

再次执行RTL Simulation,尽管主窗口下半部分的Messages中显示Successfully launched NativeLink simulation,但除此之外什么也没有发生.

接下来我们需要许多命令行操作.请打开终端并切换到你刚刚在EDA Tool Options→ModelSim-Altera下填写的路径:

1
cd <安装目录>/intelFPGA_lite/18.1/modelsim_ase/bin

现在执行vsim

1
2
$ ./vsim
Error: cannot find "./../linux_rh60/vsim"

原来,vsim指向的vco是一个Shell脚本,其中对当前内核版本做了判断.对于未知的内核版本,它会从../linux_rh60这个不存在的位置寻找相应的二进制文件!现在修改这个脚本,让它找到正确的目录../linux,注意需要先对它加上写权限:

1
2
chmod u+w ../vco
sed -i 's/linux_rh60/linux/g' ../vco

现在执行./vsim,应该不会报找不到./../linux_rh60/vsim的错误了——取而代之的是下面这个错误:

1
2
(前略)
** Fatal: Read failure in vlm process (0,0)

解决方案见下一节.

FreeType和Fontconfig

ArchWiki上已经提供了对该错误的解决方案.简而言之,这是FreeType版本过新引起的错误.然而对于较新的发行版,官方源中已经难以找到相应版本的库了.如果你使用其他发行版,可能可以从一些存档网站找到旧版的包;而如果你使用Gentoo,那么你需要手动下载freetype-2.4.12.tar.bz2并编译——注意你需要的是32位库.

A Guide on Getting ModelSim to Work on Linux提供了此处的详细步骤(稍有改动):

1
2
3
4
5
cd ~/Downloads
tar jxvf freetype-2.4.12.tar.bz2
cd freetype-2.4.12
./configure --build=i686-pc-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32"
make -j8

然后回到<安装目录>/intelFPGA_lite/18.1/modelsim_ase,执行:

1
2
mkdir lib32
cp ~/Downloads/freetype-2.4.12/objs/.libs/libfreetype.so* ./lib32

接下来,你需要让ModelSim使用你刚刚编译的FreeType库.而且因为这个库版本太老,我们不希望把它直接安装在系统中.打开../vco,找到这一行:

1
dir=`dirname $arg0`

在后面添加一行:

1
export LD_LIBRARY_PATH=${dir}/lib32

重新运行./vsim……等一下,怎么还是报错?

1
2
3
$ ./vsim
(前略)
** Fatal: Read failure in vlm process (0,0)

这其实是因为Fontconfig与FreeType的版本不匹配(可以使用GDB跟踪发现).万能的ArchWiki上又提供了解决方案:使用fontconfig-2.12.6

取得旧版本fontconfig的方法与上面大致相同.如果你直接编译,可以使用以下命令:

1
2
3
4
mkdir image
./configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --disable-static --disable-docs --prefix=${PWD}/image
make -j8
make install # 当屏幕上显示fc-cache -s -f -v时就可以Ctrl-C了

则安装产生的目录结构位于./image

如果你使用Gentoo,也可以让Portage帮你编译:

1
2
cd /var/db/repos/gentoo/media-libs/fontconfig
PORTAGE_TMPDIR=/tmp USE=abi_x86_32 ebuild fontconfig-2.12.6.ebuild clean install

这会把旧版的fontconfig安装到/tmp/portage/media-libs/fontconfig-2.12.6/image这个目录中.其中usr/lib下的才是32位库,可以用file命令确认:

1
2
$ file libfontconfig.so.1.10.1
libfontconfig.so.1.10.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped

接下来把所有的32位so文件转移到lib32下,再一次启动vsim

如果你成功了——别急,先试试RTL Simulation.如果也没有问题,恭喜,你不需要看下去了;上面编译Fontconfig的目录也可以删掉了.

如果没有成功——请不要删除上面得到的image目录.它对我们还有用处.

修改fonts.conf

网上大多数资料顶多只告诉你降级fontconfig这一步.但很不幸,我做完上述步骤(实际上不包括更改ModelSim-Altera所在路径这一步)后还是卡住了:

1
2
3
$ ./vsim
Reading pref.tcl
Fontconfig error: Cannot load default config file

然后终端就……没有反应了.没有输出,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在我的机器上只用到Courierunifont这两个字体,因此可以删去原有的

1
2
3
<dir>/usr/share/fonts</dir>
<dir prefix="xdg">fonts</dir>
<dir>~/.fonts</dir>

等行,换成

1
2
<dir>/usr/share/fonts/unifont</dir>
<dir>/usr/share/fonts/Type1</dir>

如果有其他需要缓存的字体目录,也可以在这里加入.

另一方面,我们不希望让旧版、新版Fontconfig的字体缓存混在一起,因此我们创建一个新的缓存目录:

1
mkdir ~/.cache/fontconfig-old

然后再次编辑~/.fonts.conf.legacy,去掉原来的缓存设置:

1
2
3
<cachedir>/tmp/fontconfig-2.12.6/image/var/cache/fontconfig</cachedir>
<cachedir prefix="xdg">fontconfig</cachedir>
<cachedir>~/.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的启动呢?

现在再分别试试./vsimRTL Simulation吧!如果依然失败……

要不,出去买张彩票?

USB Blaster

这一部分不需要很多特别的设置,以下内容来自ArchWiki:

编辑/etc/udev/rules.d/51-altera-usb-blaster.rules,添加:

1
2
3
4
5
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6010", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6810", 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中换用号字体即可.注意应用设置后的实际显示大小可能比预览的要小.

参考文献

  1. Altera Design Software - ArchWiki
  2. A Guide on Getting ModelSim to Work on Linux
  3. DoodleTs: Running ModelSim-Altera from the Quartus Prime Lite IDE under Linux