十二 · 2021年11月23日

避免环境折腾,可选Docker

本篇教程来源于微信网友王璞。
很多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国内镜像源(https://yeasy.gitbook.io/docker\_practice/install/mirror)。

Intellij IDEA调用Docker

对于Java、Scala的开发者来说,Intellij IDEA是最好的IDE。而且Intellij IDEA也已经有官方的Docker插件,支持IDEA用Docker作为程序的运行环境。

准备工作

首先,安装Docker,参见Docker官方安装文档(https://docs.docker.com/get-d...)。然后下载镜像,运行如下命令:

docker pull datenlord/spinal-cocotb:1.6.1 

接下来在Intellij IDEA里安装Docker插件,在File菜单点击Settings:!图片.png

打开的Settings窗口如下所示:!图片.png
    选择Plugins子页面,输入插件名称Docker并搜索,返回的第一个插件就是Docker并安装。

配置IDEA

我选用Spinal HDL官方的sbt template SpinalTemplateSbt(https://github.com/SpinalHDL/...)项目作为例子,演示如何用IDEA调用Docker运行Spinal HDL。

用IDEA打开SpinalTemplateSbt项目,在Run菜单点击Edit Configurations:!图片.png

打开的Configurations窗口如下所示:!图片.png

点击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窗口如下所示:图片.png

还要继续配置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需要用绝对路径来做目录映射:Image

保存Configurations窗口,至此IDEA调用Docker的配置完毕。

IDEA调用Docker并在容器内编译运行Spinal HDL

在Run菜单点击Run...:图片.png

打开的Run窗口如下所示:图片.png

点击Run窗口的RunSpinal之后,IDEA调用Docker开始编译运行Spinal HDL项目,运行后的结果如下所示:图片.png

由上图可见,Spinal HDL运行后在SpinalTemplateSbt项目文件夹下生成了simWorkspace目录,sbt的运行结果显示在log窗口,最终运行结果成功。

用IDEA调用Docker来编译运行Spinal HDL项目,免去了安装Spinal HDL相关依赖的烦恼,而且由于Docker提供跨平台统一的运行环境,本文介绍的方法在Linux、Windows、MacOS上均可运行,只要安装IDEA和Docker即可。

☆ END ☆

作者:玉骐
原文链接:https://mp.weixin.qq.com/s/9CxGwP5pgMbDY-HxTnNiuA
微信公众号:
 title=

推荐阅读

更多SpinalHDL技术干货请关注Spinal FPGA专栏。
推荐阅读
关注数
1581
内容数
133
用SpinalHDL提升生产力
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息