不受凿子中可合成节点异常和类型不匹配错误的约束

时间:2017-02-02 04:15:23

标签: 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$1$$anonfun$apply$1.apply$mcV$sp(memory.scala:97)

所以我认为这可能是由于返回声明的原因。只是检查我运行代码没有返回。然后它在第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]                     ^

我必须在这里做一些非常错误的事情。但我无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:2)

此问题与dout的连接有关(请注意:=连接的Chisel运算符,而不是重新分配,它是Scala运算符)。考虑下面的删节版本:

dout        :=      Mux(Bool(byte), Vec(4, din( 7,0)), ...)

具体来说,Vec(4, din( 7,0))实际上构建了一个大小为4的 Vec Type ,其元素类型为 Bits(8.W)。错误是指这个Vec类型,而不是dout本身。

你到底想做什么,你试图重复din(7,0) 4次?如果是这样,请尝试:Vec(Seq.fill(4)(din(7,0)))。这将为您创建一个Wire to Mux。