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,而不是哈希码。
实际上,数据类型扩展了具有HasId
字段的_id
特征,并且
_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(_)?")
数据中存在toString
方法,而不是toNamed
。但是,似乎已调用此方法来生成firrtl代码,而不是将组件转换为字符串。
为什么数据类型可以显示其ID?
如果不是ID,而是确切的哈希码,那么这个问题是我的误解。
答案 0 :(得分:2)
我认为您应该看看Chisel PR #985。它更改了Data的toString方法的实现方式。我不确定它是否可以直接回答您的问题,但是有可能使错误的含义和位置更加清晰。如果没有,您应该对此发表评论。
答案 1 :(得分:1)
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
中有更多有用的信息!