当我现在学习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接口来解决:
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接口还是用错了?
(2) x的值会随着io.in信号的变化而变化,为什么x会被视为未使用的部分,而编译器又会将其视为死码?
发布于 2018-03-14 00:05:27
我认为你在这里的期望是正确的。我相信这是一个版本/发布的问题。当我运行你的代码时,我看到
======== Starting Transform DeadCodeElimination ========
[DCE] reg DontTouch.y
--------------------------------------------------------最近有很多关于DontTouch的工作。我会深入挖掘一下,看看我是否能找出这个问题已经解决的地方。
https://stackoverflow.com/questions/49257904
复制相似问题