SpinalHDL入门教程(第一章)
SpinalHDL入门教程-第一章
本文是SpinalHDL的详细入门教程之第一章,内容:部署开发环境、创建初始工程。
部署开发环境
SpinalHDL是基于Scala开发的语言,其工程结构和标准Scala工程没有区别。为了方便,我们将在后文用Spinal作为SpinalHDL的缩写。Scala工程可用SBT进行管理,不少IDE都有支持SBT的插件。笔者比较推荐IDEA、VSCode和VSCodium。后面两个需要对应的插件。考虑到用户基数和软件授权等问题,后文将用VSCode演示。
SBT的全称是Scala Build Tool。
这是Spinal的官方安装指南,里面包含了IDEA、VSCodium和纯命令行的配置方法 (不会真有人只用纯命令行吧,不会吧) 。关于SBT的安装,这里是官方指南。需要说明,在Linux上部署SBT和编辑器插件后,可能会提示仅部分功能可用,此时需要检查系统中是否安装对应于JDK版本的JDK源文件,关键词:openjdk17-src
。不同发行版的Linux可能有不同安装方式,此处恕不赘述。
如果要在Windows上部署开发环境并使用开源仿真器,请注意Verilator仿真器很难在Windows上安装。此种情况下,可另选GHDL或Icarus Verilog。此外还有其它商业闭源仿真器,如Synplify。一些EDA软件也自带仿真器,如AMD Vivado的XSim。我们将在以后讲解烧录和综合时详细讲解EDA。
创建初始工程
在上一篇文章中我们提到,Spinal工程的目录结构和常规Scala工程别无二致,它们都依靠build.sbt
文件来管理工程信息,包括版本号、依赖项、构建参数等。这里我们先从这个仓库中拉取一个模板,之后再解释其中每个参数的含义(读者也可参考sbt手册)。
这里不需要在理解
build.sbt
上花费太多精力,只需理解编写Spinal必要的条目,其余的都是锦上添花。
工程拉取下来后,我们先观察其目录结构。需要注意,既然Spinal是基于Scala的一个库,那么在工程中就应该引入相应的依赖项,这可以在build.sbt
文件中添加条目,之后在初始化工程或运行代码时SBT将自动下载相关依赖。如果您在网络受限的环境下,请寻求镜像站或其它部署方式;不过一旦部署成功,则基本不需要改动。如果在部署过程中出现错误,应该首先查看代码编辑器中的输出日志,排查是否为网络故障。
在拉取成功后,此时您应该能看见名为SpinalTemplateSbt
的文件夹,用代码编辑器打开此文件夹,我们可以看到如下的目录结构:
hw [文件夹]
project [文件夹]
.gitignore
.mill-version
.scalafmt.conf
README.md
build.sbt
build.sc
首先,所有以半角句号(小数点)开头的文件和文件夹都不负责代码功能,它们有的是Git项目的管理信息,有的是项目管理工具(此处选用sbt
)的配置信息。例如.gitignore
告诉Git管理器哪些文件不应该被列为管理项,.scalafmt.conf
储存代码格式化的规则。
配置编辑器
为了更好地管理项目文件夹,我们可以在代码编辑器(或IDE)中添加插件,此处以VSCode为例,在插件市场搜索Scala (Metals)
并安装,如果一切正常,那么代码高亮、定义跳转、快速运行等辅助功能将自动启用。
运行一下
这里需要重申,笔者假设您是在Linux平台部署了整套开发环境,包含sbt和verilator。代码编辑器可以走SSH连接或直接运行于Linux图形界面,但Linux平台上部署verilator是很重要的,它将承担后续的仿真任务。如果确实需要在Windows平台部署,请参考iverilog
或其它仿真方案(iverilog和verilator都可以被Spinal直接调用,而Spinal中也可以直接编写测试案例并生成仿真波形)。
因为大多数代码编辑器支持打开文件夹,所以我们建议从代码编辑器打开终端,它将直接定位到当前工程的目录。此时我们尝试执行这条命令:
sbt "runMain projectname.MyTopLevelVerilog"
如果输出内容的最后含有[success]
字样,那么恭喜你,你已经成功用Spinal生成了一段Verilog代码!快去工程下的hw/verilog
文件夹下看看吧!
哦,等等,我们也可以直接用编辑器打开hw/spinal/projectname/MyTopLevel.scala
文件,在第26行的对象周围应该有插件提供的运行选项。以VSCode为例,点击第26行上方的run
即可运行(此情况下比从终端单独运行执行速度更快),生成的代码与上文提到的路径相同。
下一章我们将讲述如何对当前工程做一些小调整,包括修改工程名称和代码,以及自己编写一份Spinal源码。