我是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方法。
谢谢
最佳答案
Chisel中捆绑软件的典型用例是使用捆绑软件的一组特定参数创建一个实例,然后将该实例用作模板。使用它作为模板意味着创建一个相同类型的新实例。在许多情况下,Chisel可以自动执行克隆,并且用户不需要实现cloneType,但是目前scala和chisel的局限性(通常在捆绑包具有多个参数时),chisel无法弄清楚如何实现副本,并且开发人员必须手动实现clonetype 。凿子的最新发展几乎消除了实现cloneType的需要。这是本月发布的3.1.0计划的发布的一部分。有关详细信息,请参见the autoclonetype issue。