错误 "Combinational loop detected"

False "Combinational loop detected"

当我将一个复杂的 Record(基于键值对的 Bundle)作为 UInt 传递并使用 asUInt() 和 asTypeOf(...) .

不经过UInt转换步骤直接连接两个Records时,没有出现CombLoopException。我花了好几天时间 solve/reproduce 试图解决这个问题。这就是为什么我很确定不应该有 CombLoopException。

不幸的是,我无法提供任何小代码片段来重现错误,因为我正在对 Rocket Chip Generator 进行自定义修改,而问题仅发生在对 Bundle 进行复杂修改时。

我的问题:如何使用“--no-check-comb-loops”选项来避免 CombLoopException? 有没有办法在 build.sbt?

中添加此选项

如果需要,我还想对这个特殊情况进行详细描述,以帮助解决这个罕见的问题:

这显然取决于您的具体代码,但我仍然建议尽量避免创建错误的组合循环。这很可能是一个错误循环,但像 Verilator 这样的工具也可能会遇到它。

也就是说,您可以通过将 --no-check-comb-loops 传递给编译的 FIRRTL 步骤(也称为 Verilog-generation 步骤)来禁用检查。在rocket-chip中,这取决于你在哪个模拟目录,但在vsim中是here, in emulator it is here