【发布时间】:2021-11-05 06:41:17
【问题描述】:
在我的项目中,我有许多不同的自定义 Bundle。 它们可以完全不同。 比如这些:
class MyBundle extends Bundle {
val v1 = UInt(8.W)
val v2 = Bool()
val v3 = UInt(4.W)
}
class MyBundle2 extends Bundle {
val v4 = UInt(18.W)
val v5 = UInt(2.W)
}
...
我希望能够为所有这些操作生成相应的 Bundle,而不是手动创建新的 Bundle 来执行每个操作。 所以对于 MyBundle,我想做:
// Must be generated for each Bundle
class MyGenBundle extends Bundle {
val v1 = UInt(log2Ceil(8 + 1).W) // width = MyBundle.v1 width + 1
val v2 = UInt(log2Ceil(1 + 1).W) // width = MyBundle.v2 width + 1
val v3 = UInt(log2Ceil(4 + 1).W) // width = MyBundle.v3 width + 1
}
class MyModule extends Module {
...
...
val w_b = Wire(new MyBundle())
val w_gb = Wire(new MyGenBundle())
// Must be automated for each Bundle
w_gb.v1 := PopCount(w_b.v1)
w_gb.v2 := PopCount(w_b.v2)
w_gb.v3 := PopCount(w_b.v3)
}
我的目标是从MyBundle自动生成MyGenBundle(或直接在MyModule中类似),并在MyModule中执行strong> 对所有信号进行相同的操作。 这也意味着我需要动态处理每个 Bundle 中的所有信号。 最后,我认为解决方案可以有以下形式:
val w_b = Wire(new MyBundle())
val w_gb = Wire(new AutoGenBundle(new MyBundle())) // AutoGenBundle generates a Bundle from parameter
val v_sig = Seq(v1, v1, v3) // Can be recovered automatically
// from w_b.elements I think
foreach (s <- v_sig) {
w_gb."s" := PopCount(w_b."s") // Here "s" the dynamic name of the signal
} // But how in the real case ?
在 Chisel/Scala 中这在技术上可行吗? 如果有,您有什么实施的想法吗?
【问题讨论】:
标签: chisel