You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows11下Chisel模板运行失败:找不到which命令报错

执行sbt test时Chisel项目报错:找不到which命令

克隆Chisel模板项目后执行sbt test,在/src/test/scala/gcd/GCDSpec中出现如下错误:

Cannot run program "which": CreateProcess error=2, The system cannot find the file specified
java.io.IOException: Cannot run program "which": CreateProcess error=2, The system cannot find the file specified
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1170)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1089)
    at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:85)
    at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:119)
    at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$anonfun$runBuffered$1(ProcessBuilderImpl.scala:205)
    at scala.runtime.java8.JFunction0$mcI$sp.apply(JFunction0$mcI$sp.scala:17)
    at scala.sys.process.ProcessLogger$$anon$1.buffer(ProcessLogger.scala:103)
    at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.runBuffered(ProcessBuilderImpl.scala:205)
    at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang(ProcessBuilderImpl.scala:146)
    at svsim.verilator.Backend$.initializeFromProcessEnvironment(Backend.scala:27)
    at chisel3.simulator.EphemeralSimulator$DefaultSimulator.<init>(EphemeralSimulator.scala:29)
    at chisel3.simulator.EphemeralSimulator$.makeSimulator(EphemeralSimulator.scala:44)
    at chisel3.simulator.EphemeralSimulator$.simulate(EphemeralSimulator.scala:25)
    at gcd.GCDSpec.$anonfun$new$1(GCDSpec.scala:29)
    at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
    at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)
    at org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83)
    at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
    at org.scalatest.Transformer.apply(Transformer.scala:22)
    at org.scalatest.Transformer.apply(Transformer.scala:20)
    at org.scalatest.freespec.AnyFreeSpecLike$$anon$1.apply(AnyFreeSpecLike.scala:437)
    at org.scalatest.TestSuite.withFixture(TestSuite.scala:196)
    at org.scalatest.TestSuite.withFixture$(TestSuite.scala:195)
    at org.scalatest.freespec.AnyFreeSpec.withFixture(AnyFreeSpec.scala:1740)
    at org.scalatest.freespec.AnyFreeSpecLike.invokeWithFixture$1(AnyFreeSpecLike.scala:435)
    at org.scalatest.freespec.AnyFreeSpecLike.$anonfun$runTest$1(AnyFreeSpecLike.scala:447)
    at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
    at org.scalatest.freespec.AnyFreeSpecLike.runTest(AnyFreeSpecLike.scala:447)
    at org.scalatest.freespec.AnyFreeSpecLike.runTest$(AnyFreeSpecLike.scala:429)
    at org.scalatest.freespec.AnyFreeSpec.runTest(AnyFreeSpec.scala:1740)
    at org.scalatest.freespec.AnyFreeSpecLike.$anonfun$runTests$1(AnyFreeSpecLike.scala:506)
    at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:413)
    at scala.collection.immutable.List.foreach(List.scala:333)
    at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
    at org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:396)
    at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:475)
    at org.scalatest.freespec.AnyFreeSpecLike.runTests(AnyFreeSpecLike.scala:506)
    at org.scalatest.freespec.AnyFreeSpecLike.runTests$(AnyFreeSpecLike.scala:505)
    at org.scalatest.freespec.AnyFreeSpec.runTests(AnyFreeSpec.scala:1740)
    at org.scalatest.Suite.run(Suite.scala:1114)
    at org.scalatest.Suite.run$(Suite.scala:1096)
    at org.scalatest.freespec.AnyFreeSpec.org$scalatest$freespec$AnyFreeSpecLike$$super$run(AnyFreeSpec.scala:1740)
    at org.scalatest.freespec.AnyFreeSpecLike.$anonfun$run$1(AnyFreeSpecLike.scala:550)
    at org.scalatest.SuperEngine.runImpl(Engine.scala:535)
    at org.scalatest.freespec.AnyFreeSpecLike.run(AnyFreeSpecLike.scala:550)
    at org.scalatest.freespec.AnyFreeSpecLike.run$(AnyFreeSpecLike.scala:549)
    at org.scalatest.freespec.AnyFreeSpec.run(AnyFreeSpec.scala:1740)
    at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:47)
    at org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13(Runner.scala:1321)
    at org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13$adapted(Runner.scala:1315)
    at scala.collection.immutable.List.foreach(List.scala:333)
    at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1315)
    at org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24(Runner.scala:992)
    at org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24$adapted(Runner.scala:970)
    at org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1481)
    at org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:970)
    at org.scalatest.tools.Runner$.run(Runner.scala:798)
    at org.scalatest.tools.Runner.run(Runner.scala)
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2or3(ScalaTestRunner.java:43)
    at org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:26)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.base/java.lang.ProcessImpl.create(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:500)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:159)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1126)
    ... 59 more

问题根源

错误来自Chisel后端的Backend.scala代码,它尝试用which命令检测Verilator路径,但Windows系统原生没有which命令:

def initializeFromProcessEnvironment() = {
    val output = mutable.ArrayBuffer.empty[String]
    val exitCode = List("which", "verilator").!(ProcessLogger(output += _))
    if (exitCode != 0) {
      throw new Exception(s"verilator not found on the PATH!\n${output.mkString("\n")}")
    }
    val executablePath = output.head.trim
    new Backend(executablePath = executablePath)
  }
}

环境配置

build.sbt内容

// See README.md for license details.

ThisBuild / scalaVersion     := "2.13.12"
ThisBuild / version          := "0.1.0"
ThisBuild / organization     := "com.github.brugerx"

val chiselVersion = "6.2.0"

lazy val root = (project in file("."))
  .settings(
    name := "FPGA_Course_SKYLAB",
    libraryDependencies ++= Seq(
      "org.chipsalliance" %% "chisel" % chiselVersion,
      "org.scalatest" %% "scalatest" % "3.2.16" % "test",
    ),
    scalacOptions ++= Seq(
      "-language:reflectiveCalls",
      "-deprecation",
      "-feature",
      "-Xcheckinit",
      "-Ymacro-annotations",
    ),
    addCompilerPlugin("org.chipsalliance" % "chisel-plugin" % chiselVersion cross CrossVersion.full),
  )

JDK设置

JDK设置截图

解决方案

方案1:使用类Unix环境运行

Windows上安装Git Bash或WSL,在这些环境中执行sbt test——类Unix环境自带which命令,能正常检测Verilator路径。

方案2:替换which为Windows原生命令

如果要在原生Windows CMD/PowerShell运行,需将检测命令改为Windows原生的where:

  1. 若能修改依赖库源码:拉取Chisel相关库代码,修改Backend.scala中的List("which", "verilator")为List("where", "verilator")后本地编译依赖
  2. 手动指定Verilator路径:在测试代码中跳过自动检测,直接指定路径,例如修改GCDSpec.scala中的模拟代码:
simulate(new GCD, SimulatorConfig(backend = Backend(executablePath = "C:/path/to/verilator.exe"))) {
  // 原有测试逻辑
}

方案3:添加which命令到Windows环境

下载GNU Coreutils的Windows版本,将which.exe加入系统PATH,让代码能找到该命令。

内容的提问来源于stack exchange,提问作者BurgerMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 18:45:54