目前我学习Chisel时有些疑惑。
似乎FIRRTL会做一些优化来生成verilog代码。
我写了一个例子,然后去运行它。
但我发现了一些问题。
我的示例代码(我只是将它用于实验,因此可能很奇怪):
class Example extends Module {
val io = IO(new Bundle {
val in = Input(UInt(16.W))
})
val x = RegInit(0.U(16.W))
val y = RegInit(0.U(16.W))
x := io.in
y := x
}
生成fir文件后,我运行FIRRTL编译器,看它是否会导致死代码消除。
======== Starting Transform DeadCodeElimination ========
[DCE] reg Example.x
[DCE] reg Example.y
我发现可以使用dontTouch API解决它:
class Example extends Module {
val io = IO(new Bundle {
val in = Input(UInt(16.W))
})
val x = RegInit(0.U(16.W))
val y = RegInit(0.U(16.W))
x := io.in
dontTouch(x)
y := x
}
我用上面的相同流程结帐。它仍然得到相同的结果:
======== Starting Transform DeadCodeElimination ========
[DCE] reg Example.x
[DCE] reg Example.y
问题:
(1)我是否误解了dontTouch API或者我以错误的方式使用它?
(2)x值会随io.in信号而变化,为什么x被视为不使用部分然后编译器将其视为死代码?
答案 0 :(得分:1)
我认为你的期望是正确的。 我相信这是一个版本/发布问题。当我运行你的代码时,我看到了
======== Starting Transform DeadCodeElimination ========
[DCE] reg DontTouch.y
--------------------------------------------------------
最近有很多关于DontTouch的工作。我会深入挖掘一下,看看能不知道修复的地方。