0%

某门课程需要用到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

终于下定决心切换到了Fcitx 5. 可惜的是gentoo-zh源里的Mozc并不支持Fcitx 5,所以花一点时间自己打包了一下.

其实主要工作只是把官方源里的Ebuild与AUR里的fcitx5-mozc的安装部分缝合起来. 中间也参考了wjn-overlay(基本已不维护)里的mozc-ut.

由于成品质量感人所以只放到了Gist上,这是下载地址.

使用说明

  • 用到的patch都在官方源里,请自行从/var/db/repos/gentoo/app-i18n/mozc/files复制.
  • 仅在启用fcitx(不用加5)的情况下支持gentoo-zh源里的Fcitx 5. 不支持Fcitx 4.
  • 启用UT Dictionary的USE标记叫mozc-ut,默认处于开启状态.
  • 本文未必会持续更新,如果发现词典维护者发布了新版本可以自己改一改UT_V变量然后ebuild manifest merge,很简单的:-)

Appendix: 名词解释

最后感谢本文涉及的所有开发者.

引子

听说不少人一放假就喜欢装黑苹果,然而手上并没有Hackintosh-friendly的机器的我,只能用重装Gentoo的方式来祭奠一下逝去的青春啦(悲)。

这里随便记录一些安装和配置过程中的琐事,便于日后查询。

持续更新中。

阅读全文 »

手贱把Nextcloud从17.0.2更新到了18.0.0 (Beta Channel),结果occ upgrade的时候fail在下面这个错误上:

1
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'entity' in 'where clause'

幸而手动加上这一列以后就能正常完成更新了,顺带复习了一下SQL(逃

1
ALTER TABLE "oc_flow_operation" ADD entity varchar(256) COLLATE utf8mb4_bin NOT NULL DEFAULT '';

P. S. GitHub上亦有此issue,看起来受影响的人还不少……见Issue while upgrading to 18 Beta1 (SQL, related to Flow) · Issue #18265 · nextcloud/server.

涉事笔记本系一台神舟Z7M-CT5NA,发行版为Arch Linux,或许也适用于其他症状相同的机器和/或发行版.

问题

详细症状如下:

  • 能成功休眠;
  • 重启后加载完休眠映像后迅速黑屏,这时reisub无效且硬盘灯不亮;
  • 日志结束在PM: hibernation entry处.

解决方案

一番周折后开始考虑内核问题. 在archlinux_pkg_linux directory listing可以找到linux这个包的所有历史版本. 用二分法可以锁定到是4.16.7版本的某些更新内容导致了唤醒失败,于是找到了这个页面:199747 – resume from hibernate results in kernel panic (bisected).

(报告人表示重启后Caps Lock狂闪,然而神舟的这台笔记本并没有键盘指示灯……)

网页上给出的一种解决方案是把intel_lpss_pci这个模块放在initramfs里面. 在Arch Linux上编辑/etc/mkinitcpio.conf

1
MODULES=(... intel_lpss_pci ...)

然后重新生成initramfs:

1
# mkinitcpio -P

重启后应该就可以正常唤醒了.

Troubleshooting

触摸板

执行上述步骤可以正常唤醒,然而唤醒以后触摸板会死掉.

按照网页上的提示,需要在唤醒后重新加载intel_lpss_pci这个模块。创建/etc/systemd/system/touchpad-after-resume.service并添加以下内容:

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Reload touchpad
After=sleep.target suspend.target hibernate.target hybrid-sleep.target

[Service]
Type=oneshot
ExecStart=sh -c 'modprobe -r intel_lpss_pci && modprobe intel_lpss_pci'

[Install]
WantedBy=sleep.target suspend.target hibernate.target hybrid-sleep.target

然后启用这个unit.

1
# systemctl enable touchpad-after-resume

现在触摸板可以在唤醒后正常工作了,但是所有设置(滚动、单击、移动速度……)全都会被重置,只有在系统设置里把触摸板设置重新应用一次解决方案在下面:

Update 2020-01-19: 今天发现写在/etc/X11/xorg.conf.d/30-touchpad.conf里的触摸板设置会在唤醒后(实际上应该是X重新检测到触摸板的时候)自动应用,所以只需要把相关设置放在这个文件里即可. 步骤如下:

  1. 执行xinput,找到写有Touchpad之类字眼的那一行,记住id=后的数字;
  2. xinput list-props <id>列出触摸板设置,重点关注与Default不一样的值;
  3. 创建/etc/X11/xorg.conf.d/30-touchpad.conf,写入如下内容:
1
2
3
4
5
Section "InputClass"
Identifier "Touchpad"
Driver "libinput"
...
EndSection

然后参照libinput(4)把触摸板设置翻译成Xorg配置文件的格式,填在…的地方就可以啦.