未绑定到凿子内存中的可合成节点异常
Not bound to synthesizable node exception in chisel memory
我在 chisel 代码中得到以下异常。
[info] - should correctly write and read data *** FAILED ***
[info] chisel3.core.Binding$BindingException: 'this' (chisel3.core.UInt@d7): Not bound to synthesizable node, currently only Type description
[info] at chisel3.core.Binding$.checkSynthesizable(Binding.scala:184)
[info] at chisel3.core.Data.connect(Data.scala:139)
[info] at chisel3.core.Data.$colon$eq(Data.scala:204)
[info] at Common.OnChipMemory$$anonfun.apply(memory.scala:88)
[info] at Common.OnChipMemory$$anonfun.apply(memory.scala:60)
[info] at scala.collection.immutable.Range.foreach(Range.scala:166)
[info] at Common.OnChipMemory.<init>(memory.scala:60)
[info] at Common.memoryTester$$anonfun$$anonfun$apply$$anonfun$apply$mcV$sp.apply(memoryTest.scala:32)
[info] at Common.memoryTester$$anonfun$$anonfun$apply$$anonfun$apply$mcV$sp.apply(memoryTest.scala:32)
[info] at chisel3.core.Module$.do_apply(Module.scala:35)
从这个堆栈跟踪和一些反复试验中我可以找到那行,
read_data := chipMem(data_idx) //line 88
导致了问题。在此之前的代码发布在下方。
val lsb_idx = log2Up(4) // index of lsb in address
val chipMem = Mem(Vec(4, UInt(width = 8)), num_lines) // memory
val data_idx = req_addr >> UInt(lsb_idx) //req_addr is a UInt
val read_data = Bits()
在那之后,我一直没能找到问题的原因。我尝试将 read_data 更改为 UInt 的 Vec 并使用 read() 从内存中读取。
问题出在 read_data
的声明上。 Bits()
只是构造一个 类型 而不是实际的 硬件值 。您需要将 read_data 设为实际的 Wire
而不仅仅是 Bits
类型。另请注意,read_data
的类型需要与 Mem 的类型相同,因此您应该按如下方式声明 read_data
:
val read_data = Wire(Vec(4, UInt(8.W))
我在 chisel 代码中得到以下异常。
[info] - should correctly write and read data *** FAILED ***
[info] chisel3.core.Binding$BindingException: 'this' (chisel3.core.UInt@d7): Not bound to synthesizable node, currently only Type description
[info] at chisel3.core.Binding$.checkSynthesizable(Binding.scala:184)
[info] at chisel3.core.Data.connect(Data.scala:139)
[info] at chisel3.core.Data.$colon$eq(Data.scala:204)
[info] at Common.OnChipMemory$$anonfun.apply(memory.scala:88)
[info] at Common.OnChipMemory$$anonfun.apply(memory.scala:60)
[info] at scala.collection.immutable.Range.foreach(Range.scala:166)
[info] at Common.OnChipMemory.<init>(memory.scala:60)
[info] at Common.memoryTester$$anonfun$$anonfun$apply$$anonfun$apply$mcV$sp.apply(memoryTest.scala:32)
[info] at Common.memoryTester$$anonfun$$anonfun$apply$$anonfun$apply$mcV$sp.apply(memoryTest.scala:32)
[info] at chisel3.core.Module$.do_apply(Module.scala:35)
从这个堆栈跟踪和一些反复试验中我可以找到那行,
read_data := chipMem(data_idx) //line 88
导致了问题。在此之前的代码发布在下方。
val lsb_idx = log2Up(4) // index of lsb in address
val chipMem = Mem(Vec(4, UInt(width = 8)), num_lines) // memory
val data_idx = req_addr >> UInt(lsb_idx) //req_addr is a UInt
val read_data = Bits()
在那之后,我一直没能找到问题的原因。我尝试将 read_data 更改为 UInt 的 Vec 并使用 read() 从内存中读取。
问题出在 read_data
的声明上。 Bits()
只是构造一个 类型 而不是实际的 硬件值 。您需要将 read_data 设为实际的 Wire
而不仅仅是 Bits
类型。另请注意,read_data
的类型需要与 Mem 的类型相同,因此您应该按如下方式声明 read_data
:
val read_data = Wire(Vec(4, UInt(8.W))