【问题标题】:Chisel/FIRRTL constant propagation & optimization across hierarchy跨层次结构的 Chisel/FIRRTL 常量传播和优化
【发布时间】:2017-12-19 19:13:19
【问题描述】:

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

正如预期的那样,Chisel 生成的 Verilog 对该模块的各种风格具有不同的模块名称。对于静态已知结果的情况,有一个模块只有一个输出端口和一组内部连线,这些连线被分配了常数,然后执行算法来驱动该输出。

是否可以要求 Chisel 或 FIRRTL 更进一步并完全优化它,即在上一级​​层次结构中,只需将实例化模块替换为其恒定且静态已知的结果? (当然,这些常数值应该在综合过程中优化掉,但也许在复杂的用例中这种精化时间优化可能有用)。

【问题讨论】:

    标签: chisel


    【解决方案1】:

    对于 Firrtl 目前知道如何持续传播的简单事情,它实际上已经这样做了。问题是它目前不支持算术运算符。我计划在预计在新年前后发布的 Chisel 3.1 版本中扩展可以持续传播的运算符。

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多