https://www.chisel-lang.org/docs/cookbooks/cookbook#how-do-i-deal-with-aliased-bundle-fields
Chisel 多个字段赋相同Data对象值的问题
class AliasedBundle[T <: Data](gen: T) extends Bundle {
val foo = gen
val bar = gen
}
这个部分说了:
在 Chisel 中,如果你在 Bundle(硬件包)中对多个字段赋值为相同的 Data 对象实例,就会导致别名(aliasing)问题。因为 Chisel 需要能够区分 Bundle 中的不同字段,如果它们引用相同的内存对象,Chisel 就无法区分它们,这在硬件生成和模拟中会造成问题。
因为
在 Chisel 中,如果 foo 和 bar 是相同的 Data 对象实例,会导致几个问题:
硬件区分问题:在硬件设计中,每个信号通常对应一个物理线或寄存器。如果 foo 和 bar 是同一个实例,那么在硬件中它们将无法区分,因为它们实际上是同一个信号。
模拟和测试问题:在 Chisel 的模拟环境中,每个 Data 实例都应该能够独立变化,以便于测试不同的硬件行为。如果两个字段是同一个实例,它们将始终具有相同的值,这限制了模拟的能力和测试的覆盖范围。
预期的硬件行为:在设计硬件时,通常期望每个信号或寄存器能够独立控制和观察。如果两个字段引用同一个对象,那么对其中一个字段的修改会影响另一个字段,这通常不是设计者想要的行为。
工具链支持:Chisel 及其后端工具链(如用于生成 Verilog 或 VHDL 的工具)依赖于每个 Data 实例的唯一性来生成正确的硬件描述。别名问题会导致工具链无法正确地处理这些实例。
getVerilogString(new Top(new AliasedBundle(UInt(8.W))))
// chisel3.AliasedAggregateFieldException: AliasedBundle contains aliased fields named (bar,foo)
// at ... ()
// at repl.MdocSession$MdocApp17$Top$$anonfun$50$$anonfun$apply$37.apply(cookbook.md:301)
// at repl.MdocSession$MdocApp17$Top$$anonfun$50$$anonfun$apply$37.apply(cookbook.md:301)
// at chisel3.experimental.prefix$.apply(prefix.scala:50)
// at repl.MdocSession$MdocApp17$Top$$anonfun$50.apply(cookbook.md:301)
// at repl.MdocSession$MdocApp17$Top$$anonfun$50.apply(cookbook.md)
// at chisel3.internal.plugin.package$.autoNameRecursively(package.scala:33)
// at repl.MdocSession$MdocApp17$Top.<init>(cookbook.md:301)
// at repl.MdocSession$MdocApp17$$anonfun$55$$anonfun$apply$43.apply(cookbook.md:320)
// at repl.MdocSession$MdocApp17$$anonfun$55$$anonfun$apply$43.apply(cookbook.md:320)
// at chisel3.Module$.evaluate(Module.scala:92)
// at chisel3.Module$.do_apply(Module.scala:35)
// at chisel3.stage.phases.Elaborate.$anonfun$transform$2(Elaborate.scala:53)
// at chisel3.internal.Builder$.$anonfun$buildImpl$1(Builder.scala:1025)
// at scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
// at chisel3.internal.Builder$.buildImpl(Builder.scala:1019)
// at chisel3.internal.Builder$.$anonfun$build$1(Builder.scala:1011)
// at logger.Logger$.$anonfun$makeScope$4(Logger.scala:148)
// at scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
// at logger.Logger$.makeScope(Logger.scala:146)
// at logger.Logger$.makeScope(Logger.scala:133)
// at ... ()
// at ... (Stack trace trimmed to user code only. Rerun with --full-stacktrace to see the full stack trace)
我自己的通俗理解
1)你不确定这里的val是输入还是输出。
chisel 编程注意事项 - 为什么 Chisel 需要独立实例:
在 Chisel 中,每个 Data 实例代表一个可以独立控制和观察的硬件信号。当两个字段是独立的 Data 实例时,Chisel 可以确保它们在硬件中是独立的,可以被分别驱动和观察。
**独立控制:**每台饮水机可以独立打开或关闭,控制水流的大小。
**独立观察:**可以独立观察每台饮水机的出水情况,以便于调试和测试。