是否可以在控制台中测试凿子 Reg()?

Is it possible to test chisel Reg() in console?

为了测试 Chisel 代码,我启动了一个控制台 sbt,然后在我的项目目录中启动了 scala,其中文件 build.sbt。我可以导入 chisel3 库:

$ cd myproject
$ sbt
sbt:myproject> console
scala> import chisel3._
import chisel3._

然后我可以测试一些数据类型的凿子代码,例如:

scala> val plop = "b01010101".U(20.W)
plop: chisel3.UInt = UInt<20>(85)

但我可以测试 Reg() 或其他 Module() 元素:

scala> val plopReg = RegInit(23.U(24.W))
java.lang.IllegalArgumentException: requirement failed: must be inside Builder context
  at scala.Predef$.require(Predef.scala:281)
  at chisel3.internal.Builder$.dynamicContext(Builder.scala:232)
  at chisel3.internal.Builder$.currentClock(Builder.scala:308)
  at chisel3.internal.Builder$.forcedClock(Builder.scala:318)
  at chisel3.RegInit$.apply(Reg.scala:155)
  at chisel3.RegInit$.apply(Reg.scala:173)
  ... 36 elided

是否有在控制台中测试这些凿子元素的提示?还是必须写一个文件代码源?

这里发生的事情是 UInt 是 Chisel 类型,而 Reg 是硬件类型。

您只能在模块内使用硬件类型。我经常做类似下面的事情来在控制台上玩它们:

import chisel3._
import chisel3.stage.{ChiselStage, ChiselGeneratorAnnotation}
import chisel3.util.Cat

import firrtl.EmittedCircuitAnnotation

class Foo extends MultiIOModule {
  val in = IO(Input(Bool()))
  val out = IO(Output(Bool()))

  val tmp = RegNext(~in)

  out := tmp
}

val args = Array(
  "-X", "verilog",
  "-E", "high",
  "-E", "middle",
  "-E", "low",
  "-E", "verilog")

(new ChiselStage).execute(args, Seq(ChiselGeneratorAnnotation(() => new Foo)))

然后您可以查看 chisel3 顶级目录中的各种输出。

更多信息

具体来说,UInt(以及类似的东西)是生成 类 的工厂方法(从技术上讲,UInt 实际上是一个扩展 UIntFactory).当您执行 UInt(4.W) 时,就是在构建一个新的 UInt。您应该能够在任何您想要的地方构建新的 类,这就是为什么它可以在控制台上运行的原因。

但是,当您执行 Reg(UInt(4.W)) 时,它会与在详细说明过程中使用的全局可变状态进行交互,以将寄存器与特定模块相关联。这个全局可变状态存储在 Builder 中。您收到的错误来自 Builder,您在其中尝试使用其方法而没有首先进入模块。