项目中如何使用本地的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 VIOLATION
或 HIERARCHY VIOLATION
错误,因为 spinal 的 idslplugin
实际上并没有被调用。
更改后,下一次编译项目将花费大量时间(约 2 分钟),但这只是第一次编译。在此之后,项目的编译时间应该和往常一样。