平时主要用轻薄本办公,但是有时候又需要用Vivado做一些开发的工作,就感觉生产力不够。如果能在远程的高性能服务器上跑Vivado综合实现就好了。前段时间用ubuntu下安装的Vivado发现有一个Remote Host的设置。所以就准备折腾一下这个。
WSL
WSL的安装看官网的文档就好了。最近摸索了一段时间后感觉,Linux系统的桌面并没有很大的作用。一般只需要应用程序有一个可视化的图形窗口就行。切换目录浏览文件,启动应用程序都可以通过命令行快速实现。因此安装完WSL之后并不太需要安装一个“桌面”,而只要能够显示某些应用软件的图形界面即可。
图形界面显示用Xserver实现,我在widows端采用xcvsrc作为服务端。在WSL中运行的应用程序都可以转发到widnows主机上显示,这一转发的功能需要设置转发显示的地址,由变量DSIPLAY控制显示的地址和端口。某些远程SSH登录的软件可以指定这一地址,如果不指定的话也需要在.profile或.bashrc中确定DISPLAY变量。
Vivado安装
Vivado的安装过程可以看ug973,在没有图形界面的情况下可以用Batch mode来安装。WSL默认的根目录大小是256 GB,我没有额外扩容,安装了Vivado2019.2。
ug973里同样说明了特定版本的Vivado能够和什么版本的操作系统一起工作,能够和什么版本的仿真软件一起工作。比如在2019.2版本的ug973里,它并没有说支持20.04版本的ubuntu,可能那时候ubuntu还没有更新到20.04,但实际使用过程中是没问题的。
在真正开始安装之前需要先安装ncurses5库,然后再按部就班安装即可。安装完成后用了70+ GB。
sudo apt install libncurses5
安装完成之后只需要把Vivado的路径添加到PATH环境变量中就可以通过命令行启动Vivado了。可以把下面这行命令放在~/.bashrc的末尾。然后就可以在任意目录下启动vivado了,vivado启动的路径下会生成.log和.jou日志文件,因此一般推荐在工程目录下启动vivado,这样方便管理那些自动生成的日志文件。
source /tools/Xilinx/Vivado/2019.2/settings64.sh
用户目录下有两个文件.bashrc和.profile。.bashrc中的命令在每次打开一个终端的时候都会执行;.profile中的命令只有在用户刚登录的时候才会执行一次。Linux系统相比于windows系统能很快就让环境变量生效。因为只要在修改.bashrc之后,再打开一个新的终端,新的环境变量设置就能生效。更快的方式就是:
source ~/.bashrc
总之,在确保Xserver运行的情况下,WSL设置正确的DISPLAY变量。然后启动Vivado,就可以在windows系统下运行Linux环境中的Vivado。
Modelsim安装
Vivado安装成功后基本就能用了,Vivado也可以用来仿真,但是modelsim优化得更好,仿真更快,所以我一般都用modelsim仿真。但是在WSL里安装modelsim有些问题,如果是直接在Ubuntu系统下安装是没有问题的,可以参考这篇文章。
我同样照着这篇文章安装modelsim,modelsim能够正常启动,但是有一个致命的问题是,WSL在每次启动时物理地址会变,导致license失效。网上好像有一些奇技淫巧可以做到固定MAC地址,但官方还没有给出解决方案,所以我还是想再等一等官方的更新。这时候我想大不了每次启动wsl都生成一遍license,因为生成license也挺快的。但实际上后面还有一个坑。
加载正确的license之后能够打开modelsim了,但是不能开始仿真。一旦开始仿真它就报错,就像下面这样:
这我就没办法了。WSL下的Modelsim仿真主要就是有这样两个问题:
- MAC地址在每次启动WSL时都会发送变化;
- 启动仿真时发生socket被占用的问题。
Vivado调试
WSL中的Vivado连接板卡会相对比较繁琐,但是确实是可行的。
驱动安装
参考ug973,Vivado的安装目录下有驱动的安装文件。执行以下命令来安装驱动:
sudo ${vivado_install_dir}/data/xicom/cable_drivers/lin64/install_script/install_drivers/install_drivers
需要把其中的${vivado_install_dir}替换为Vivado的安装路径。比如我的是:
sudo /tools/Xilinx/Vivado/2019.2/data/xicom/cable_drivers/lin64/install_script/install_drivers/install_drivers
WSL连接USB设备
微软官方有介绍一种方法,可以由WSL直接连接USB外设。完成一系列安装后,需要在PowerShell中为WSL attach USB设备。
添加设备的命令:
usbipd wsl attach --busid <busid>
删除设备的命令:
usbipd wsl detach --busid <busid>
其中的busid是通过"usbipd wsl list"获得的。
只要安装完驱动和attach USB设备,Vivado就可以识别并连接硬件板卡。
远程综合实现
虽然Xilinx的ug904上有说可以利用远程的Linux主机来跑job。但它的要求就很迷,大概的意思就是需要工程所在的目录需要挂载到远程的服务器上才行。
我遇到的情况大概和这个帖子差不多,单独使用ssh远程访问Linux主机没有问题,但是Test就是通不过。现在也没有找到解决方法。
远程服务器端工作
借助Remote Host综合实现的想法没能实现,那干脆直接就在Remote Host上工作吧。这样都不需要WSL了,直接ssh远程连接Linux主机,在远程主机上完成所有开发。如果是在实验室的话,在实验室的局域网内通过ssh连接服务器做开发是完全可行的。
比如我用MobaXterm通过ssh连接我们实验室的服务器。
- 服务器IP:192.168.3.192
- 本地IP:192.168.3.49
因为要调试的设备也是在本地的,所以本地需要启动vivado的hw_server。并且hw_server的版本需要和服务器的vivado版本对应。2019版本及以前的Vivado支持单独下载hardware server。大概就200M的样子,很方便。
还有一种方法很方便,就是直接去已经安装了Vivado的主机上拷贝hw_server.exe和驱动安装文件。这两个文件加起来都不超过100M,非常方便。可以让轻薄本不安装Vivado,然后借助远程服务器来调试本地的设备。本地的主机一般要写文档啥的还是windows比较方便,所以我这里用的是windows版本的软件。如果你的本地主机用的是Linux版本的,那应该也有对应的驱动和hw_server。
- hw_server.exe路径: ${vivado_install_dir}/bin/unwrapped/win64.o/hw_server.exe
- 驱动安装包install_digilent.exe路径: ${vivado_install_dir}/data/xicom/cable_drivers/nt64/digilent/install_digilent.exe
安装完驱动,然后启动hw_server.exe就可以等待远程的服务器来连接了。
结果就像这样,本地主机通过ssh连接远程服务器的22端口,远程服务器通过本地主机的3121端口连接待调试设备。
而且这一做法不存在WSL中物理地址一直变的问题,可以正常在远程使用modelsim,modelsim的license里,需要为每一条加上"TS_OK"然后才能远程使用。可以看这个文章。正常做设计和仿真都是没问题的。
如果本地主机没法和服务器在一个网段内,可以考虑结合ZeroTier使用。ZeroTier实现内网穿透非常方便,可以建立一个虚拟的局域网,但就是网速可能比较慢。ZeroTier下载安装,使用方法。
结论
本来想在我的笔记本上通过WSL安装Vivado,然后连接远程主机,用Remote Host来跑一些job。但是因为种种原因失败了。但在在轻薄本上做Xilinx的FPGA开发并不是不行,这里有两个选择:
- 买高性能的轻薄本,既轻薄又有生产力,缺点就是比较贵。
- 利用ssh连接服务器,结合X11Forwarding进行开发。本地资源占用小,缺点就是比较依赖网速。