未绑定到凿子中的可合成节点异常和类型不匹配错误
Not bound to synthesizable node exception and type mismatch error in chisel
我有如下凿子功能
def apply(din: Bits, typ: Bits): Vec[UInt] =
{
val word = (typ.equals(MT_W)) || (typ.equals(MT_WU))
val half = (typ.equals(MT_H)) || (typ.equals(MT_HU))
val byte = (typ.equals(MT_B)) || (typ.equals(MT_BU))
val dout = Wire(Vec(4, UInt(8.W)))
dout := Mux(Bool(byte), Vec(4, din( 7,0)), //line 119
Mux(Bool(half), Vec(din(15,8), din( 7,0), din(15,8), din( 7,0)),
Vec(din(31,24), din(23,16), din(15,8), din( 7,0))))
return dout
}
重新分配给 dout 会产生未绑定到可合成节点异常,无论它被定义为连线。
[info] - should correctly write and read data *** FAILED ***
[info] chisel3.core.Binding$BindingException: 'con' (Vec(chisel3.core.UInt@133, chisel3.core.UInt@134, chisel3.core.UInt@135, chisel3.core.UInt@136))(*): Not bound to synthesizable node, currently only Type description
[info] at chisel3.core.Binding$.checkSynthesizable(Binding.scala:184)
[info] at chisel3.core.Mux$.doMux(Bits.scala:770)
[info] at chisel3.core.Mux$.doAggregateMux(Bits.scala:785)
[info] at chisel3.core.Mux$.do_apply(Bits.scala:764)
[info] at Common.StoreDataGen$.apply(memory.scala:119)
[info] at Common.OnChipMemory$$anonfun$$anonfun$apply.apply$mcV$sp(memory.scala:97)
所以我认为这可能是由于 return 语句引起的。只是为了检查我 运行 没有 return 的代码。然后它在第 119 行给出类型不匹配。(删除 Mux 也没有帮助)
[error] /home/.../memory.scala:119: type mismatch;
[error] found : Unit
[error] required: chisel3.Vec[chisel3.UInt]
[error] (which expands to) chisel3.core.Vec[chisel3.core.UInt]
[error] dout := Mux(Bool(byte), Vec(4, din( 7,0)),
[error] ^
我一定是做错了什么。但是我不知道它是什么。
此问题与 dout
的连接有关(请注意,:=
是 连接 的 Chisel 运算符,而不是 重新分配 这是一个 Scala 运算符)。考虑以下删节版:
dout := Mux(Bool(byte), Vec(4, din( 7,0)), ...)
具体来说,Vec(4, din( 7,0))
实际上是在构造一个 Vec 类型 ,大小为 4,元素类型为 Bits(8.W)。错误是指此 Vec 类型,而不是 dout
本身。
你到底想在这里做什么,你想重复 din(7,0)
4 次吗?如果是这样,试试这个:Vec(Seq.fill(4)(din(7,0)))
。这将为您创建一个 Wire 到 Mux。
我有如下凿子功能
def apply(din: Bits, typ: Bits): Vec[UInt] =
{
val word = (typ.equals(MT_W)) || (typ.equals(MT_WU))
val half = (typ.equals(MT_H)) || (typ.equals(MT_HU))
val byte = (typ.equals(MT_B)) || (typ.equals(MT_BU))
val dout = Wire(Vec(4, UInt(8.W)))
dout := Mux(Bool(byte), Vec(4, din( 7,0)), //line 119
Mux(Bool(half), Vec(din(15,8), din( 7,0), din(15,8), din( 7,0)),
Vec(din(31,24), din(23,16), din(15,8), din( 7,0))))
return dout
}
重新分配给 dout 会产生未绑定到可合成节点异常,无论它被定义为连线。
[info] - should correctly write and read data *** FAILED ***
[info] chisel3.core.Binding$BindingException: 'con' (Vec(chisel3.core.UInt@133, chisel3.core.UInt@134, chisel3.core.UInt@135, chisel3.core.UInt@136))(*): Not bound to synthesizable node, currently only Type description
[info] at chisel3.core.Binding$.checkSynthesizable(Binding.scala:184)
[info] at chisel3.core.Mux$.doMux(Bits.scala:770)
[info] at chisel3.core.Mux$.doAggregateMux(Bits.scala:785)
[info] at chisel3.core.Mux$.do_apply(Bits.scala:764)
[info] at Common.StoreDataGen$.apply(memory.scala:119)
[info] at Common.OnChipMemory$$anonfun$$anonfun$apply.apply$mcV$sp(memory.scala:97)
所以我认为这可能是由于 return 语句引起的。只是为了检查我 运行 没有 return 的代码。然后它在第 119 行给出类型不匹配。(删除 Mux 也没有帮助)
[error] /home/.../memory.scala:119: type mismatch;
[error] found : Unit
[error] required: chisel3.Vec[chisel3.UInt]
[error] (which expands to) chisel3.core.Vec[chisel3.core.UInt]
[error] dout := Mux(Bool(byte), Vec(4, din( 7,0)),
[error] ^
我一定是做错了什么。但是我不知道它是什么。
此问题与 dout
的连接有关(请注意,:=
是 连接 的 Chisel 运算符,而不是 重新分配 这是一个 Scala 运算符)。考虑以下删节版:
dout := Mux(Bool(byte), Vec(4, din( 7,0)), ...)
具体来说,Vec(4, din( 7,0))
实际上是在构造一个 Vec 类型 ,大小为 4,元素类型为 Bits(8.W)。错误是指此 Vec 类型,而不是 dout
本身。
你到底想在这里做什么,你想重复 din(7,0)
4 次吗?如果是这样,试试这个:Vec(Seq.fill(4)(din(7,0)))
。这将为您创建一个 Wire 到 Mux。