怀疑Chisel dontTouch API和FIRRTL优化

时间:2018-03-13 13:49:24

标签: scala chisel

目前我学习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被视为不使用部分然后编译器将其视为死代码?

1 个答案:

答案 0 :(得分:1)

我认为你的期望是正确的。 我相信这是一个版本/发布问题。当我运行你的代码时,我看到了

======== Starting Transform DeadCodeElimination ========
[DCE] reg DontTouch.y
--------------------------------------------------------

最近有很多关于DontTouch的工作。我会深入挖掘一下,看看能不知道修复的地方。