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

要测试Chisel代码,我先启动一个控制台sbt,然后在我的项目的目录build.sbt中启动scala。我可以导入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

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

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

这里发生的是UInt是凿子类型,而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","middle","low","verilog")

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

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

更多信息

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

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

本文链接:https://www.f2er.com/3136475.html

大家都在问