【问题标题】:What mechanism works to show component ID in chisel3 elaboration什么机制可以在 chisel3 详细说明中显示组件 ID
【发布时间】:2019-01-23 02:15:53
【问题描述】:

Chisel 引发异常,并带有详细说明错误消息。下面以我的代码结果为例。

chisel3.core.Binding$ExpectedHardwareException: data to be connected 'chisel3.core.Bool@81' must be hardware, not a bare Chisel type. Perhaps you forgot to wrap it in Wire(_) or IO(_)?

这个异常消息很有趣,因为81 后面的chisel3.core.Bool@ 看起来像ID,而不是哈希码。 实际上,数据类型扩展了具有_id 字段的HasId 特征,并且 _id 字段似乎为每个组件生成了一个唯一的 ID。

我认为数据类型会覆盖toString 以生成具有type@ID 的字符串,但它不会覆盖。这就是为什么下面代码中的$node 不能使用ID。

throw Binding.ExpectedHardwareException(s"$prefix'$node' must be hardware, " +
            "not a bare Chisel type. Perhaps you forgot to wrap it in Wire(_) or IO(_)?")

Data 中存在 toNamed 方法而不是 toString。但是,调用此方法似乎是为了生成 firrtl 代码,而不是将组件转换为字符串。

为什么Data type可以显示它的ID?

如果不是ID,而是hashcode,这个问题是我的误解。

【问题讨论】:

    标签: chisel


    【解决方案1】:

    我认为你应该看看Chisel PR #985。它改变了 Data 的 toString 方法的实现方式。我不确定它是否直接回答了您的问题,但这可能会使错误的含义和位置更清楚。如果不是,您应该对此发表评论。

    【讨论】:

      【解决方案2】:

      Scala 类带有一个默认的 toString 方法,其形式为 className@hashCode

      正如您所指出的,chisel3.core.Bool@81 确实看起来像是在使用_id 而不是hashCode。这是因为在最近发布的 Chisel (3.1.6) 版本中,哈希码是 id!如果您检查该版本标记处的源文件,您可以看到这一点:https://github.com/freechipsproject/chisel3/blob/dc4200f8b622e637ec170dc0728c7887a7dbc566/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala#L81

      master 不再是这种情况,这可能是任何混乱的根源!正如 Chick 所说,我们刚刚更改了 .toString 方法,使其比默认方法提供更多信息;期待3.2.0 中提供更多信息!

      【讨论】:

      • 在阅读了您的问题后,我注意到我从 github 克隆的 chisel3 版本和 chisel-template 下载的 sbt 之间的版本可能不同。正如您所指出的,阅读master 分支源代码是混淆的根源。确实,在master 分支源代码中,hashCode 方法仍然是override def hashCode: Int = super.hashCode()。谢谢。
      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      相关资源
      最近更新 更多