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