sbtchisel

Using subrepo for Chisel project errs


I am trying to use the AsyncQueue subrepo (https://github.com/ucb-bar/asyncqueue) in my own project, much as the ClockDividerDemo in Chisel Multiclock Demos (https://github.com/edwardcwang/chisel-multiclock-demo/). However, sbt errs:

[error] ... .scala:9:8: not found: object freechips
[error] import freechips.asyncqueue.{AsyncQueue, AsyncQueueParams}
[error]        ^
[error] one error found

To be specific, I added these lines to the tail of my build.sbt:

lazy val asyncqueue = (project in file("asyncqueue-lite"))
lazy val myself = (project in file(".")).dependsOn(asyncqueue)

And this line to my own Scala file:

import freechips.asyncqueue.{AsyncQueue, AsyncQueueParams}

EDIT:

Complete build.sbt:

ThisBuild / scalaVersion := "2.13.8"
ThisBuild / version := "0.1.0"

val chiselVersion = "3.6.0"

lazy val root = (project in file("."))
  .settings(
    name := "asyncqueue-chisel",
    libraryDependencies ++= Seq(
      "edu.berkeley.cs" %% "chisel3" % chiselVersion,
      "edu.berkeley.cs" %% "chiseltest" % "0.6.0" % "test"
    ),
    scalacOptions ++= Seq(
      "-language:reflectiveCalls",
      "-deprecation",
      "-feature",
      "-Xcheckinit"
    ),
    addCompilerPlugin(
      "edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full
    )
  )

lazy val asyncqueue = (project in file("asyncqueue-lite"))
lazy val myself = (project in file(".")).dependsOn(asyncqueue)

Solution

  • I couldn't find any release published in any artifactory for asyncqueue. To make your project depends on that one, sbt lets you use projects directly from github when they are not packed.

    The steps to solve the issue are:

    1. Replace how asyncqueue project is defined
    // instead of
    lazy val asyncqueue = (project in file("asyncqueue-lite"))
    // use
    lazy val asyncqueue = RootProject(uri("https://github.com/ucb-bar/asyncqueue.git"))
    
    1. Add asyncqueue as a dependency
    lazy val root = (project in file("."))
      .dependsOn(asyncqueue) // <- this is how you make your project depends on another one
      .settings(
        name := "asyncqueue-chisel",
        // ...
      )
    
    1. downgrade scala to 2.12.17
    ThisBuild / scalaVersion := "2.12.17"
    
    1. downgrade chisel3 to 3.5.5. Using 3.5.6 or 3.6.0 will cause some conflict version. The following error message will be showed
    [error] this can be overridden using libraryDependencySchemes or evictionErrorLevel
    [error] (ssExtractDependencies) found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
    [error]
    [error]     * edu.berkeley.cs:chisel3_2.12:3.5.6 (pvp) is selected over {3.1.+, 3.1.8}
    [error]         +- asyncqueue-chisel:asyncqueue-chisel_2.12:0.1.0     (depends on 3.5.6)
    [error]         +- edu.berkeley.cs:chisel-iotesters_2.12:1.2.10       (depends on 3.1.8)
    [error]         +- asyncqueue-lite:asyncqueue-lite_2.12:1.0.0         (depends on 3.1.+)
    

    This is how you can set the correct chisel3 version

    val chiselVersion = "3.5.5"
    

    Now, your build.sbt should look like

    ThisBuild / scalaVersion := "2.12.17"
    ThisBuild / version := "0.1.0"
    
    val chiselVersion = "3.5.5"
    
    lazy val UcbBarAsyncQueue = RootProject(uri("https://github.com/ucb-bar/asyncqueue.git"))
    
    lazy val root = (project in file("."))
      .dependsOn(UcbBarAsyncQueue)
      .settings(
        name := "asyncqueue-chisel",
        libraryDependencies ++= Seq(
          "edu.berkeley.cs" %% "chisel3" % chiselVersion,
          "edu.berkeley.cs" %% "chiseltest" % "0.6.0" % "test"
        ),
        scalacOptions ++= Seq(
          "-language:reflectiveCalls",
          "-deprecation",
          "-feature",
          "-Xcheckinit"
        ),
        addCompilerPlugin(
          "edu.berkeley.cs" % "chisel3-plugin" % chiselVersion cross CrossVersion.full
        )
      )
    

    and the line

    import freechips.asyncqueue.{AsyncQueue, AsyncQueueParams}
    

    should compile without errors