Chisel 中的条件模块实例化

Conditional Module instantiation in Chisel

我正在尝试根据布尔参数实例化两个凿子模块之一。

val useLib = true
val myModule = if(useLib) Module(new MyModule1()) else Module (new MyModule2())

但这不起作用。 Chisel 无法识别 io 接口:

[error] /path/to/source/mysource.scala:59:13: value io is not a member of Any
[error]   myModule.io.pdm <> io.pdm
[error]            ^

当然,MyModule1()MyModule2() 具有相同的 io 接口。

是否可以像在 C 或 C++ 中使用预处理器那样有条件地实例化 Module()?

我写了一篇关于从 Chisel 3.4 升级到 3.5 的新文档来解决这个问题。它尚未在网站上上线,但一旦 Chisel 3.5.0-RC2 发布就会上线。这是文档的 link:https://gist.github.com/jackkoenig/4949f6a455ae74923bbcce10dbf846b5#value-io-is-not-a-member-of-chisel3module

在某种程度上,从Scala的角度来看,MyModule1MyModule2实际上不是具有相同的接口,尽管它们在结构上是相同的。诀窍是将该接口分解为一个命名的 Bundle class ,然后在每个模块中使用它。然后让每个 Module 扩展一个具有该接口的 trait,然后 Scala 就会知道接口是相同的。

有关更多信息和示例,请参阅上面的 linked 文档。