Chisel IO接口构造器中clone方法的使用
Usage of clone method in Chisel IO interface constructors
Sodor处理器集合的几个IO接口构造函数实现了自己的clone方法。我研究了 Scala 中 clone 方法的用法,但仍然无法弄清楚为什么要这样做。 (我在设计中的任何地方都找不到这些方法的任何明确用法)
Sodor 目前仍在 Chisel 2 上。clone
在 Chisel 3 中重命名为 cloneType
,以区别于 Java 和 Scala 中的 clone
。 cloneType
通常需要 Chisel 来实例化 参数化 Bundles
的新实例。例如:
class MyBundle extends Bundle {
val foo = UInt(32.W)
}
class MyParameterizedBundle(width: Int) extends Bundle {
val bar = UInt(width.W)
}
Chisel 经常需要从给定 Bundle class 的另一个实例创建一个实例 class。 Chisel 使用 Java 反射来做到这一点。如果构造函数没有参数,那么它可以从默认构造函数实例化对象。但是,它无法通过反射从 MyParameterizedBundle 的实例中确定 width
的值,因此它无法为构造函数提供适当的参数。这就是 cloneType
函数的用途。它告诉 Chisel 如何从给定对象创建 Bundle 的新实例。
我们希望将来能解决这个问题,但还没有时间实施。最有前途的方法是通过 Scala macro annotations.
自动生成 cloneType
Sodor处理器集合的几个IO接口构造函数实现了自己的clone方法。我研究了 Scala 中 clone 方法的用法,但仍然无法弄清楚为什么要这样做。 (我在设计中的任何地方都找不到这些方法的任何明确用法)
Sodor 目前仍在 Chisel 2 上。clone
在 Chisel 3 中重命名为 cloneType
,以区别于 Java 和 Scala 中的 clone
。 cloneType
通常需要 Chisel 来实例化 参数化 Bundles
的新实例。例如:
class MyBundle extends Bundle {
val foo = UInt(32.W)
}
class MyParameterizedBundle(width: Int) extends Bundle {
val bar = UInt(width.W)
}
Chisel 经常需要从给定 Bundle class 的另一个实例创建一个实例 class。 Chisel 使用 Java 反射来做到这一点。如果构造函数没有参数,那么它可以从默认构造函数实例化对象。但是,它无法通过反射从 MyParameterizedBundle 的实例中确定 width
的值,因此它无法为构造函数提供适当的参数。这就是 cloneType
函数的用途。它告诉 Chisel 如何从给定对象创建 Bundle 的新实例。
我们希望将来能解决这个问题,但还没有时间实施。最有前途的方法是通过 Scala macro annotations.
自动生成cloneType