背景是系统课需要线下验收,但是基于 ARM64 的 Macbook 并不能直接运行 Vivado ,这会给线下验收带来极大的麻烦,因此在经过一番折腾之后有了这篇文章,这基于几个 Github 已有项目。

0 环境简介

所上课程为浙大信安的专业课计算机系统一,在实验文档的标准开发环境中我们大概会使用到 Linux (e.g. verilator,gtkwave),Windows/Linux on X86_64(Vivado),其中前者在 Mac 上非常容易实现,我使用虚拟机运行了 Ubuntu_20.04LTS ,但 Vivado 并没有对 ARM64 指令集进行支持,因此最终方案是通过 Apple Rosetta 在 Docke 中运行一个虚拟化的 X64 环境来支持 Vivado ,但是任何转译层都无法避开严重的性能损失,因此该方案仅适用于应急(M3 MAX啥的当我没说)。同时 Rosetta 暂时还未支持与宿主机的 USB 共享,因此在 bitstream 烧录上使用了 openFPGALoader

1 Linux配置

我使用的是 UTM 虚拟机内运行 Ubuntu ,不同于没有支持 Apple Silicon 的 Virtual Box 和 需要付费的 Vmware Fusion ,UTM 对于 M1/M2 芯片有良好的支持,同时免费开源。 但 Ubuntu Desktop 本身并没有提供 ARM64 的发行版,因此使用了曲线救国的方式,即安装了Ubuntu Server ARM64 后,通过终端为其安装 GUI。 在虚拟机导入镜像开机完成基本配置后运行以下命令:

sudo apt upgrade
sudo apt upgrade -y
sudo install ubuntu_desktop
reboot

再次进入账户你就能得到一个带有 GUI 的 Ubuntu 虚拟机。 在这个配置过程中发现火狐始终出现中文乱码问题,不知道这是不是广发性问题,建议使用 Chromium 。你只需要安装中文语言支持并输入以下命令:

#在有GUI的Ubuntu中你可以直接进入设置切换语言来进行中文支持的安装
sudo snap install chromium 

然后你就可以正常的按照实验文档进行仓库复制和基本工具 (Logisim,verilator,gtkwave )的安装。

2 Vivado配置

可以完全按照链接进行配置,这里仅进行简单介绍和介绍一些我碰到的问题。

  • 你需要的环境:XQuartz and Docker®
  • Docker需要的一些设置:在设置中打开 “Use Virtualization Framework"下的"Use Rosetta for x86/amd64 emulation on Apple Silicon” ,即通过 Apple Rosetta 进行 ARM64 与X86_64之间的转译。注意不同于文档,在最新版本的 Docker 中,Rosetta的开启在进入 Settings的第一个选项卡而不是 Features inDevelopment之中。同时进入 Resources 选项卡确保你的 Swap 内存大于 2GB 并分配了足够的硬盘空间和合理的 CPU 核数
  • 下载该工具,解压后运行以下指令
cd Downloads/vivado-on-silicon-mac-main
caffeinate -dim ./install.sh

你可能会碰到终端提示网络连接失败,你可以采取以下两种方法后重试:1. 开启代理 2.进入 $install.sh$ 文件进行如下修改

# check internet connectivity #line10
#if ! ping -q -c1 google.com &>/dev/null
#	then
#		f_echo "Could not connect to the internet. Recheck and run ./install again."
#		exit 1
#fi
#将line10后检测网络连通的代码注释掉,实测下载全过程并不需要代理
  • 此后只需要按照终端黄色提示操作,结束依赖下载后,将 Vivado 二进制安装文件拖入终端并回车运行 注意要选择 Linux Self Extracting Web Installer 下载,同时注意在下载信息补全界面最好使用 Gmail 或其他境外邮箱避免遇到下载限制
  • 终端运行完成之后你就获得了一个运行在 Docker 上的 Vivado 以下是一些注意事项
  1. 这个项目中 Vivado 所运行的 Docker 的 /user/home 目录与你下载该项目后解压的 path/vivado-on-silicon-mac 共享,因此你可以实现很方便的数据转移
  2. 这个项目启动同时运行一个基于 Xilinx XVC 的监听服务器,如果你使用的 FPGA 的 cable 型号为 FT2232C ,可以直接通过这个监听服务器来代替 JTAG 实现与 Docker Vivado 的连接,但 Rosetta 本身无法直接在 Docker内访问宿主机的 USB 端口,以下介绍另一种烧录 bitstream 的方法

3 openFPGALoader 配置

openFPGALoader是一个开源项目,实现了直接通过终端与开发板通信并实现烧录 bitstream 的目的。具体受支持的 FPGA 列表可以查看链接,而我们所使用的 Arty A7 100t 也在支持列表中。 确保你的开发板已经连接至Mac , 在 Mac OS 中启动一个终端后执行以下指令:

#安装
brew install openfpgaloader
#烧录程序 以系统课所使用的开发板为例
sudo openFPGALoader -b arty_a7_100t path/name.bit #烧录进SRAM
sudo openFPGALoader -b arty_a7_100t -f path/name.bit #烧录进FLASH
#sudo并不是必须的,但是在不用sudo的情况下有一定概率产生访问拒绝报错

此时再观察你的开发板,你应当发现程序已经被正确地烧写到了开发板上。

4 不同环境下文件共享

在上述的所有步骤中总共涉及了虚拟机,Docker,Mac OS三种环境,因此文件共享是一件提高开发效率所必须完成的事。其中 Docker 与 Mac OS 已经在2中提及。下面简述如何实现 Mac OS 与 Ubuntu 的文件共享。

  1. 进入设置-共享-文件共享/远程登录,你可以打开这两个中的任意选项,如下图所示,远程登录能够允许你直接访问整个硬盘,而文件共享则允许你访问特定的目录 设置-共享 文件共享 远程登录
  2. 进入 Ubuntu 虚拟机,进入 Home-Other Locations ,现在点击后输入 Mac 的用户密码即可直接访问 Mac 的文件系统,从而实现 Mac OS 与 Ubuntu 的文件共享。 Other Location

5 总结

事实上,最后发现对我而言其实只有3是必要的步骤,我完全可以用台式机的 Windows 环境进行开发,只需要最后能在 Mac 上进行烧录即可,但还是希望这篇文章能帮到后续上这门课且只有 Mac 从而走投无路的人,因为找轮子完成整个流程确实花了我不少时间,这样一篇轮子合集应当能够减少配置起来的一些麻烦。