不能戳 MixedVec
Can't poke MixedVec
我在我的模块接口中声明了一个 MixedVec:
class WbInterconOneMaster(val awbm: WbMaster,
val awbs: Seq[WbSlave]) extends Module {
val io = IO(new Bundle{
val wbm = Flipped(new WbMaster(awbm.dwidth, awbm.awidth))
val wbs = MixedVec(awbs.map{i => Flipped(new WbSlave(i.dwidth, i.awidth, i.iname))})
})
正确编译并正确生成Verilog。但是我不能像这样在信号上戳值:
for(wbs <- dut.io.wbs) {
poke(wbs.ack_o, 0)
}
在执行时出现这个错误(verilator 后端):
[info] java.util.NoSuchElementException: head of empty list
[info] at scala.collection.immutable.Nil$.head(List.scala:420)
[info] at scala.collection.immutable.Nil$.head(List.scala:417)
[info] at scala.collection.mutable.Stack.top(Stack.scala:132)
[info] at chisel3.internal.naming.NamingStack.pop_return_context(Namer.scala:133)
[info] at chisel3.util.MixedVec.length(MixedVec.scala:81)
[info] at scala.collection.IndexedSeqLike$class.iterator(IndexedSeqLike.scala:90)
[info] at chisel3.util.MixedVec.iterator(MixedVec.scala:81)
[info] at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
[info] at chisel3.util.MixedVec.foreach(MixedVec.scala:81)
[info] at wbplumbing.TestWbInterconDualSlave.<init>(testwbplumbing.scala:61)
请注意,该问题已在 github project 上用凿子版本 3.1.6 提出,但已标记为已关闭。我用的是3.1.8版本,好像还坏了
[编辑]
我用 chisel 3.2.0 和 iotester 1.3.0 升级了我的项目:
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.2.0"
libraryDependencies += "edu.berkeley.cs" %% "chisel-iotesters" % "1.3.0"
当我取消注释该行时仍然出现错误:
for(wbs <- dut.io.wbs) {
poke(wbs.ack_o, 0)
}
(如果我留下这些行的评论,那行得通)
但堆栈跟踪不同 :
[info] - should read and write wishbone value on two slaves *** FAILED ***
[info] chisel3.internal.ChiselException: Error: Not in a RawModule. Likely cause: Missed Module() wrap, bare chisel API call, or attempting to construct hardware inside a BlackBox.
[info] at chisel3.internal.throwException$.apply(Error.scala:42)
[info] at chisel3.internal.Builder$.referenceUserModule(Builder.scala:287)
[info] at chisel3.Data.connect(Data.scala:384)
[info] at chisel3.Data.$colon$eq(Data.scala:475)
[info] at wbplumbing.TestWbInterconDualSlave$$anonfun.apply(testwbplumbing.scala:63)
[info] at wbplumbing.TestWbInterconDualSlave$$anonfun.apply(testwbplumbing.scala:62)
[info] at scala.collection.Iterator$class.foreach(Iterator.scala:742)
[info] at scala.collection.AbstractIterator.foreach(Iterator.scala:1194)
[info] at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
[info] at chisel3.util.MixedVec.foreach(MixedVec.scala:88)
[info] ...
我不确定发生了什么,但我能够在当前的 chisel3 版本中重现您的错误,但相同的代码似乎 运行 在 chisel 3.2 候选版本快照下正确。您可以在那里尝试您的代码吗?
希望它能更好地工作。问题似乎并不直接出在 MixedVec
中,但一定出在底层代码中。
我必须说你在使用 MixedVec
时需要特别小心,它不能被硬件索引索引,所以所有对其元素的引用都必须在精化时从常量 Scala int 引用。
我在我的模块接口中声明了一个 MixedVec:
class WbInterconOneMaster(val awbm: WbMaster,
val awbs: Seq[WbSlave]) extends Module {
val io = IO(new Bundle{
val wbm = Flipped(new WbMaster(awbm.dwidth, awbm.awidth))
val wbs = MixedVec(awbs.map{i => Flipped(new WbSlave(i.dwidth, i.awidth, i.iname))})
})
正确编译并正确生成Verilog。但是我不能像这样在信号上戳值:
for(wbs <- dut.io.wbs) {
poke(wbs.ack_o, 0)
}
在执行时出现这个错误(verilator 后端):
[info] java.util.NoSuchElementException: head of empty list
[info] at scala.collection.immutable.Nil$.head(List.scala:420)
[info] at scala.collection.immutable.Nil$.head(List.scala:417)
[info] at scala.collection.mutable.Stack.top(Stack.scala:132)
[info] at chisel3.internal.naming.NamingStack.pop_return_context(Namer.scala:133)
[info] at chisel3.util.MixedVec.length(MixedVec.scala:81)
[info] at scala.collection.IndexedSeqLike$class.iterator(IndexedSeqLike.scala:90)
[info] at chisel3.util.MixedVec.iterator(MixedVec.scala:81)
[info] at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
[info] at chisel3.util.MixedVec.foreach(MixedVec.scala:81)
[info] at wbplumbing.TestWbInterconDualSlave.<init>(testwbplumbing.scala:61)
请注意,该问题已在 github project 上用凿子版本 3.1.6 提出,但已标记为已关闭。我用的是3.1.8版本,好像还坏了
[编辑]
我用 chisel 3.2.0 和 iotester 1.3.0 升级了我的项目:
libraryDependencies += "edu.berkeley.cs" %% "chisel3" % "3.2.0"
libraryDependencies += "edu.berkeley.cs" %% "chisel-iotesters" % "1.3.0"
当我取消注释该行时仍然出现错误:
for(wbs <- dut.io.wbs) {
poke(wbs.ack_o, 0)
}
(如果我留下这些行的评论,那行得通)
但堆栈跟踪不同 :
[info] - should read and write wishbone value on two slaves *** FAILED ***
[info] chisel3.internal.ChiselException: Error: Not in a RawModule. Likely cause: Missed Module() wrap, bare chisel API call, or attempting to construct hardware inside a BlackBox.
[info] at chisel3.internal.throwException$.apply(Error.scala:42)
[info] at chisel3.internal.Builder$.referenceUserModule(Builder.scala:287)
[info] at chisel3.Data.connect(Data.scala:384)
[info] at chisel3.Data.$colon$eq(Data.scala:475)
[info] at wbplumbing.TestWbInterconDualSlave$$anonfun.apply(testwbplumbing.scala:63)
[info] at wbplumbing.TestWbInterconDualSlave$$anonfun.apply(testwbplumbing.scala:62)
[info] at scala.collection.Iterator$class.foreach(Iterator.scala:742)
[info] at scala.collection.AbstractIterator.foreach(Iterator.scala:1194)
[info] at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
[info] at chisel3.util.MixedVec.foreach(MixedVec.scala:88)
[info] ...
我不确定发生了什么,但我能够在当前的 chisel3 版本中重现您的错误,但相同的代码似乎 运行 在 chisel 3.2 候选版本快照下正确。您可以在那里尝试您的代码吗?
希望它能更好地工作。问题似乎并不直接出在 MixedVec
中,但一定出在底层代码中。
我必须说你在使用 MixedVec
时需要特别小心,它不能被硬件索引索引,所以所有对其元素的引用都必须在精化时从常量 Scala int 引用。