是否可以在控制台中测试凿子 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
,您在其中尝试使用其方法而没有首先进入模块。
为了测试 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
,您在其中尝试使用其方法而没有首先进入模块。