2017-12-19 4 views
1

いくつかの簡単な算術を行い、いくつかのパラメータによって制御されるモジュールを考えてみましょう。 1つのパラメータが最上位レベルの動作を制御します。モジュールはモジュールポートから入力を読み込むか、他のパラメータから読み込みます。したがって、結果は動的に計算されるか、コンパイル(咳、合成)時間に静的に知られます。チゼル/ FIRRTL定数伝搬と階層全体の最適化

Chiselによって生成されたVerilogは、このモジュールのさまざまな味のために、予想通りに異なるモジュール名を持っています。結果が静的にわかっている場合は、出力ポートが1つだけのモジュールと内部配線のセットに定数が割り当てられ、その出力を駆動するための算術演算が実装されます。

ChiselまたはFIRRTLに、これをさらに完全に最適化するよう依頼することは可能ですか?つまり、次の階層レベルでは、インスタンス化されたモジュールを定数および静的に既知の結果に置き換えますか? (これらの定数値は合成中に最適化されるべきだが、複雑なユースケースがあり、この種の精緻化時間最適化が有用であるかもしれない)。

答えて

2

Firrtlが現在どのように伝播定数を知っているかについては、実際にはこれが実際に実行されます。問題は、現在はconst算術演算子をconstしていないということです。私は新年のまわりで期待されている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 
関連する問題