凿子/ FIRRTL恒定传播&跨层次优化

时间:2017-12-19 19:13:20

标签: chisel

考虑一个执行一些简单算术的模块,并由一些参数控制。一个参数控制顶级行为:模块从其模块端口或其他参数读取其输入。因此,结果将被动态计算,或在编译(咳嗽,合成)时静态知道。

Chisel生成的Verilog对于此模块的各种风格具有不同的模块名称,如预期的那样。对于静态已知结果的情况,有一个模块只有一个输出端口和一组内部连线,它们被赋予常量,然后实现算法来驱动该输出。

是否有可能要求Chisel或FIRRTL进一步完全优化它,即在下一级层次结构中,只需用实例和静态已知结果替换实例化模块? (授予这些常数值应该在综合过程中优化掉,但也许有复杂的用例,这种精化时间优化可能很有用)。

1 个答案:

答案 0 :(得分:2)

对于Firrtl目前知道如何不断传播的简单事物,它实际上已经做到了这一点。问题是它目前不支持算术运算符。我计划扩展在新年期间预期的Chisel 3.1版本中可以不断传播的操作符。

以下是3.0行为常量传播逻辑AND和MUX的示例。

import chisel3._

class OptChild extends Module {
  val io = IO(new Bundle {
    val a = Input(UInt(32.W))
    val b = Input(UInt(32.W))
    val s = Input(Bool())
    val z = Output(UInt(32.W))
  })

  when (io.s) {
    io.z := io.a & "hffff0000".U
  } .otherwise {
    io.z := io.b & "h0000ffff".U
  }
}

class Optimize extends Module {
  val io = IO(new Bundle {
    val out = Output(UInt())
  })
  val child = Module(new OptChild)
  child.io.a := "hdeadbeef".U
  child.io.b := "hbadcad00".U
  child.io.s := true.B
  io.out := child.io.z

}

object OptimizeTop extends App {
  chisel3.Driver.execute(args, () => new Optimize)
}

发出的Verilog看起来像:

module Optimize(
  input         clock,
  input         reset,
  output [31:0] io_out
);
  assign io_out = 32'hdead0000;
endmodule