“当从Chisel2到Chisel3重写OpenSoCFabric1.1.2时,要连接的数据'chisel3.core.UInt@103'必须是硬件,而不是裸凿类型”

时间:2018-05-07 07:31:05

标签: chisel

我正在尝试将OpenSoCFaric-1.1.2从chisel2重写为chisel3。但我遇到错误消息“要连接的数据'chisel3.core.UInt@103'必须是硬件,而不是裸Chisel类型”代码如下:

文件:packettoFlit.scala类:PacketToFlit val flitWidth = Flit.fromBits(0.U,parms).getWidth

文件:channel.scala对象:Flit

object Flit {
    def head(h: HeadFlit) : Flit = {
        val f = new Flit(h.parms)
        f.x := f.union.pack("Head", h)
        f
    }

    def body(b: BodyFlit) : Flit = {
        val f = new Flit(b.parms)
        f.x := f.union.pack("Body", b)
        f
    }

    def fromBits(n: UInt, parms: Parameters) : Flit = {
        val f = new Flit(parms)
        f.x := n
        f
    }

    /*
    def zeroHead(parms: Parameters) : HeadFlit = {
        val x = new HeadFlit(parms)
        x.
    }
    */
}

现在我对如何重写这些代码段以修复错误没有好的想法。你能提供一些帮助或建议吗?非常感谢!

2 个答案:

答案 0 :(得分:0)

我们需要查看更多错误消息(行号)以及更多代码以提供明确的答案,但我们的猜测是在某处使用UInt(xW),其中文字(yU)是预期的,或者缺少Wire()/ WireInit()包装器。

注意:LBL正在将此代码主动迁移到Chisel3。你可能最好等待他们的作品被发表。

答案 1 :(得分:0)

以下是Flit类的源代码。

class Flit(parms: Parameters) extends Bundle {
    val union   = new BitUnion(Map("Head" -> new HeadFlit(parms), "Body" -> new BodyFlit(parms)))
    val x       = UInt(union.width.W)
    val numVCs  = parms.get[Int]("numVCs")

    def asHead(dummy: Int = 0) : HeadFlit = union.unpack[HeadFlit]("Head", x)
    def asBody(dummy: Int = 0) : BodyFlit = union.unpack[BodyFlit]("Body", x)

    def whenHead(block: HeadFlit => Unit) { union.whenTag[HeadFlit]("Head", x)(block) }
    def whenBody(block: BodyFlit => Unit) { union.whenTag[BodyFlit]("Body", x)(block) }

    def isHead(dummy: Int = 0) : Bool = union.tagEquals("Head", x)
    def isBody(dummy: Int = 0) : Bool = union.tagEquals("Body", x)
    def isTail(dummy: Int = 0) : Bool = {
        val tailBit = Bool()
        when (isHead()) {
            tailBit := union.unpack[HeadFlit]("Head", x).isTail
        } .otherwise {
            tailBit := union.unpack[BodyFlit]("Body", x).isTail
        }
        tailBit
    }
    def getVCPort(dummy: Int = 0) : UInt = {
        val vcBits = UInt(log2Ceil(numVCs).W)
        when (isHead()) {
            vcBits := union.unpack[HeadFlit]("Head", x).vcPort
        } .otherwise {
            vcBits := union.unpack[BodyFlit]("Body", x).vcPort
        }
        vcBits
    }

    //override def clone = { new Flit(parms).asInstanceOf[this.type] }
    override def cloneType: this.type = new Flit(parms).asInstanceOf[this.type]
    // override def width : Int = {x.width}
}

非常感谢! 碧波