为了测试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在控制台中有测试这些凿子元素的提示吗?还是必须编写文件代码源代码?
发布于 2019-11-15 14:27:56
这里要做的是,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,您尝试使用它的方法,而不首先在模块中使用。
https://stackoverflow.com/questions/58770374
复制相似问题