很多Spinal HDL新手朋友碰到环境安装的问题,特别是Windows下需要重新编译Verilator之类的工具,对新手很不友好。我推荐大家用Docker做为Spinal HDL的运行环境,一劳永逸解决Windows和MacOS等非Linux操作系统下的Spinal HDL环境安装问题。
Docker简介
Docker提供了跨平台的统一运行环境。不论在Windows或MacOS还是Linux下,Docker都可以运行。Docker首先把运行环境的依赖打包到镜像里,然后Docker运行打包好的镜像,生成运行时的容器,此时Docker容器里就提供了镜像里打包好的依赖库或依赖程序。默认情况下,Docker运行时的容器提供的是Linux环境。此外,Docker还提供了统一的镜像仓库Docker Hub用于分发Docker镜像。
比如,我制作的datenlord/spinal-cocotb:1.6.1这个镜像里安装了JDK-11、sbt、mill、verilator、iverilog、gtkwave、cocotb,安装的都是Linux程序。运行docker run -it datenlord/spinal-cocotb:1.6.1这条命令创建的容器里,有Java环境和Python环境,也有Scala的编译工具sbt和mill,还有verilator、iverilog、gtkwave这些仿真和波形工具。这个容器里的环境还是Linux,不论容器外面是哪种操作系统。
这样的话,有了datenlord/spinal-cocotb:1.6.1这个镜像,就不需要在操作系统里安装Spinal HDL的环境,甚至都不需要在操作系统里安装Java,只需要安装Docker,然后用Docker运行这个镜像创建容器,就可以在容器环境里运行Spinal HDL。
我已经把datenlord/spinal-cocotb:1.6.1这个镜像上传到Docker官方镜像仓库Docker Hub,这个镜像有1.53GB,如果从Docker Hub下载太慢可以配置Docker国内镜像源。
Intellij IDEA调用Docker
对于Java、Scala的开发者来说,Intellij IDEA是最好的IDE。而且Intellij IDEA也已经有官方的Docker插件,支持IDEA用Docker作为程序的运行环境。
准备工作
首先,安装Docker,参见Docker官方安装文档。然后下载镜像,运行如下命令:
接下来在Intellij IDEA里安装Docker插件,在File菜单点击Settings:!
打开的Settings窗口如下所示:!
选择Plugins子页面,输入插件名称Docker并搜索,返回的第一个插件就是Docker并安装。
配置IDEA
我选用Spinal HDL官方的sbt template SpinalTemplateSbt 项目作为例子,演示如何用IDEA调用Docker运行Spinal HDL。
用IDEA打开SpinalTemplateSbt项目,在Run菜单点击Edit Configurations:!
打开的Configurations窗口如下所示:!
点击Configurations窗口左上角的+号,在弹出菜单里选择Docker的Docker Image子菜单,并输入如下字段:
Name: RunSpinal —— 给当前的Docker镜像配置取个名称,IDEA可以创建多个Docker镜像配置
Image ID or name: datenlord/spinal-cocotb:1.6.0 —— 需要IDEA运行的Docker镜像 * Container name: run_spinal —— 指定IDEA把Docker镜像运行起来之后创建的容器的名字
Command: sbt "runMain mylib.MyTopLevelSim" —— 在容器里要运行的命令,也就是要用sbt来编译运行Spinal HDL项目。
Configurations窗口如下所示:
还要继续配置Docker镜像,把Spinal HDL项目目录映射到运行起来之后的Docker容器内部:
点击"Bind mounts:"右侧的文件夹图标,打开Bind Mounts子窗口,并点击该子窗口右上角的+号,创建两条容器外部到内部的路径映射:
因为Docker容器内默认用root用户身份来运行命令,所以sbt下载的maven依赖都保存到容器内的root用户的home目录/root;
容器内sbt下载的maven依赖是保存到用户home目录里的.cache/coursier文件夹,所以只需要把这个文件夹映射到容器外部,这样容器被销毁之后,sbt下载的依赖就会保存在容器外部,下次IDEA运行Docker容器的时候再把保存到外部的依赖所在的目录映射到容器里,这样sbt就无需每次运行重新下载依赖;
把SpinalTemplateSbt项目映射到容器内,容器外Host path是项目的绝对路径/tmp/SpinalTemplateSbt,映射到容器内Container path为/myproj/SpinalTemplateSbt;
把容器内sbt编译时下载的maven依赖映射到容器外部,这样除第一次运行之外,以后运行Docker容器用sbt编译运行Spinal HDL项目就不需要再下载maven依赖库,容器外Host path为/tmp/SpinalTemplateSbt/coursie,容器内Container path为/root/.cache/coursier,对容器内路径解释如下:
保存Bind Mounts子窗口的设置,再设置Configurations窗口的Run options为--rm --workdir /myproj/SpinalTemplateSbt,对这两个运行参数的说明如下:
--rm 使得容器运行完毕之后自动删除容器的临时文件
--workdir /myproj/SpinalTemplateSbt 指定创建容器开始运行后,容器内默认的当前工作目录,/myproj/SpinalTemplateSbt就是容器内的项目路径
Configurations窗口的目录路径映射相关配置如下所示,注意Docker需要用绝对路径来做目录映射:
保存Configurations窗口,至此IDEA调用Docker的配置完毕。
IDEA调用Docker并在容器内编译运行Spinal HDL
在Run菜单点击Run...:
打开的Run窗口如下所示:
点击Run窗口的RunSpinal之后,IDEA调用Docker开始编译运行Spinal HDL项目,运行后的结果如下所示:
由上图可见,Spinal HDL运行后在SpinalTemplateSbt项目文件夹下生成了simWorkspace目录,sbt的运行结果显示在log窗口,最终运行结果成功。
用IDEA调用Docker来编译运行Spinal HDL项目,免去了安装Spinal HDL相关依赖的烦恼,而且由于Docker提供跨平台统一的运行环境,本文介绍的方法在Linux、Windows、MacOS上均可运行,只要安装IDEA和Docker即可。
原作者:王璞