什么是凿子克隆

ARK*_*K91 5 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)
    }
Run Code Online (Sandbox Code Playgroud)

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]
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Chi*_*ley 5

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