请选择 进入手机版 | 继续访问电脑版

risc-v中文社区

 找回密码
 立即注册
查看: 986|回复: 0

[原创] 避免环境折腾,可选Docker

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-6-6 16:00:12 | 显示全部楼层 |阅读模式
✎ 编 者 按
     本篇教程来源于微信网友王璞。
    很多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-docker/
)。然后下载镜像,运行如下命令:
docker pull datenlord/spinal-cocotb:1.6.1
    接下来在Intellij IDEA里安装Docker插件,在File菜单点击Settings:
    打开的Settings窗口如下所示:
    选择Plugins子页面,输入插件名称Docker并搜索,返回的第一个插件就是Docker并安装。
配置IDEA
    我选用Spinal HDL官方的sbt template SpinalTemplateSbt(https://github.com/SpinalHDL/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即可。
☆ END ☆本帖来源微信公从号:Spinal FPGA

网页地址:
链接
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-3-29 23:18 , Processed in 0.015534 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表