项目中如何使用本地的SpinalHDL克隆作为依赖

使用SpinalHDL的默认方式是通过sbt或mill自动下载其发布的版本。如果你想使用最新版本,你可能会要使用git直接从上游获取未发布的“dev”分支。这可能是因为你想要使用一个新功能,或者因为你想要在一个项目中测试你自己的Spinal扩展(请考虑通过打开一个PR来提交它)。

有关使用的示例,请参阅 VexiiRiscv

创建本地的SpinalHDL git 克隆

cd /somewhere
git clone --depth 1 -b dev https://github.com/SpinalHDL/SpinalHDL.git

在上面的命令中,可以用要签出的分支名称替换 dev--depth 1 阻止下载版本库历史。

配置构建系统

根据您使用的工具,将本地 git 文件夹作为依赖项加载的 sbt 或 mill 指令:

配置 sbt (更新 build.sbt)

ThisBuild / version := "1.0"              // change as needed
ThisBuild / scalaVersion := "2.12.18"     // change as needed
ThisBuild / organization := "org.example" // change as needed

val spinalRoot = file("/somewhere/SpinalHDL")
lazy val spinalIdslPlugin = ProjectRef(spinalRoot, "idslplugin")
lazy val spinalSim = ProjectRef(spinalRoot, "sim")
lazy val spinalCore = ProjectRef(spinalRoot, "core")
lazy val spinalLib = ProjectRef(spinalRoot, "lib")

lazy val projectname = (project in file("."))
.settings(
   Compile / scalaSource := baseDirectory.value / "hw" / "spinal",
).dependsOn(spinalIdslPlugin, spinalSim, spinalCore, spinalLib)

scalacOptions += (spinalIdslPlugin / Compile / packageBin / artifactPath).map { file =>
  s"-Xplugin:${file.getAbsolutePath}"
}.value

fork := true

配置 mill (更新 build.sc)

import mill._, scalalib._

import $file.^.SpinalHDL.build
import ^.SpinalHDL.build.{core => spinalCore}
import ^.SpinalHDL.build.{lib => spinalLib}
import ^.SpinalHDL.build.{idslplugin => spinalIdslplugin}

val spinalVers = "1.10.2a"
val scalaVers = "2.12.18"

object projectname extends RootModule with SbtModule {
   def scalaVersion = scalaVers
   def sources = T.sources(
      this.millSourcePath / "hw" / "spinal"
   )

   def idslplugin = spinalIdslplugin(scalaVers)
   def moduleDeps = Seq(
      spinalCore(scalaVers),
      spinalLib(scalaVers),
      idslplugin
   )
   def scalacOptions = super.scalacOptions() ++ idslplugin.pluginOptions()
}

注意 import $file.^.SpinalHDL.build 行。它使用了 ammonite REPL 的魔法 $file 来查找 SpinalHDL 的 build.sc。(^ 从当前目录向上移动一个目录。) 假设目录结构如下:

/somewhere
|-SpinalHDL   # <-- cloned spinal git
| |-build.sc
|-projectname
| |-build.sc  # <-- your project, mill is ran from here

完成

请注意添加到 scalacOptions 的内容。如果没有它,编译任何 Spinal 项目都可能产生无数的 SCOPE VIOLATIONHIERARCHY VIOLATION 错误,因为 spinal 的 idslplugin 实际上并没有被调用。

更改后,下一次编译项目将花费大量时间(约 2 分钟),但这只是第一次编译。在此之后,项目的编译时间应该和往常一样。