什么是凿子克隆

时间:2018-01-04 23:38:16

标签: scala chisel

我是Chisel的新学习者。克隆在Chisel中的目的是什么?我看到了某处写的,"它创建了一个浅的副本"。我们为什么需要它? 这是一些例子。你能详细说明吗?

1)

  class Valid[+T <: Data](gen: T) extends Bundle
    {
    val valid = Output(Bool())
    val bits = Output(gen.chiselCloneType)//?????
    def fire(): Bool = valid
    override def cloneType: this.type = Valid(gen).asInstanceOf[this.type]
    }
    /** Adds a valid protocol to any interface */
    object Valid {
    def apply[T <: Data](gen: T): Valid[T] = new Valid(gen)
    }

2)

class Packet(n: Int, w: Int) extends Bundle {
val address = UInt(Log2Up(n).W)
val payload = UInt(w.W)
override def cloneType: this.type =
new Packet(n, w).asInstanceOf[this.type]
}

为什么cloneType是Override。它是否像Scala中的apply方法,或者只是更新Bundle中的cloneType方法。

由于

1 个答案:

答案 0 :(得分:4)

Chisel中捆绑包的典型用例是使用捆绑包的特定参数集创建实例,然后将该实例用作模板。将其用作模板意味着创建相同类型的新实例。在许多情况下,Chisel可以自动进行克隆,用户不需要实现cloneType但目前scala和chisel的限制(通常当bundle有多个参数时)chisel无法弄清楚如何实现副本,开发人员必须手动实现clonetype 。凿子的最新发展几乎消除了实现cloneType的需要。这是本月发布的3.1.0发布计划的一部分。有关详细信息,请参阅the autoclonetype issue